Arquitetura do Conjunto de Instruções (ISA) - Exemplo em Assembly x86 (PC)

Meu ex-aluno Charles Cavalcante contribuiu com o material a seguir na aula de Arquitetura do Conjunto de Instruções  (ISA), ilustrando os tipos de instrução, formatos, número de endereços e modos de endereçamento através da compilação de um programa em C++, mostrando o resultado assembly x86 (PC).

"O Visual Studio tem a opção de mostrar o código assembly quando você depura o programa, vejam um exemplo com operações aritméticas ao depurar um programa em C++, em preto a linha de comando em C e na sequência o assembly gerado para cada linha, em vermelho o endereço da memória da instrução do programa, em azul o comando assembly [mnemônico] e em verde os parâmetros [operandos] de cada comando."

Observações:

  • Note os diversos tipos de instruções e operandos que aparecem.
  • Note que o assembly x86 utiliza instruções de 0, 1 e 2 endereços (operandos explícitos). Todas essas combinações aparecem nesse trecho de código.
  • Note que no assembly gerado aparecem diretivas de assembler, isto é, comandos passados ao montador.

int x = 4;

00242DBE 

mov         

dword ptr [x], 4

int y = 2;

00242DC5 

mov         

dword ptr [y], 2

int a = x + y;

00242DCC 

mov         

eax, dword ptr [x]

00242DCF 

add         

eax, dword ptr [y]

00242DD2 

mov         

dword ptr [a], eax

int b = x - y;

00242DD5 

mov         

eax, dword ptr [x]

00242DD8 

sub         

eax, dword ptr [y]

00242DDB 

mov         

dword ptr [b], eax

int c = x * y;

00242DDE 

mov         

eax, dword ptr [x]

00242DE1 

imul        

eax, dword ptr [y]

00242DE5 

mov         

dword ptr [c], eax

int d = x / y;

00242DE8 

mov         

eax, dword ptr [x]

00242DEB 

cdq             

00242DEC 

idiv        

eax, dword ptr [y]

00242DEF 

mov         

dword ptr [d], eax

printf("a=%d, b=%d, c=%d, d=%d", a, b, c, d);

00242DF2 

mov         

esi, esp

00242DF4 

mov         

eax, dword ptr [d]

00242DF7 

push        

eax 

00242DF8 

mov         

ecx, dword ptr [c]

00242DFB 

push        

ecx 

00242DFC 

mov         

edx, dword ptr [b]

00242DFF 

push        

edx 

00242E00

mov         

eax, dword ptr [a]

00242E03

push        

eax 

00242E04

push        

offset string "a=%d, b=%d, c=%d, d=%d" (2457A0h)

00242E09

call        

dword ptr [__imp__printf (2482B4h)]

00242E0F 

add         

esp, 14h

00242E12

cmp         

esi, esp

00242E14

call        

@ILT+450(__RTC_CheckEsp) (2411C7h)