CSAPP读书笔记——程序的机器级表示之寄存器分布与mov指令集

本文详细介绍了IA32处理器中8个整数寄存器的划分,包括%esp和%ebp的特殊作用。讨论了操作数指示符的种类:立即数、寄存器和内存,并重点解析了mov指令集和push指令集的用法。通过C语言示例展示了数据移动和算术逻辑运算,特别是leal指令在计算地址方面的独特作用。
摘要由CSDN通过智能技术生成

IA32整数寄存器的划分


IA32(Inter Architecture 32-bit)处理器中有 8 32 位的寄存器(register)用来存储整型和指针(浮点数由单独的寄存器处理)。

这里写图片描述

这就是 8 integer register 的简单图示。

其中每个 32 位的寄存器都由 %e 开头,每个寄存器的低 16 位都可以作为单独的存储空间来存储 16 位的数据(例如 short ),前四个寄存器的后低 16 又可以分为两个 8 位的寄存器,存储一个字节(byte,处理char类型)。

注意,最后两个寄存器有其特殊含义。
%esp 表示存储系统栈的指针,只能被特殊的指令管理。
%ebp 表示帧指针(Frame pointer),也与系统栈的调用有关不能被随意访问。

前六个寄存器被称为通用寄存器,一般来讲在它们的使用上没有太多限制。

我们将处理 8 个位称为一个字节(byte), 16 个位称为一个字(word), 32 位称为双字节(double word)。
只是延续传统的命名而已,因为刚开始的时候IA是16位架构的,将其扩展为 3 2位之后用 16 位称一个word, 32 位称double word。


操作数指示符


编译器将程序解释为机器相关的汇编代码,从汇编代码我们可以看出程序对操作系统的各种资源的管理调度。
大多数汇编指令都有一个或者更多的操作算子(operands),用来指示该指令引用的源数据和它的目标位置。

源数据可以是一个常数或者是从寄存器、内存中取得的数。
目标位置可以是寄存器或者内存(通常用一个 32 位的地址来描述)

算子一般分为三类,我们依次介绍。

  1. immediate : 立即数。立即数就是一个常量,在ATT-format的汇编代码中,用前导符号 $ 表示,例如 $577 `或者 $0x1F 。只要可以被 32 bit表示即可。(汇编语言有时候可能会有 8 位(char)或 16 位(short)编码)。

  2. register : 寄存器。寄存器被作为汇编代码中的操作算子的时候,实际上指示的是该存储器中存储的值。 32 位寄存器(例如 %eax )存储 int 或者 pointer 16 位寄存器(例如 %ax )存储 short 8 位寄存器(例如 %al )存储 char 。我们用符号 Ea 表示寄存器 a ,用 R[Ea] 表示 a 存储的内容。即将一组寄存器看数组 R 的下标。

  3. memory : 存储器。我们通过有效地址来访问存储器(内存),用符号 Mbyte[Addr] 表示从 Addr 开始的 byte 个字节长度的引用。常见的表达式为 Imm(Eb,Ei,s) ,其中

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值