1. GCC按照自己的格式形成汇编代码并解释(GAS:Gnu Assembler),这一点与我们常学的MASM编译有差异:
A. movl 12(%ebp), %eax 表示 %ebp偏移12位置值送%eax ,事实上GCC汇编目的地址在右边。
B. 目标文件(如: code.o) 是对独立文件编译汇编的结果。
C. 产生目标文件后通过链接使程序整合成完整的机器级代码,也就是可执行文件。
D. 简单的打个比方“01 05 64 94 04 08” 表示“add %eax, 0x8049464” 你会发现地址是反着放的。
2. 不用争字究竟多长了,其实Intel开始从16位体系扩展成32位体系时,一直把“字(word)” 表示16位。
对于多数32位机器“经典”的分配方式,“short int”整数分配2字节,“int” 分配4字节, “long int” 分配全字长。
然而这样分配是GCC的约定,至于GAS:
A. GAS 中的 movb, movw, movl, 分别移动字节,字,双字。
B. GAS中的 %eax, 表示 寄存器AX的Extend(?),也就是32位的AX。
C. Imm(Eb, Ei, S) 是一种寻址模式,调用立即数Imm, 基址寄存器Eb,
变址或索引寄存器Ei 和 伸缩因子(scale factor Ps:必须是1.2.4.8之一)
操作数值 M[Imm + R[Eb] + R[Ei]*s],
R[Ei]表示对寄存器取值, Mb[Addr]表示对内存取b长度值(这里省略b)
D. GAS同样规定不能两个操作数同时访问内存。
E. 指针保存的地址信息使得程序像低级代码一样灵活。
F. 大部分人都会头大一下 Leal 7(%edx, %edx, 4), %eax 这样的指令,其实他只是将5*%edx+7 –》 %eax,
很简单的理由是你实在没办法对%edx加载有效地址。
G. 有关GAS的特殊指令(如64位乘,除法等),有兴趣参考相关资料,这里就不特别说了。
下次开始阅读程序流控制汇编码。
对于多数32位机器“经典”的分配方式,“short int”整数分配2字节,“int” 分配4字节, “long int” 分配全字长。
应该是依赖于 编译器 的吧!和机器关系不大,之前有试过,在vc 中int配4字节,在turbo C中sizeof(int)= 2