Casa > W > What Does Assembly Language Look Like?

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:

  1. int sum(int a, int b) { 
  2. return a+b; 
  3.  
  4. int main() { 
  5. int s = sum(2,3); 
  6. 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:

  1. clang -o add add.c #Take C program "add.c", compile it to executable "add". (gcc -o add add.c will work too) 
  2.  
  3. otool -tV add #get disassembly (objdump on Linux works similarly) 

Here’s what I get:

  1. add: 
  2. (__TEXT,__text) section 
  3. _sum: 
  4. 0000000100000f60 pushq %rbp 
  5. 0000000100000f61 movq %rsp, %rbp 
  6. 0000000100000f64 movl %edi, -0x4(%rbp) 
  7. 0000000100000f67 movl %esi, -0x8(%rbp) 
  8. 0000000100000f6a movl -0x4(%rbp), %esi 
  9. 0000000100000f6d addl -0x8(%rbp), %esi 
  10. 0000000100000f70 movl %esi, %eax 
  11. 0000000100000f72 popq %rbp 
  12. 0000000100000f73 retq 
  13. 0000000100000f74 nopw %cs:(%rax,%rax) 
  14. _main: 
  15. 0000000100000f80 pushq %rbp 
  16. 0000000100000f81 movq %rsp, %rbp 
  17. 0000000100000f84 subq $0x10, %rsp 
  18. 0000000100000f88 movl $0x2, %edi 
  19. 0000000100000f8d movl $0x3, %esi 
  20. 0000000100000f92 movl $0x0, -0x4(%rbp) 
  21. 0000000100000f99 callq _sum 
  22. 0000000100000f9e xorl %esi, %esi 
  23. 0000000100000fa0 movl %eax, -0x8(%rbp) 
  24. 0000000100000fa3 movl %esi, %eax 
  25. 0000000100000fa5 addq $0x10, %rsp 
  26. 0000000100000fa9 popq %rbp 
  27. 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.

De Colston

Como fazer um foguete que irá para o espaço e posso construir o foguete em minha casa :: Como pular atualizações do Android em um celular