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)
|
|
|
|
|