Ik leer assemblage door een c-programma te vergelijken met zijn assemblage-equivalent.
Hier is de code.
.file "ex3.c"
.section .rodata
.LC0:
.string "I am %d years old.\n"
.LC1:
.string "I am %d inches tall.\n"
.text
.globl main
.type main, @function
main:
pushl %ebp //establish stack frame//
movl %esp, %ebp //move esp into ebp, all contents saved down stack//
andl $-16, %esp //16 from esp for local var space//
subl $32, %esp//stack frame reserving - 32 bytes//
movl $10, 24(%esp)
movl $72, 28(%esp)
movl 24(%esp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call printf
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits
Voor deze regel:
movl $10, 24(%esp)
Als ik het goed begrijp, staat er dat de waarde van 10 naar het esp-register moet worden verplaatst. Maar wat doet de 24? Ik denk niet dat het naar esp is verplaatst omdat een te verplaatsen waarde wordt aangegeven met “$” (denk ik)
Antwoord 1, autoriteit 100%
movl $10,24(%esp)
betekent: verplaats een letterlijk decimaal-10 (4-bytes) naar een 4-byte geheugenlocatie die begint op het adres waarnaar wordt verwezen door (het esp
register plus decimaal 24) – in feite het is een lokale variabele.
Antwoord 2, autoriteit 92%
Met andere woorden movl $10,24(%esp)
betekent: laad 10
in *(esp + 24)
In C is dat gelijk aan:
*(unsigned long *)(myptr + 24) = 10;
Waar myptr
wordt genomen met de waarde van esp
Registreer.