- 论坛徽章:
- 0
|
0默认为int型,占用4个字节,存储为0x00000000
~0的存储值为0xffffffff
转换为unsigned char后存储为0xff,其值为255
>>1就是除以2,存储为0111 1111, 所以为255/2 = 127
很长时间没接触汇编了,也不知道解释的对不对:
注意第(7)句填写了值127
其他的%esp的变化也不是很清楚了,呵呵
.file "testhuibian.c"
.text
.globl main
.type main,@function
main:
pushl %ebp (1)
movl %esp, %ebp (2) # 这两行是为了保存main函数的frame指针到%ebp
subl $8, %esp (3) # 当前frame中留出8个字节空间
andl $-16, %esp (4) # -16的十六进制表示为0xfffffff0
这里让%esp的值以对齐8位字节边界
正常情况下可以假设%esp的值没有变化,
movl $0, %eax (5)
subl %eax, %esp (6) # %esp的值没有变化
movl $127, -4(%ebp) (7) # 注意这里的寻址方式
subl $12, %esp (8)
pushl $0 (9)
call exit (10) # 这两句是来调用exit(0)的
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
函数frame # 这里假设栈的增长是从高地址到低地址的
-------- HighAddr
%ebp
------- <--- %ebp,%esp (1)(2)句执行结果
4个字节 0x000000ff = 127 <--- (7)的执行结果
--------
4个字节
-------- <--- %esp (3)的执行结果
4个字节
--------
4个字节
--------
4个字节
-------- <--- %esp (8)的执行结果
LowAddr
==================================================================
有本书《Professional Assembly Language》可以翻翻,
其中文版叫《汇编语言程序设计》 |
|