use*_*800 5 assembly instruction-set mov
我通过比较交流程序与其程序集等效来学习程序集.
这是代码.
.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
Run Code Online (Sandbox Code Playgroud)
对于这一行:
movl $10, 24(%esp)
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,那就是将10的值移到esp寄存器中.但是24做了什么?我不认为它被移入esp,因为要移动的值用"$"表示(我认为)
Dwa*_*ell 10
movl $10,24(%esp)
Run Code Online (Sandbox Code Playgroud)
意思是:将文字十进制10长(4字节)移动到一个4字节的内存位置,该位置从指向的地址开始(esp寄存器加十进制24) - 基本上它是一个局部变量.
换一种说法 movl $10,24(%esp)
装置:负载10进*(esp + 24)
在C中等于:
*(unsigned long *)(myptr + 24) = 10;
在哪里myptr取得esp寄存器的价值.
| 归档时间: |
|
| 查看次数: |
45965 次 |
| 最近记录: |