汇编语言与接口技术
第二章
2.3
CPU 由执行单元(EU)和数据总线接口单元(BIU)两部分组成。
EU 的功能是执行指令,由算逻单元(ALU)、控制部件及一些寄存器组成。
BIU 的功能是给EU递交指令和数据,由总线控制部件、段寄存器和指令队列组成。
2.4 80x86寄存器组
1. 通用寄存器
数据寄存器 | 用处 |
---|---|
AX(accumulator) | 作为 累加器 用,它是算数运算的主要寄存器。另外,所有的I/O指令都使用这一寄存器与外部设备传送信息 |
BX(base) | 计算机存储器地址时,经常作为寄存器 |
CX(count) | 在位移、循环和串处理指令中常用来做保存计数值 |
DX(data) | 一般在做双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位;对某些I/O操作,DX可用来存放I/O的端口地址 |
指针寄存器 | 用处 |
---|---|
SP(stack pointer)、ESP | 堆栈指针寄存器,其中存放当前堆栈段栈顶的偏移量,他们总是与SS堆栈段寄存器配合存取堆栈中的数据。实模式下使用SP,在80386以上的保护模式下使用ESP |
BP(base pointer)、EPB | 基址指针寄存器。它可以与堆栈段寄存器SS联用来确定堆栈段中的吗某一存储单元的地址。并可以作堆栈区中的一个基地址以便访问堆栈中的信息。 |
变址寄存器 | 作用 |
---|---|
SI(source index) 源变址寄存器 DI(destination index) 目的变址寄存器 | 一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能。 |
SP、ESP堆栈指针不能随意修改
***
2. 控制寄存器
指令指针寄存器
IP、EIP
叫做指令指针寄存器,它总是与CS段寄存器配合指出下一条要执行指令的地址,其中存放偏移量部分。计算机用指令指针寄存器来控制指令序列的执行流程。
***
标志寄存器
运算结果特征标志 | 用处 |
---|---|
CF(Carry Flag) | 进位标志,记录运算结果的最高位向前产生的进位或借位。可用于检测无符号数二进制加减法运算时是否发生溢出(溢出时 CF=1 ) |
PF(Parity Flag) | 奇偶标志,记录运算结果最低位中含1的个数是奇还是偶。可用于检测数据传送过程中是否发生错误。 |
AF(Auxiliary carry) | 辅助进位标志,记录运算结果低4位向前产生的进位或借位。只有在执行十进制运算指令时才关心此位。 |
ZF(Zero Flag) | 零标志,记录运算结果是否位0。结果为0则置1,否则清0 |
OF(Overflow Flag) | 溢出标志,记录运算结果是否超出了机器所能表示的范围。可用于检测带符号数运算时是否发生溢出(溢出时OF=1) |
SF(Sign Flag) | 符号标志,记录运算结果的符号。结果为负则置1,否则清0 |
控制标志(处理器) | 用处 |
---|---|
IF(Interrupt Flag) | 中断允许标志,IF的控制只对外部可屏蔽中断请求(INTR)起作用。当IF=1时允许CPU响应INTR。 |
DF(Direction Flag) | 方向标志。专服务于字符串操作指令,当DF位为1时,每次操作后使变址寄存器SI和DI减小,这样就使串处理从高地址向低地址方向处理。当DF位为0时,则使SI和DI增大。 |
TF(Trap Flag) | 陷阱标志,用于程序调试。当TF=1 时,CPU处于单步方式;当TF=0时,CPU处于连续方式。 |
IOPL(I/O Privilege Level) | 特权标志,占D13和D12两位。在保护模式下,用于控制对I/O地址空间的访问。只对80286以上CPU有效。 |
ID(Identification) | 标识标志,若ID=1,则表示Pentium支持CPUID指令。只对Pentium以上CPU有效。 |
***
3.段寄存器
IBM PC机的存储器采用分段管理方法组织,因此一个物理地址用段基址和偏移量 表示。
段寄存器存放段基址。在实模式下存放当前正在运行程序的段基地址,在保护模式下存放段选择子。
段寄存器 | 用处 |
---|---|
CS(code segment) | 代码段寄存器,指定当前代码段,代码段中存放当前正在运行的程序段。 |
SS(stack segment) | 指定当前堆栈段。 |
DS(data segment) | 数据段寄存器,指定当前运行程序所使用的数据段。 |
ES(extra segment) | 附加数据段寄存器,指定当前运行程序所使用的附加数据段 |
DS是主要的数据段寄存器,在默认情况下使用DS所指向段的数据。若要引用其它段中的数据,需要显式说明。
***
操作类型中段地址与偏移量的位置
3.1.2寄存器寻址方式(register addressing)
在某些情况下,80x86允许程序员用段跨越前缀来改变系统所指定的默认段。格式为“段寄存器名:”。
但在以下三种情况下,不允许使用段跨越前缀:
- 串处理指令的目的串必须使用ES段。
- PUSH指令的目的和POP指令的源必须用SS段。
- 指令必须存放在CS段中。
由于在汇编语言中用符号表示地址,所以指令“MOV AL,VAR”中的源操作数寻址方式是直接寻址,VAR是内存的符号地址。如写成“MOV AL,[VAR]”也可以,两者是等效的。
凡使用BP、ESP和EBP时,其默认段为SS段(缺省情况
操作数在堆栈段)。其它寄存器的默认段为DS寄存器(缺
省情况操作数在数据段) 。这两种情况都允许使用段超
越前缀。
把TAB的段基址送给AX寄存器
MOV AX,SEG TAB
把TAB的偏移量送给DI寄存器
MOV DI,OFFSET TAB
陌生的指令
XCHG(Exchange)
格式
XCHG OPR1,OPR2
功能 交换两个操作数
XCHG 寄存器 操作数,寄存器 操作数
XCHG 寄存器 操作数,存储器 操作数
XCHG 存储器 操作数,寄存器 操作数
输入输出指令(这组指令值限与使用累加器EAX,AX或 AL传送信息)
输入指令IN(Input)
格式
IN ACR,PORT
功能 把外设端口(PORT)的内容传送给累加器(ACR)。
说明 可以传送8、16位、32位,相应的累加器选择AL、AX、EAX。
输出指令OUT(Output)
格式
OUT PORT,ACR
功能 把累加器的内容传送给外设端口。
在 80x86 里,所有 I/O 端口与 CPU 之间的通信都由 IN 和 OUT 指令来完成。其中 IN 完成从 I/O 到 CPU 的信息传送,二 OUT 则完成从 CPU 到 I/O 的信息。
***
地址传送指令(操作数的地址)
传送有效地址指令LEA(Load Effective Address)
格式
LEA REG,SRG功能 把源操作数的有效地址传送给指定的寄存器。
说明 源操作数必须是存储器操作数
加载数据段指针指令LDS(Load DS with Pointer)
格式
LDS REG,SRC- 功能 把源操作数中的FAR型指针拷贝到DS和指令中指定的通用寄存器。
说明 若REG是16位的,
则源操作数必须是32位的,其中低16位送寄存器,高16位送DS;若REG是32位的,则源操作数必须是48位的,其中低32位送寄存器,高16位送DS。目的寄存器REG不允许使用段寄存器。
二进制算术运算指令
类型转换指令
字节扩展成字指令CBW(Convert Byte to Word)
- 格式
CWB - 功能 把AL寄存器中的符号位值扩展到AH中
示例
```
MOV AL,5
CBW ;(AH)=0,AL值不变
MOV AL,80H
CBW ;(AH)=0FFH,AL值不变
```- 格式
字扩展成双字指令CWD(Convert Word to Doubleword)
- 格式
CWD - 功能 把AX寄存器中的符号位值扩展到DX中。
- 格式
双字扩展成四字指令CDQ(Convert Doubleword to Quad-Word)
- 格式
CDQ - 功能 把EAX寄存器中的符号位值扩展到EDX中。
- 格式
二进制加法指令
加法指令ADD(Add)
- 格式
ADD DST,SRC
- 功能
(DST) + (SRC) -> DST
- 说明 对操作数的限定同MOV指令
标志 影响OF、SF、ZF、AF、PF、CF标志
- 格式
带进位加法指令ADC(Add with carry)
- 格式
ADC DST,SRC
- 功能
(DST) + (SRC) + CF -> DST
- 说明 由于考虑CF,所以可用于多字节或多字的加法
标志 影响OF、SF、ZF、AF、PF、CF标志
- 格式
加1指令INC(increment)
- 格式
INC DST
- 功能
(DST) + 1 ->DST
- 说明 可以很方便地实现地址指针或循环次数加以1
- 标志 影响OF、SF、ZF、AF、PF标志
- 格式
交换并相加指令XADD(