QNA > 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. Cosa sta succedendo qui?

Beh, un processo (in Linux / OS X) ha un sacco di struttura. Se volete saperne di più, guardate alcune diapositive che ho fatto per un tutorial di reverse engineering che ho fatto; dovete leggere un sacco di assembly per fare reverse engineering: Stack Smashing 101 by chrislambda

La prima colonna è solo la posizione del codice in hex. La colonna centrale è il comando, e la colonna di destra sono gli argomenti di quel comando. Quindi "pushq %rbp" significa "spingere il valore quad-word del puntatore di base (RBP) sullo stack".

Può essere difficile da leggere all'inizio, ma ci si può abituare col tempo. Probabilmente potete già vedere che nelle linee 18-19, i numeri 2 e 3 vengono memorizzati, e nella linea 21, vedete che viene chiamata la funzione "sum". Nella linea 9, potete vedere che viene chiamata l'istruzione "addl".

Di Stan

Come è ToppScholars app di apprendimento? :: Come suonare una chitarra senza plettro
Link utili