imported>Mr. Fulano m (Foram revertidas as edições de 179.198.141.132 para a última revisão de Mr. Fulano, de 22h29min de 1 de fevereiro de 2018 (UTC)) |
imported>LF337 (Incluir informações sobre o formato das instruções) |
||
Linha 9: | Linha 9: | ||
Por esse motivo foi criada uma linguagem de programação chamada [[Assembly]], composta de códigos mnemônicos que se trata das mesmas instruções do processador. Porém escritos em acrônimos da língua inglesa, como ''mov'' ou ''rep'', ao invés de opcodes. | Por esse motivo foi criada uma linguagem de programação chamada [[Assembly]], composta de códigos mnemônicos que se trata das mesmas instruções do processador. Porém escritos em acrônimos da língua inglesa, como ''mov'' ou ''rep'', ao invés de opcodes. | ||
== Formato da instrução == | |||
[[Ficheiro:Figura 2.1 Manual da Intel Para Desenvolvedores Volume 2A.png|thumb|Figura 2.1 do Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 2A]] | |||
Uma instrução em código de máquina consiste em uma sequência de bytes, onde cada byte significa algo para o processador. | |||
Instruções da arquitetura [[IA-32]] são consistidas por<ref name="vol2A-pagina35">{{citar livro |url=https://www.intel.com.br/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf |lingua=en |pagina=35 |titulo=Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 2A}}</ref>: | |||
* Prefixos opcionais. Onde pode-se usar um, dois ou nenhum prefixo. | |||
* Bytes primários do opcode. Onde o opcode pode ter um, dois ou três bytes de tamanho. | |||
* Se requerido, também pode ter o byte ModR/M. Esse byte consiste em três campos de informações: | |||
** O campo ''mod'' que combinado com o campo R/M pode formar 32 valores diferentes: Oito registradores e 24 modos de endereçamento. | |||
** O campo ''reg/opcode'' especifica o número do registrador ou mais três bits de informação do opcode. O propósito desse campo é especificado no opcode primário. | |||
** O campo ''R/M'', que pode ser usado para um registrador como operando ou pode ser combinado com o campo ''mod'' para especificar um modo de endereçamento. | |||
* Se requerido, pode ter também o byte SIB que serve para especificar três informações sobre endereçamentos de memória. Onde essas informações ficam nos seguintes campos: | |||
** O campo ''scale'' serve para especificar uma escala de endereçamento. | |||
** O campo ''index'' especifica o número do registrador utilizado como índice de acesso ao endereço. | |||
** E o campo ''base'' especifica o número do registrador utilizado como endereço base. | |||
Essas informações escritas em Assembly seguindo a sintaxe da Intel, ficam no seguinte formato: ''mov dword [ebx + ebp*4], eax''<br> | |||
Onde ebx é o registrador ''index'', ebp é o registrador ''base'' e 4 a escala. | |||
* Algumas formas de endereçamento precisam de um deslocamento imediato que fica logo após o byte ModR/M, ou o byte SIB se estiver presente. Caso um deslocamento imediato seja necessário, este pode ter um tamanho de um, dois ou quatro bytes. | |||
* Se uma instrução especifica um operando imediato, o operando fica após todos os bytes de deslocamento. E pode ter o tamanho de um, dois ou quatro bytes. | |||
== Visualização de programas em linguagem de máquina == | == Visualização de programas em linguagem de máquina == |
Edição das 21h34min de 14 de março de 2018
Um programa em código de máquina consiste de uma sequência de bytes que se tratam de instruções a serem executadas pelo processador. As instruções do processador, chamadas de opcodes, são representadas por valores em hexadecimal. [1]
Programação em código de máquina
Para se programar em código de máquina, deve-se obter os códigos de instruções do processador utilizado contendo opcodes, operandos e formatos de cada instrução.
Por esse motivo foi criada uma linguagem de programação chamada Assembly, composta de códigos mnemônicos que se trata das mesmas instruções do processador. Porém escritos em acrônimos da língua inglesa, como mov ou rep, ao invés de opcodes.
Formato da instrução
Uma instrução em código de máquina consiste em uma sequência de bytes, onde cada byte significa algo para o processador. Instruções da arquitetura IA-32 são consistidas por[2]:
- Prefixos opcionais. Onde pode-se usar um, dois ou nenhum prefixo.
- Bytes primários do opcode. Onde o opcode pode ter um, dois ou três bytes de tamanho.
- Se requerido, também pode ter o byte ModR/M. Esse byte consiste em três campos de informações:
- O campo mod que combinado com o campo R/M pode formar 32 valores diferentes: Oito registradores e 24 modos de endereçamento.
- O campo reg/opcode especifica o número do registrador ou mais três bits de informação do opcode. O propósito desse campo é especificado no opcode primário.
- O campo R/M, que pode ser usado para um registrador como operando ou pode ser combinado com o campo mod para especificar um modo de endereçamento.
- Se requerido, pode ter também o byte SIB que serve para especificar três informações sobre endereçamentos de memória. Onde essas informações ficam nos seguintes campos:
- O campo scale serve para especificar uma escala de endereçamento.
- O campo index especifica o número do registrador utilizado como índice de acesso ao endereço.
- E o campo base especifica o número do registrador utilizado como endereço base.
Essas informações escritas em Assembly seguindo a sintaxe da Intel, ficam no seguinte formato: mov dword [ebx + ebp*4], eax
Onde ebx é o registrador index, ebp é o registrador base e 4 a escala.
- Algumas formas de endereçamento precisam de um deslocamento imediato que fica logo após o byte ModR/M, ou o byte SIB se estiver presente. Caso um deslocamento imediato seja necessário, este pode ter um tamanho de um, dois ou quatro bytes.
- Se uma instrução especifica um operando imediato, o operando fica após todos os bytes de deslocamento. E pode ter o tamanho de um, dois ou quatro bytes.
Visualização de programas em linguagem de máquina
Um programa em código de máquina é um arquivo binário. Como tal, não pode ser visualizado em um editor de texto.
Pode-se editar o código de máquina usando editores hexadecimais, que irão exibir o código de máquina como uma sequência de bytes em hexadecimal.
Exemplo de programa "Olá Mundo" para MS-DOS
B4 03 CD 10 B0 01 B3 0A B9 0B 00 BD 13 01 B4 13 CD 10 C3 4F 69 20 6D 75 6E 64 6F 21 0D 0A
Ver também
Ligações externas
- «Referência de opcodes da arquitetura x86» (em English)
Referências
- ↑ «Machine Code Definition»
- ↑ Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 2A (PDF) (em English). [S.l.: s.n.] p. 35