寻址方式

 

通常流水线的操作如下:

  1. 根据CSIP取指令
  2. 译码
  3. 取源操作数(有些指令没有)
  4. 执行指令功能
  5. 写入结果(有些指令没有)

 

存储器寻址方式:

  1. 直接寻址 mov ax,[1234]

 

 

2. 寄存器间接寻址:mov ax,[bx]

8086 支持的间接寻址寄存器是bxbpsidi

 

 

 

 

 

3. 寄存器相对寻址:mov ax, [bx+1234] ,bp默认SS段寄存器,其他默认DS段寄存器

 

4. 基址变址寻址:mov ax, [bx+si]

5. 相对基址变址寻址:mov ax, [bx+si+offset]

6. 比例因子寻址(80386

6.1 相对比例因子寻址

6.2 基址变址比例因子寻址

6.3 相对基址变址比例因子寻址

 

 

 

 

 

 

探索汇编指令格式:

 

 

 

  reg

06 00 000 110

0E 00 001 110

16 00 010 110

1E 00 011 110

26 00 100 110

2E 00 101 110

36 00 110 110

3E 00 111 110

 

 

 

 

随意写3句汇编

 

 

 

07 00 000 111 [bx]

04 00 000 100 [si]

05 00 000 101 [di]

观察发现只有最后3bit变化,从000~1118种,排序如下:

 

 

 

 

 

00 00 000 000 [bx+si]

01 00 000 001 [bx+di]

02 00 000 010 [bp+si]

03 00 000 011 [bp+di]

04 00 000 100 [si]

05 00 000 101 [di]

06 00 000 110 [imm]

07 00 000 111 [bx]

 

 

 

变址是imm8的情况:

 

 

 

      reg

40 01 000 000 [bx+si+imm8]

41 01 000 001 [bx+di+imm8]

42 01 000 010 [bp+si+imm8]

43 01 000 011 [bp+di+imm8]

44 01 000 100 [si+imm8]

45 01 000 101 [di+imm8]

46 01 000 110 [bp+imm8]

47 01 000 111 [bx+imm8]

 

 

变址是imm16的情况:

 

 

 

      reg

80 10 000 000 [bx+si+imm16]

81 10 000 001 [bx+di+imm16]

82 10 000 010 [bp+si+imm16]

83 10 000 011 [bp+di+imm16]

84 10 000 100 [si+imm16]

85 10 000 101 [di+imm16]

86 10 000 110 [bp+imm16]

87 10 000 111 [bx+imm16]

 

 

 

 

 

 

             

      

C781 1100011 1 10 000 001

C781 1100011 1 10 000 001

C783 1100011 1 10 000 011

C787 1100011 1 10 000 111

C687 1100011 0 10 000 111

C647 1100011 0 01 000 111

1 WORD PTR

0 BYTE PTR

01 offset8

10 offset816

 

 

 

 

 

 

 

Mod 00 无基址寄存器

Mod 01 偏移量是BYTE

Mod 10 偏移量是DWORD

 

 

 

mov指令执行过程:

mov ax, 1234

1, CSIP确定指令位置,取到指令队列
2, EU开始译码
3, CSIP++得到34,存到BIU的内部暂存器
4, CSIP++得到12,存到BIU的内部暂存器
5, 内部暂存器中的值1234传送到AX

 

 

 

 

 

Mov ax,[1234]

1, CSIP确定指令位置,取到指令队列
2, EU开始译码
3, CSIP++得到34,存到BIU的内部暂存器
4, CSIP++得到12,存到BIU的内部暂存器
5, DS内部暂存器中的值1234组合,取出内存[1234]中的值,传送内部暂存器

6内部暂存器中的值传送到AX

 

 

 

 

 

Mov ax,[bx]

1, CSIP确定指令位置,取到指令队列
2, EU开始译码
3, CSIP++得到07,存到BIU的内部暂存器

4, DS内部暂存器中的值组合,取出内存[bx]中的值,传送内部暂存器

5内部暂存器中的值传送到AX

 

 

 

 

 

Mov ax,[bx+1234]

1, CSIP确定指令位置,取到指令队列
2, EU开始译码
3, CSIP++得到87,取到指令队列

4, EU开始译码并将bx送入ALU

5CSIP++得到34,取到指令队列

6CSIP++得到12,取到指令队列

7bx1234ALU中相加,结果送入 BIU的内部暂存器

8, DS内部暂存器中的值组合,取出内存[bx+1234]中的值,传送内部暂存器

9内部暂存器中的值传送到AX

 

 

 

 

 

Mov ax,[bx+si]

1, CSIP确定指令位置,取到指令队列
2, EU开始译码
3, CSIP++得到00,取到指令队列

4, EU开始译码bx,si送入ALU

5, bx+si的结果送入BIU的内部暂存器

6DS内部暂存器中的值组合,取出内存[bx+si]中的值,传送内部暂存器

7内部暂存器中的值传送到AX

 

 

 

 

 

Mov ax,[bx+si+1234]

1, CSIP确定指令位置,取到指令队列
2, EU开始译码
3, CSIP++得到80,取到指令队列

4, EU开始译码bx,si送入ALU

5. CSIP++得到34BIU的内部暂存器

6, CSIP++得到12BIU的内部暂存器

7BIU的内部暂存器将值1234送入ALU

8bx+si+1234的结果送入BIU的内部暂存器

9DS内部暂存器中的值组合,取出内存[bx+si+1234]中的值,传送内部暂存器

10内部暂存器中的值传送到AX

 

 

通用数据传送指令

MOV reg/mem, imm

Mov reg/mem/seg, reg

Mov reg/seg, mem

Mov reg/mem, seg

 

Mov word ptr[bx], 1234 ;传立即数时要说明wordbyte

Mov [si], al ;al已经隐含说明数据长度

 

XCHG reg, reg/mem

 

XLAT(tanslate)

bx指定的缓冲区中,al指定的位移处的一个字节取出,赋值给al,相当于al <--- [bx+al]

 

 

 

 

 

 

Push

Pop

 

 

 

 

LAHF (Load AH from Flag) 标志寄存器的低字节送入AH

SAHF(Store AH into Flag)  AH送入标志寄存器的低字节

 

PUSHF(Push Flag) 16bit

POPF(Pop Flag) 16bit

PUSHFD  2bit

POPFD  32bit

 

 

 

 

LEA

Lea reg, mem

 

LDS reg,mem

Reg <---mem

DS <---mem+2

LES reg,mem

Reg <---mem

ES <---mem+2

 

IN AL,imm8 AL<--IO端口

IN AX,imm8

IN AL,DX

IN AX,DX

 

ADD

ADC 源操作数和目标操作数相加,再加上CF10),结果送到目标操作数

ADC AX, BX  ;AX = AX + BX + CF

例如计算12345678h+66668888h,结果用cx.dx.ax联合表示一个大数

 

 

SBB 类似ADC,只不过是减法

SBB AX, BX  ;AX = AX - BX - CF

 

 

 

NEG 求补,用0减去操作数(或者说取反加一),结果返回给操作数,相当于C语言中的取负数。

例如0-1 = -1,补码表示为FFFF,相当于0001取反加一

如三目运算:A==00-1

Mov ax, A

Neg ax

Sbb ax,ax

 

Neg ax相当于0-ax,当ax=0CF0,否则CF1

Sbb ax,ax相当于ax = ax-ax-CF,相当于ax = 0-CFCF0时结果为0CF1时结果为-1

综上,ax=0CF0CF0时结果为0

ax!=0CF1CF1时结果为-1

 

 

posted @ 2020-09-29 06:59  八转达人  阅读(929)  评论(0编辑  收藏  举报