深入理解计算机系统——第三章小结(1)

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位乘,除法等),有兴趣参考相关资料,这里就不特别说了。

下次开始阅读程序流控制汇编码。

此条目发表在系统分类目录,贴了标签。将固定链接加入收藏夹。

深入理解计算机系统——第三章小结(1)》有1条回应

  1. 江峰说:

    对于多数32位机器“经典”的分配方式,“short int”整数分配2字节,“int” 分配4字节, “long int” 分配全字长。

    应该是依赖于 编译器 的吧!和机器关系不大,之前有试过,在vc 中int配4字节,在turbo C中sizeof(int)= 2

江峰进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注