汇编语言
汇编语言与接口技术
第二章
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
- 功能 <font size=4 color=rgba(#8a1c89, 0.53)>
(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(