第二章 8086/8088寻址和指令系统

2.1 8086/8088寄存器组

cpu寄存器

  • 通用寄存器
    • 数据寄存器
      • AX
        • AH
        • AL
      • BX
        • BH
        • BL
      • CX
        • CH
        • CL
      • DX
        • DH
        • DL
    • 指针寄存器
      • SP
      • BP
    • 变址寄存器
      • SI
      • DI
  • 控制寄存器
    • IP
    • FLAG
  • 段寄存器
    • CS
    • DS
    • SS
    • ES

标志寄存器

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF

运算结果标识

  • 进位标志(CF) : 用于反映运算是否产生进位或借位
  • 零标志(ZF):用于反映运算结果是否为零
  • 符号标志(SF): 用于反映运算的符号位
  • 溢出标志(OF): 用于反映加减法是否产生溢出
  • 奇偶标志 (PF): 用于反映运算结果中1的个数是否为1
  • 辅助进位标示(AF): 用于反映半字节向高字节是否进位或借位
  • 方向标识(DF): 决定字符串操作的方向
  • 中断允许标识(IF): 决定CPU是否允许响应外部中断
  • 追踪标示(TF): 决定cpu是否进入单步模式

2.2 存储分段和地址的形成

存储单元的地址和内容

8086或8088系统中以字节为单位线性组织存储器

存储器的分段

因为8086或8088有20根地址线,所以可以直接寻址1M(2^20)的空间,但是由于寄存器只有16位,所以通过对1M的空间进行逻辑分段来实现寻址1M的能力。

物理地址的形成

物理地址= 段值*16 + 偏移

段寄存器的引用

访问存储器的方式 正常使用的寄存器 可选寄存器 偏移
取指令 CS IP
堆栈操作 SS SP
一般数据存取 DS CS、ES、SS 有效地址
源数据串 DS CS、ES、SS SI
目的数据串 ES DI
BP作为指针寄存器使用 SS CS、DS、ES 有效地址

8086/8088的寻址方式

立即寻址方式

操作数包含在指令中
MOV AX, 1234h

寄存器寻址方式

操作数在cpu内部寄存器中
MOV SI,AX

直接寻址方式

操作数存放在存储器中,指令直接包含操作数的有效地址
MOV ES:[5678H], BL

寄存器间接寻址

操作数在存储器中,操作数有效地址时SI、DI、BX、BP四个存储器之一
MOV AX,[SI]

寄存器相对寻址

操作数在存储器中,操作数的有效地址时一个基址寄存器(BX、BP)或变址寄存器(SI,DI)加上一个偏移
MOV AX, [DI+1234h]

基址加变址寻址

操作数在存储器中,操作数的有效地址是基址寄存器之一加上变址寄存器之一
MOV AX, [BX+DI]

相对基址加变址寻址

操作数在寄存器,操作数有效地址是基址寄存器加上变址寄存器再加上偏移
MOV AX, [BX+DI-2]

8086/8088指令系统

指令集说明

  • 分组

    • 数据传送
    • 算数运算
    • 逻辑运算
    • 串操作
    • 程序控制
    • 处理器控制
  • 指令格式
    [标号:] 指令助记符 [操作数1 [,操作数2]] [:注释]

数据传送指令

  • 传送指令
MOV DST,SRC

规则:
1、源和目的不能同时是段寄存器
2、代码段寄存器不能作为目的
3、指令指针IP不能作为源也不能作为目的

  • 交换指令
XCHG OPRD1, OPRD2

规则:
1、不能同时是存储单元
2、不能有立即数
3、不能有段寄存器
  • 地址传送指令
1、LEA (Load Effective Address)
LEA REG, OPRD

说明:将OPRD的有效地址存放到REG

2、 LDS (Load pointer into DS)
LDS REG, OPRD

说明: 将OPRD的段值存放到DS,将偏移存放到REG

3、 LES (Load pointer into ES)
LES REG, OPRD

说明:将OPRD的段值存放到ES,将偏移存放到REG

堆栈操作指令

1、进栈指令
PUSH SRC

2、出栈指令
POP DST

标志操作指令

1、LAHF (Load AH with Flags)

说明: 将标志寄存器的低8位存入AH

2、SAHF (Store AH into Flags)

说明: 将AH存入标志寄存器的低8位

3、PUSHF

说明: 将标志寄存器入栈

4、 POPF

说明: 将栈顶元素写入标志寄存器

5、CLC (CLear Carry flag)

说明: 清空进位标志

6、STC (SeT Carry flag)

说明: 设置进位标志

7、CMC (CoMplement Carry flag)

说明: 对进位标志取反

8、CLD 

说明:清空方向标志

9、STD 

说明: 设置方向标志

10、CLI

说明:情况中断标志

11、STI
设置中断标识

加减法运算指令

1、ADD
ADD OPRD1, OPRD2

说明:加法

2、ADC
ADC OPRD1, OPRD2

说明: 带进位的加法

3、SUB
SUB OPRD1, OPRD2

说明: 减法

4、SBB
SBB OPRD1, OPRD2

说明: 带借位的减法

5、DEC
DEC OPRD

说明:减一

6、NEG
NEG OPRD

说明:对OPRD取补

7、CMP
CMP OPRD1, OPRD2

说明:OPRD1-OPRD2 将影响标志存入标志寄存器

乘除法运算指令

1、MUL
MUL OPRD

2、IMUL
IMUL OPRD

3、DIV
DIV OPRD

4、IDIV
IDIV OPRD

5、CBW
CBW 

说明: 将AL寄存器的符号位扩展到AH

6、CWD
CWD

说明:将AX寄存器的符号位扩展到DX

逻辑运算和移位指令

1、NOT
NOT OPRD

说明:对OPRD取反并将结果存放到OPRD,不影响标志寄存器

2、AND 
AND OPRD1, OPRD2

说明:对OPRD1,OPRD2进行逻辑与运算,并将结果存入OPRD1,并影响标志寄存器

3、OR
OR OPRD1, OPRD2

说明:对OPRD1,OPRD2进行逻辑或运算,并将结果存入OPRD1,影响标志寄存器

4、 XOR
XOR OPRD1,OPRD2

说明:对OPRD1,OPRD2进行逻辑异或运算,并将结果存入OPRD1, 影响标志位

5、TEST
TEST OPRD1, OPRD2

说明:类似AND,只影响标志位

6、SAL
SAL OPRD, m

说明:对OPRD左移m位

7、SHL
SHL OPRD, m

说明:对OPRD左移m位

8、SAR
SAR OPRD, m

说明:对OPRD右移m位符号位保持bub

9、SHR
SHR OPRD, m

说明:对OPRD右移m位,左边补0

10、ROL
ROL OPRD,m

说明:循环左移

11、ROR
ROR OPRD,m

说明:循环右移

12、RCL
RCL OPRD,m

说明:带进位循环左移

13、RCR
RCR OPRD,m

说明:带进位循环右移

转移指令

1、JMP 
JMP 标号

2、LOOP
LOOP 标号

3、LOOPE
LOOPE 标号

4、LOOPNE
LOOPNE 标号

5、JCXZ
JCXZ 标号

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章