What does assembly language look like?
First: you should know there is no single “assembly language”. In theory, there could be a different language per processor type. I’m showing you a very simple example from an x86 processor, running on my MacBook Pro.
Here’s some boring but simple C code:
- int sum(int a, int b) {
- return a+b;
- }
- int main() {
- int s = sum(2,3);
- return 0;
- }
It defines a function that adds two integers, calls it in main (which every C program must have), ignores the value, and main returns 0 (“A-OK”). I compiled this with the clang compiler, and then used otool to dump the assembly. If you’re playing along at home, you can try:
- clang -o add add.c #Take C program "add.c", compile it to executable "add". (gcc -o add add.c will work too)
- otool -tV add #get disassembly (objdump on Linux works similarly)
Here’s what I get:
- add:
- (__TEXT,__text) section
- _sum:
- 0000000100000f60 pushq %rbp
- 0000000100000f61 movq %rsp, %rbp
- 0000000100000f64 movl %edi, -0x4(%rbp)
- 0000000100000f67 movl %esi, -0x8(%rbp)
- 0000000100000f6a movl -0x4(%rbp), %esi
- 0000000100000f6d addl -0x8(%rbp), %esi
- 0000000100000f70 movl %esi, %eax
- 0000000100000f72 popq %rbp
- 0000000100000f73 retq
- 0000000100000f74 nopw %cs:(%rax,%rax)
- _main:
- 0000000100000f80 pushq %rbp
- 0000000100000f81 movq %rsp, %rbp
- 0000000100000f84 subq $0x10, %rsp
- 0000000100000f88 movl $0x2, %edi
- 0000000100000f8d movl $0x3, %esi
- 0000000100000f92 movl $0x0, -0x4(%rbp)
- 0000000100000f99 callq _sum
- 0000000100000f9e xorl %esi, %esi
- 0000000100000fa0 movl %eax, -0x8(%rbp)
- 0000000100000fa3 movl %esi, %eax
- 0000000100000fa5 addq $0x10, %rsp
- 0000000100000fa9 popq %rbp
- 0000000100000faa retq
This is another example of what assembly looks like. O que se passa aqui?
p>Bem, um processo (em Linux / OS X) tem muita estrutura. Se você quiser aprender mais sobre isso, confira alguns slides que eu fiz para um tutorial de engenharia reversa que eu fiz; você tem que ler um monte de assembly para fazer engenharia reversa: Stack Smashing 101 por chrislambda
A primeira coluna é apenas a localização do código em hexadecimal. A coluna do meio é o comando, e a coluna da direita são os argumentos para esse comando. Então "pushq %rbp" significa "empurrar o valor da quad palavra do ponteiro base (RBP) para a pilha".
Pode ser difícil de ler no início, mas você pode se acostumar com o tempo. Você provavelmente já pode ver que nas linhas 18-19, os números 2 e 3 estão sendo armazenados, e na linha 21, você vê que a função "soma" está sendo chamada. Na linha 9, você pode ver a instrução "addl" sendo chamada.