2014-07-14 12 views
3

J'apprends l'assemblage en comparant un programme c à son équivalent d'assemblage.instruction "mov" d'assemblage

Voici le 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 

Pour cette ligne:

movl $10, 24(%esp) 

Si je comprends bien, il dit déplacer la valeur de 10 dans le registre esp. Mais que fait le 24? Je ne pense pas qu'il est déplacé en esp parce qu'une valeur à déplacer est désigné par « $ » (je pense)

+0

"déplacer la valeur de 10 dans le registre esp" - no. les parenthèses autour de esp indiquent indirection. 24 est un déplacement, a.k.a. –

+1

il sera beaucoup plus facile à comprendre dans la syntaxe Intel: 'mov dword ptr [esp + 24], 10' –

Répondre

7
movl $10,24(%esp) 

signifie: déplacer un littéral décimal-10 à long (4 octets) en 4 -byte emplacement de la mémoire qui commence à l'adresse pointée par (le esp registre plus décimal 24) - fondamentalement, il s'agit d'une variable locale.

5

En d'autres termes movl $10,24(%esp)

signifie: 10 charge dans *(esp + 24)

en C qui est égal à:

*(unsigned long *)(myptr + 24) = 10;

myptr est pris avec la valeur du registre esp.