Linguagem assembly: diferenças entre revisões
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
Este artigo não cita fontes confiáveis. (Junho de 2010) |
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
- Compilador
- Desmontador
- Mnemónico
- Montador
- Linguagens de programação
- Linguagem de baixo nível
- Processador
- Registrador
- Arquitetura SMS - simulador de programação Assembly