Saltar para o conteúdo

Linguagem assembly: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
Etiqueta: Ligações internas removidas
Linha 103: Linha 103:
7C90EC5F call 7C90EBAC
7C90EC5F call 7C90EBAC
</pre>
</pre>
Nepia !

===Microprocessador Texas Instruments TMS320C2x===
===Microprocessador Texas Instruments TMS320C2x===
<pre>
<pre>

Revisão das 12h20min de 23 de fevereiro de 2011

Nota: Se você procura pelo álbum da banda norueguesa de Gothic Metal Theatre of Tragedy, procure por Assembly (álbum)

Assembly ou linguagem de montagem é uma notação legível por humanos para o código de máquina que uma arquitetura de computador específica usa. A linguagem de máquina, que é um mero padrão de bits, torna-se legível pela substituição dos valores em bruto por símbolos chamados mnemónicos.

Por exemplo, enquanto um computador sabe o que a instrução-máquina IA-21 (10110000 01100001) faz, para os programadores é mais fácil recordar a representação equivalente em instruções mnemónicas MOV AL, 61h. Tal instrução ordena que o valor hexadecimal 61 (97, em decimal) seja movido para o registrador 'AL'.

Flavio e bot


Cada arquitetura de computador tem a sua própria linguagem de máquina e, portanto, a sua própria linguagem de montagem. Essas linguagens de montagem diferem no número e tipo de operações que suportam. Também têm diferentes tamanhos e números de registos, e diferentes representações dos tipos de dados armazenados. Enquanto todos os computadores de utilização genérica são capazes de desempenhar essencialmente as mesmas funções, o modo como o fazem é diferente.

Além disso, podem existir conjuntos múltiplos de mnemónicas, ou sintaxes de linguagem de montagem, para um único conjunto de instruções. Nestes casos, o conjunto mais popular é aquele que é utilizado pelo fabricante na sua documentação.

A maioria dos processadores só consegue manipular os dados que estão em registradores e a linguagem de montagem facilita o trabalho direto com os registradores.

No mercado de PCs, dominado por processadores Intel e AMD, atualmente existem duas arquiteturas. Primeiro a IA32, criada pela Intel em 1985 e primeiramente utilizada pelo processadores i386 e segundo a IA32-EM64T (ou IA32-AMD64 ) criada em 2002 pela AMD (Mas também utilizada pela Intel hoje). O IA32 utiliza o grupo de instruções chamado x86, e o IA32-EM64T utiliza o grupo chamado x86-64. As duas arquiteturas usam números diferentes de registradores gerais e tamanho. Enquanto os registradores do x86 são 32 bits os da x86-64 são 64 bits.

Os registradores de uso geral da arquitetura x86 são:

  • %EAX - registrador acumulador
  • %EBX - registrador base
  • %ECX - registrador contador
  • %EDX - registrador de dados
  • %ESI - registrador de índice da fonte dos dados
  • %EDI - registrador de índice do destino dos dados
  • %EBP - registrador ponteiro para a moldura de chamada de função
  • %ESP - registrador ponteiro para a pilha de execução

Os registradores de uso geral da arquitetura x86-64 são:

  • %RAX - registrador valor de retorno
  • %RBX - registrador base
  • %RCX - registrador contador
  • %RDX - registrador de dados
  • %RSI - registrador de índice da fonte dos dados
  • %RDI - registrador de índice do destino dos dados
  • %RBP - registrador ponteiro para a moldura de chamada de função
  • %RSP - registrador ponteiro para a pilha de execução
  • %R8 - registrador de dados
  • %R9 - registrador de dados
  • %R10 - registrador ponteiro para a moldura de chamada de função
  • %R11 - registrador de linking
  • %R12 - registrador de base
  • %R13 - registrador de base
  • %R14 - registrador de base
  • %R15 - registrador de base

Esses nomes derivam da forma como eram utilizados nas arquiteturas anteriores a IA32 (8086, 80286…), em que cada registrador desempenhava um papel específico. Na arquitetura i386, todos eles são de uso geral, embora eles continuem a poder ser utilizados em seus papéis tradicionais.

A arquitetura IA32 ainda apresenta os registradores de segmento CS, DS, ES, SS, FS e GS, um contador de programa EIP, um registro de sinalizadores EFLAGS, 8 registradores de vírgula flutuante e seus sinalizadores associados. Existem também registradores utilizados pelo sistema operacional para controle da execução em modo protegido, bem como outros registradores de uso específico (depuração, controle de desempenho, etc.).

Instruções Aritméticas
  • Adição: ADD, ADC, INC, XADD, AAA e DAA;
  • Subtracção: SUB, SBB, DEC, AAS e DAS;
  • Multiplicação: MUL, IMUL e AAM;
  • Divisão: DIV, IDIV e AAD.

Exemplos de código de montagem

Arquitetura Intel

Endereço	OPcode		Operandos

7C90EBAF	pushfd
7C90EBB0	sub		esp, 2D0h
7C90EBB6	mov		dword ptr [ebp+FFFFFDDCh], eax
7C90EBBC	mov		dword ptr [ebp+FFFFFDD8h], ecx
7C90EBC2	mov		eax, dword ptr [ebp+8]
7C90EBC5	mov		ecx, dword ptr [ebp+4]
7C90EBC8	mov		dword ptr [eax+0Ch], ecx
7C90EBCB	lea		eax, [ebp+FFFFFD2Ch]
7C90EBD1	mov		dword ptr [eax+000000B8h], ecx
7C90EBD7	mov		dword ptr [eax+000000A4h], ebx
7C90EBDD	mov		dword ptr [eax+000000A8h], edx
7C90EBE3	mov		dword ptr [eax+000000A0h], esi
7C90EBE9	mov		dword ptr [eax+0000009Ch], edi
7C90EBEF	lea		ecx, [ebp+0Ch]
7C90EBF2	mov		dword ptr [eax+000000C4h], ecx
7C90EBF8	mov		ecx, dword ptr [ebp]
7C90EBFB	mov		dword ptr [eax+000000B4h], ecx
7C90EC01	mov		ecx, dword ptr [ebp-4]
7C90EC04	mov		dword ptr [eax+000000C0h], ecx
7C90EC0A	mov		word ptr [eax+000000BCh], cs
7C90EC10	mov		word ptr [eax+00000098h], ds
7C90EC16	mov		word ptr [eax+00000094h], es
7C90EC1C	mov		word ptr [eax+00000090h], fs
7C90EC22	mov		word ptr [eax+0000008Ch], gs
7C90EC28	mov		word ptr [eax+000000C8h], ss
7C90EC2E	mov		dword ptr [eax], 10007h
7C90EC34	push		1
7C90EC36	push		eax
7C90EC37	push		dword ptr [ebp+8]
7C90EC3A	call		7C90E252
7C90EC3F	sub		esp, 20h
7C90EC42	mov		dword ptr [esp], eax
7C90EC45	mov		dword ptr [esp+4], 1
7C90EC4D	mov		dword ptr [esp+10h], 0
7C90EC55	mov		eax, dword ptr [ebp+8]
7C90EC58	mov		dword ptr [esp+8], eax
7C90EC5C	mov		eax, esp
7C90EC5E	push		eax
7C90EC5F	call		7C90EBAC

Nepia !

Microprocessador Texas Instruments TMS320C2x

LOOP:
	LARP	AR1
	LRLK	AR1, apontador
	ADRK	TAMANHO_CONSTANTE
	ADRK	fimcon_rx
	LAC	*
	BZ	NAOPASSARAM10MS
	ZAC
	SACL	*
	LARP	AR1
	LRLK	AR1,apontador+CONSTANTE_A
	ADRK	controle
	LAC	*
	BZ	LOOP	;Não decorrido tempo: fica no loop

NAOPASSARAM10MS:
	SACL	*
	LARP	AR1
	B	LOOP

Microprocessador Texas Instruments TMS320C5x

LOOP:
	mvmm	ar1, ar3	;move conteúdo de ar1 para ar3
	rpt	#10		;repete
	mvdd	*ar3+, *ar5+	;move word endereçada por ar1 para pos. end. por ar6

;Instruçoes com acumulador:
	STM	#1000h, AR1	;carrega ar1 com a constante 1000h
	LD	#0, A		;zera o acumulador
	STL	A, *AR1		;armazena no acumulador mínimo
	LD	#1, A		;carrega o acumulador com a constante mínima "1"
	STL	A, *AR1		;armazena o acumulador mínimo no endereço de ar1
	LD	#65535, A	;carrega acumulador com a constante "65535"
	STL	A, 10		;armazena o acumulador mínimo no endereço 10
	STH	A, 10		;armazena o acumulador máximo no endereço 10
	STL	A, *AR1		;armazena o acumulador mínimo no endereço de ar1
	STH	A, *AR1		;armazena o acumulador máximo no endereço de ar1

;Instruções com registradores auxiliares:
	STM	#1, AR1		;carrega ar1 com a constante "1"
	STM	#2, AR0		;carrega ar0 com a constante "2"
	MAR	*AR1+0		;adiciona o conteúdo de ar0 to ar appointed by arp (1)
	MVDK	256, *(AR2)     ;carrega ar2 with content of address 256
	MAR	*AR1+		;incrementa ar apontado por arp (1)
	MVKD	*(AR2), 256     ;aloja conteúdo de ar2 no endereço 256
	MAR	*AR1-		;decrementa ar appointed by arp (1)

;Instruções de teste de bit:
	BITF	*AR1, #128	;TESTA BIT D7
	BC	ptr, NTC	;vai para ptr se bit for igual a 0
	MAR	*AR1+		;incrementa ar apontado por arp (1)

ptr:
	MAR	*+AR4(-128)	;sbrk 80h

;Instruções de uso de ponteiros:
	mvdm	*(VETORAL), ar1	;move conteúdo da memória apontada para o ar (transforma arn em ponteiro)
	mvmd	ar1, *(VETORAL)	;mvmd restaura ponteiro(VETORAL) de acordo com arn
	b	LOOP

Ver também

Ligações externas

Ícone de esboço Este artigo sobre programação de computadores é um esboço. Você pode ajudar a Wikipédia expandindo-o.