指令[8086]

文档状态:编辑....



...


Table of Contents

8086


前提


先介绍一下常使用的非标准化的符号

我们应该会常见(ax),((ax))等等
仔细说一下
- 0层括号 取地址
- 1层括号 取数值
- 2曾括号 做指针


分类


  1. 数据传送指令
  2. 算术运算指令
  3. 逻辑运算和移位指令
  4. 串操作指令
  5. 控制转移指令
  6. 处理器控制指令

粗略划分的话,分为三大类指令,数据传输,操作控制,数据运算


数据传输(送)类


分类

  1. 通用数据传送指令
    [1]. MOV[一般传送]
    [2]. PUSH/POP[堆栈操作]
    [3]. XCHG(Exchange)[交换]
    [4]. XLAT(Translate)[查表转换]
  2. 输入输出指令
    [1]. IN
    [2]. OUT
  3. 目标地址传送指令
    [1]. LEA(Load Effective Address)
    [2]. LDS(Load pointer using DS)
    [3]. LES(Load pointer using ES)
  4. 标志传送指令
    [1]. LAHF(Load AH from Flags)
    [2]. SAHF(Store AH into Flags)
    [3]. PUSHF(Push Flags onto stack)
    [4]. POPF(Pop Flags off stack)

MOV



PUSH/POP



[至于先sp-=2还是先存先pop都是为了方便存储与扔出]

PUSH执行分两步
1. SP = SP - 2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
2. 将ax中的内容送到 SS:SP 指向的内存单元处,SS:SP 此时指向栈顶





POP见图中





XCHG(exchange)



XLAT





------------------------------------------------类型分界----------------------------------------------


输入输出指令注重的是外设与cpu的数据传送,他们都是累加器专用指令.


IN/OUT



LEA(Load Effective Address)



LDS(Load pointer using DS)



LES(Load pointer using ES)



LAHF(Load AH from Flags)



SAHF(Store AH from Flags)



PUSHF/POPF


;使用
PUSH AX    ;PROTECT AX
PUSH CX    ;PROTECT CX
PUSHF      ;PROTECT Flags
CALL TRANS ;CALL PROCEDURE
POPF       ;RESTORE Flags
POP  CX    ;RESTORE CX
POP  AX    ;RESTORE AX
   .
   .
   .

算数运算类

[注意]

[特别说明]:算数运算类指令大都影响标识符寄存器,但是不同指令影响不同
- +&-(SF,ZF,AF,PF,CF,OF)
- INC&DEC(不影响CF[进位标识])
- *(改变CF和OF,但SZAP均不确定)
- /(大部分不确定,见详析)


ADD



ADC



INC


  INC DL              ;8  BIT & REGISTER
  INC SI              ;16 BIT & REGISTER
  INC BYTE PTR[BX][SI];8  BIT & MEM
  INC WORD PTR[DI]    ;16 BIT & MEM

AAA


[ASCII Adjust for Addition]

    MOV AX, 0007H  ;(AH)<--00,(AL)<--07
    MOV BL, 08H    ;(BL)<--08
    ADD AL, BL     ;(AL)<--0FH
    AAA            ;(AL)<--05H,(AH)<--01H,(CF)=(AF)<--1

    AF 表示出现辅助进位

DAA


    MOV AX,0007H ;
    MOV BL,08H   ;
    ADD AL,BL    ;
    DAA          ;(AL)=15H,(AH)=00H,(AF)<-1,(CF)=0

    [CAUTION:]
    DAA 没有试图去操作 AH,但是 AAA 试图了!
    两者都比较关注单字节的运算产生的进位
    DAA 对单字节的进位通过 CF 的形式表达出来
    AAA 对单字节的进位通过修改 AH 的形式表达出来

减法指令:
- SUB[NORAML Subtraction]
- SBB[Subtraction with Borrow]
- DEC[]
- NEG[]
- CMP[]
- AAS[]
- DAS[]


SUB


由上面可以看出 有符号数运算影响 OF
             无符号数运算影响 CF
但是计算机并不知道是什么数,所以它认为一个数既为有符号数又为无符号数,这并不矛盾!因为值的含义并不重要,我们只是在乎规则!(  o  )我是形式主义?

SBB


带借位减法


DEC



NEG


[Negate]求补指令


Problem


暂时未解决


FAQ