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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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位架构的,将其扩展为32位之后用 16 位称一个word,32位称double word。


操作数指示符


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

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

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

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值