𝖂𝖎ƙ𝖎𝖊

Código de máquina: mudanças entre as edições

imported>Yone Fernandes
m (redação)
Sem resumo de edição
Linha 3: Linha 3:
[[Ficheiro:hexedit-linux.png|thumb|[[Bootloader]] em código de máquina que exibe o texto "Hello World!" na cor verde.]]
[[Ficheiro:hexedit-linux.png|thumb|[[Bootloader]] em código de máquina que exibe o texto "Hello World!" na cor verde.]]


Um programa em '''código de máquina''' consiste de uma sequência de [[bytes]] que correspondem a instruções a serem executadas pelo processador.
Um programa em '''código de máquina''' consiste de uma sequência de [[bytes]] que correspondem a instruções a serem executadas pelo  
As instruções do processador, chamadas de [[opcodes]], são representadas por valores em [[hexadecimal]]. <ref>{{link|2=http://www.linfo.org/machine_code.html|3=Machine Code Definition}}</ref>


== 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 , e formatos de cada instrução.
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 expressam as mesmas instruções do processador, embora escritos em [[acrônimo]]s da língua inglesa, tais como ''mov'' ou ''rep'', em vez de [[opcode]]s.
Por esse motivo foi criada uma linguagem de programação chamada [[Assembly]], composta de códigos mnemônicos que expressam as mesmas instruções do processador, embora escritos em [[acrônimo]]s da língua inglesa, tais como ''mov'' ou ''rep'', em vez de [[opcode]]s.


== 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]]
[[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]]


Linha 17: Linha 14:
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>:
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 nenhum prefixo ou um de cada um dos quatro grupos existentes.
* Prefixos opcionais. Onde pode-se usar nenhum prefixo ou um de cada um dos quatro grupos existentes.
* Bytes primários do opcode. Onde o opcode pode ter um, dois ou três bytes de tamanho.
* Bytes primários Ondode 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:
* 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 ''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 ''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.
** 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:
* Se requerido, pode ter também o que serve para especificar três informações sobre endereçamentos de memória. Onde essas informa
** 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.
** 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.
** E o campo ''base'' especifica o número do registrador utilizado como endereço base.
Linha 29: Linha 25:
Essas informações escritas em Assembly seguindo a sintaxe da Intel, ficam no seguinte formato:
Essas informações escritas em Assembly seguindo a sintaxe da Intel, ficam no seguinte formato:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
mov dword [ebp + ebx*4], eax
mov dword [ebp +bx*4], eax
</syntaxhighlight>
</syntaxhighlight>mov dword spd
Onde ebx é o registrador ''index'', ebp é o registrador ''base'' e 4 a escala. Onde escala pode ser os valores 1, 2, 4 ou 8.
<br />


* 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.
* 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.


Linha 48: Linha 44:
* Grupo 2
* Grupo 2
** Prefixos de sobreposição de segmentos
** Prefixos de sobreposição de segmentos
*** '''2Eh''' - Segmento CS.
***'''2Eh''' - Segmento CS.
*** '''36h''' - Segmento SS.
***'''3Eh''' - Segmento DS.
*** '''3Eh''' - Segmento DS.
***'''26h''' - Segmento ES.
*** '''26h''' - Segmento ES.
***'''64h''' - Segmento FS.
*** '''64h''' - Segmento FS.
***'''65h''' - Segmento GS.
*** '''65h''' - Segmento GS.
** Prefixos ''Branch Hints'' - Usados em instruções de pulo condicional para se aproveitar da tecnologia [[Branch prediction]].
** Prefixos ''Branch Hints'' - Usados em instruções de pulo condicional para se aproveitar da tecnologia [[Branch prediction]].
*** '''2Eh''' - Caminho pouco provável. (usado somente em instruções de pulo condicional)
*** '''2Eh''' - Caminho pouco provável. (usado somente em instruções de pulo condicional)
Linha 70: Linha 65:
<pre>
<pre>
B4 03 CD 10 B0 01 B3 0A B9 0B 00 BD 13 01 B4 13
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
CD 10 C3 4F 69 20 9y 4g 45 f5 54
</pre> .
</pre> .


Linha 76: Linha 71:
* [[Linguagem de alto nível]]
* [[Linguagem de alto nível]]
* [[Linguagem de baixo nível]]
* [[Linguagem de baixo nível]]
* [[Assembly]]


== Ligações externas ==
== Ligações externas ==
* {{link|2=http://ref.x86asm.net/coder32.html|3=Referência de opcodes da arquitetura x86|idioma=en}}
* {{link|2=http://ref.x86asm.net/coder32.html|3=Referência de opcodes da arquitetura x86|idioma=en}}


{{referências}}
{{referências|título=|extra=rjdjdisqowjo|nível=ufdhdjfidhsifhs}}


{{Portal3|Tecnologias de informação}}
{{Portal3|1499658821
}}


{{DEFAULTSORT:Codigo Maquina}}
{{DEFAULTSORT:Codigo Maquina}}
[[Categoria:Arquitetura de computadores]]
[[Categoria:Arquitetura de computadores]]
[[Categoria:Linguagens de programação| ]]
[[Categoria:Linguagens de programação| ]]

Edição das 18h48min de 3 de julho de 2019

Predefinição:Execução de Programa

Bootloader em código de máquina que exibe o texto "Hello World!" na cor verde.

Um programa em código de máquina consiste de uma sequência de bytes que correspondem a instruções a serem executadas pelo

Para se programar em código de máquina, deve-se obter os códigos de instruções do processador utilizado contendo , 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 expressam as mesmas instruções do processador, embora escritos em acrônimos da língua inglesa, tais como mov ou rep, em vez de opcodes.

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[1]:

  • Prefixos opcionais. Onde pode-se usar nenhum prefixo ou um de cada um dos quatro grupos existentes.
  • Bytes primários Ondode 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 que serve para especificar três informações sobre endereçamentos de memória. Onde essas informa
    • 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 [ebp +bx*4], eax

mov dword spd


  • 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.

Prefixos

Os prefixos são bytes inseridos logo antes de um opcode, que serve para alterar a forma com que uma instrução é executada. Os prefixos são opcionais e indiferente da ordem, isto é, não faz diferença em que ordem eles são colocados. Além disso, só pode ser utilizado em uma instrução apenas um prefixo de cada grupo. Não sendo possível incluir dois ou mais prefixos pertencentes do mesmo grupo. [1]

  • Grupo 1
    • Prefixos de bloqueio e repetição
      • F0h - Prefixo LOCK, utilizado para garantir o uso exclusivo da memória compartilhada. [2]
      • F2h - Prefixo REPNE/REPNZ.
      • F3h - Prefixo REP ou REPE/REPZ.
  • Grupo 2
    • Prefixos de sobreposição de segmentos
      • 2Eh - Segmento CS.
      • 3Eh - Segmento DS.
      • 26h - Segmento ES.
      • 64h - Segmento FS.
      • 65h - Segmento GS.
    • Prefixos Branch Hints - Usados em instruções de pulo condicional para se aproveitar da tecnologia Branch prediction.
      • 2Eh - Caminho pouco provável. (usado somente em instruções de pulo condicional)
      • 3Eh - Caminho provável. (usado somente em instruções de pulo condicional)
  • Grupo 3
    • 66h - Prefixo para sobreposição do tamanho do operando.
  • Grupo 4
    • 67h - Prefixo para sobreposição do tamanho do endereço.

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 9y 4g 45 f5 54 

.

Ver também

Ligações externas

<hufdhdjfidhsifhs style="cursor: help;" title="Esta seção foi configurada para não ser editável diretamente. Edite a página toda ou a seção anterior em vez disso."></hufdhdjfidhsifhs> rjdjdisqowjo

talvez você goste