首页 > 编程语言 >第三章 程序的机器级表示(一)

第三章 程序的机器级表示(一)

时间:2022-10-13 19:26:26浏览次数:67  
标签:操作数 机器 位置 程序 指令 内存 寄存器 第三章 数据

3.3数据格式

由于是从16位体系结构扩展成32位的,Intel用术语“字(word)”表示16位数据类型。因此,称32位数为“双字(double words)”,称64位数为“四字(quad words)”。
image

3.4访问信息

一个x86-64的中央处理单元(CPU)包含一组16个存储64位值的通用目的寄存器这些寄存器用来存储整数数据和指针。
image

3.4.1 操作数指示符

大多数指令有一个或多个操作数(operand),指示出执行一个操作中要使用的源数据值,以及放置结果的目的位置。
image

基址和变址寄存器都必须是64位寄存器。

3.4.2 数据传送指令

最频繁使用的指令是将数据从一个位置复制到另一个位置的指令。

  • MOV类
    简单的数据传送指令把数据从源位置复制到目的位置,不做任何变化。
    image

x86-64规定,传送指令的两个操作数不能都指向内存位置。
指令的寄存器操作数可以是16个寄存器有标号部分中的任意一个,寄存器部分的大小必须与指令最后一个字符('b','w','l'或'q')指定的大小匹配。
MOV 指令只会更新目的操作数指定的那些寄存器字节或内存位置。唯一的例外是movl指令以寄存器作为目的时,它会把该寄存器的高位4字节设置为0。

  • MOVZ类
    零扩展数据传送指令把目的中剩余的字节填充为0。
    image

  • MOVS类
    符号扩展数据传送指令把目的中剩余的字节填充为0,而MOVS类中的指令通过符号扩展来填充,把源操作的最高位进行复制。
    image

3.4.4 压入和弹出栈数据

pushq指令的功能是把数据压人到栈上,而popq指令是弹出数据。这些指令都只有一个操作数-—压入的数据源和弹出的数据目的。
image

将一个四字值压人栈中,首先要将栈指针减8,然后将值写到新的栈顶地址。
弹出一个四字的操作包括从栈顶位置读出数据,然后将栈指针加8。
内存地址所执行的内存单元大小就是1字节,跟内存地址位数无关。(内存地址与内存空间

3.5 算数和逻辑操作

image

3.5.1 加载有效地址

加载有效地址(load effective address)指令leaq实际上是movq指令的变形。它的指令形式是从内存读数据到寄存器,但实际上它根本就没有引用内存。它的第一个操作数看上去是一个内存引用,但该指令并不是从指定的位置读人数据,而是将有效地址写入到目的操作数。

目的操作数必须是一个寄存器。
可以简洁地描述普通的算术操作。例如,如果寄存器%rdx的值为x,那么指令leaq 7(%rdx,%rdx,4),%rax将设置寄存器%rax的值为5x+7。

3.5.2 一元和二元操作

一元操作,只有一个操作数,既是源又是目的。这个操作数可以是一个寄存器,也可以是一个内存位置。
二元操作,其中,第二个操作数既是源又是目的。第一个操作数可以是立即数、寄存器或是内存位置。第二个操作数可以是寄存器或是内存位置。

3.5.3 位移操作

移位操作,先给出移位量,然后第二项给出的是要移位的数。移位量可以是一个立即数,或者放在单字节寄存器%cl中。(这些指令很特别,因为只允许以这个特定的寄存器作为操作数。)

只有最低位的那个字节才指示着移位量。(练习题3.9)

标签:操作数,机器,位置,程序,指令,内存,寄存器,第三章,数据
From: https://www.cnblogs.com/dalelee/p/16782086.html

相关文章