《深入理解计算机系统(第三版)》第三章

您所在的位置:网站首页 条件码的使用 《深入理解计算机系统(第三版)》第三章

《深入理解计算机系统(第三版)》第三章

2024-07-01 21:15| 来源: 网络整理| 查看: 265

3.1 程序编码

1.计算机系统使用了多种不同形式的抽象,对于机器级编程来说,两种抽象尤为重要:

指令集体系结构(ISA):定义了处理器状态、指令的格式,以及每条指令对状态的影响 机器级程序使用的存储器地址是虚拟地址:提供的存储器模型看上去是一个非常大的字节数组

2.反汇编器使用的指令命名规则与GCC生成的汇编代码使用的有区别。反汇编省略了指令结尾的q,给call和ret指令添加了q后缀。

3.可执行程序反汇编和对.c反汇编产生的代码有差别。对于可执行文件的反汇编,链接器将代码的地址移到了一段不同的地址范围,链接器的任务之一就是为函数调用找到匹配的函数的可执行代码的位置。

3.2 数据格式

GCC生成的汇编代码指令都有一个字符的后缀,表明操作数的大小、。后缀l可以表示4字节整数和8字节双精度浮点数,但是并没有歧义,因为浮点数使用的是一组完全不同的指令和寄存器。

3.3 访问信息

1.x86-64的CPU包含一组16个存储64位值的通用目的寄存器,用来存储整数数据和指针。

2.不同操作数可能被分为三种类型,分别为立即数(表示常数)、寄存器(表示某个寄存器的内容)、内存引用(根据计算出来的地址访问某个内存位置)。

3.传送指令两个操作数不能都指向内存位置。MOV指令只会更新目的操作数指定的那些寄存器字节或内存位置。唯一的例外是movl指令以寄存器作为目的时,会把寄存器的高位4字节设置为0。movq指令只能以表示为32位补码数字的立即数作为源操作数,然后把这个值符号扩展得到64位的值,放到目的位置。

4.MOVZ类中的指令把目的中剩余的字节填充为0,MOVS类中的指令通过符号扩展来填充,把源操作的最高位进行复制。它们均以寄存器或内存地址作为源,以寄存器作为目的。

把4字节源值零扩展到8字节逻辑上应该是movzlq,但并没有这样的指令。可以使用movl来实现(movl指令会把寄存器的高位4字节设置为0)。

3.4 算术和逻辑操作:

如果寄存器%eax的值为x,那么指令leal 3(%edx, %edx, 2),%eax将设置%eax的值为2x+3。

移位量可以是一个立即数,或者放在单字节寄存器%cl中。左移指令有SAL和SHL,两者效果一样,都是将右边填上0,而右移指令不同,SAR执行算术移位(填上符号位),而SHR执行逻辑移位(填上0)。

无符号数乘法(mulq)和补码乘法(imulq)要求一个参数必须在%rax中,另一个作为指令的源操作数给出。乘积存放在%rdx(高64位)和%rax(低64位);有符号除法idivl 将寄存器 %rdx(高32位)和 %rax(低32位)中的64位数作为被除数,而除数作为指令的操作数给出。指令将商存储在%rax中,将余数存储于%rdx中。

3.5 控制

1.条件码寄存器描述了最近算术或逻辑运算的属性,可以检测这些寄存器来执行条件分支指令:

CF:进位标志。可用来检查无符号操作的溢出。如:(unsigned)t < (unsigned)

ZF:零标志。如:(t == 0)

SF:符号标志。如:(t < 0)

OF:溢出标志,最近的操作导致了补码溢出。如:(a



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3