CSAPP - Chapter3 程序的机器级表示
3.3 数据格式 Intel用术语字来表示16位数据类型。 32位:双字。 64位:四字。 3.4 访问信息 %rbp是帧指针。 生成1字节和2字节数字的指令会保持剩下的字节不变; 生成4字节数字的指令会把高位的4个字节置为0。 3.4.1 操作数指示符 3.4.2 数据传送指令 MOV S, D: S->D 传送指令和的两个操作数不能都指向内存地址。 movabsq: 常规的movq指令只能以表示为32位补码数字的立即数作为源操作数。然后把这个值符号扩展得到64位的值,放到目的位置。 movabsq指令能够以任意64位立即数作为源操作数,并且只能以寄存器作为目的。 MOVZ S, R: 零扩展(S)->R MOVS S, R: 符号扩展(S)->R 这两个指令目的只能是寄存器。 cltq: 符号扩展(%eax)->%rax, 把%eax符号扩展到%rax。 3.4.4 压入和弹出栈数据 练习题 3.2 内存引用总是以4字节寄存器给出,比如%rax。 练习题 3.3 movl %eax, %rdx: 目的寄存器%rdx长度不匹配,应该为%edx。 3.5算术和逻辑操作 图3-10: 3.5.1 加载有效地址 如果%rdx保存的值为x leaq 7(%rdx, %rdx, 4), %rax: 将%rax寄存器的值设为5x+7。 指令形式是从内存读数据到寄存器,但实际上根本没有引用内存。 3.5.3 移位操作 移位量可以是一个立即数,或者放在单字节寄存器%cl中。(只允许以这个特定的寄存器) 3.5.5 特殊的算术操作 //TODO: 3.6 控制 3.6.1 条件码 CF: 进位标志。 ZF: 零标志。...