我正在通过比较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中,因为要移动的值是用"$“表示的(我认为)
发布于 2014-07-15 06:30:43
movl $10,24(%esp)意味着:将一个文本十进制数-10(4字节)移到一个4字节的内存位置,该位置从( esp寄存器加上十进制24)所指向的地址开始--基本上它是一个局部变量。
发布于 2014-07-15 12:43:36
换句话说,movl $10,24(%esp)
方法:将10加载到*(esp + 24)中
在C中,它等于:
*(unsigned long *)(myptr + 24) = 10;
其中,使用esp寄存器的值获取myptr。
https://stackoverflow.com/questions/24746123
复制相似问题