首页 文章

汇编“mov”指令

提问于
浏览
5

我通过将c程序与其程序集等效进行比较来学习汇编 .

这是代码 .

.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

对于这一行:

movl    $10, 24(%esp)

如果我理解正确,那就是将10的值移到esp寄存器中 . 但是24做了什么?我不认为它被移入esp,因为要移动的值用“$”表示(我认为)

2 回答

  • 8
    movl $10,24(%esp)
    

    意思是:将一个十进制的10字节长(4字节)移动到一个4字节的内存位置,该位置从( esp 寄存器加十进制24)指向的地址开始 - 基本上它是一个局部变量 .

  • 10

    换句话说 movl $10,24(%esp)

    表示:将 10 加载到 *(esp + 24)

    在C中等于:

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

    其中 myptr 的值为 esp 寄存器 .

相关问题