8086汇编语言命令速查与详解

http://note.sdo.com/u/1729301760/n/D4MQ0~jJXgEpnM0sI000Gx

汇编语言命令速查
 
一、数据传输指令
───────────────────────────────────────
     它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
     1. 通用数据传送指令.
         MOV     传送字或字节.
         MOVSX   先符号扩展,再传送.
         MOVZX   先零扩展,再传送.
         PUSH     把字压入堆栈.
         POP     把字弹出堆栈.
         PUSHA   把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
         POPA     把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
         PUSHAD   把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
         POPAD   把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
         BSWAP   交换32位寄存器里字节的顺序
         XCHG     交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
         CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
         XADD     先交换再累加.( 结果在第一个操作数里 )
         XLAT     字节查表转换.
                 ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
                 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
     2. 输入输出端口传送指令.
         IN       I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
         OUT     I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
           输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
           其范围是 0-65535.
     3. 目的地址传送指令.
         LEA     装入有效地址.
           例: LEA DX,string   ;把偏移地址存到DX.
         LDS     传送目标指针,把指针内容装入DS.
           例: LDS SI,string   ;把段地址:偏移地址存到DS:SI.
         LES     传送目标指针,把指针内容装入ES.
           例: LES DI,string   ;把段地址:偏移地址存到ES:DI.
         LFS     传送目标指针,把指针内容装入FS.
           例: LFS DI,string   ;把段地址:偏移地址存到FS:DI.
         LGS     传送目标指针,把指针内容装入GS.
           例: LGS DI,string   ;把段地址:偏移地址存到GS:DI.
         LSS     传送目标指针,把指针内容装入SS.
           例: LSS DI,string   ;把段地址:偏移地址存到SS:DI.
     4. 标志传送指令.
         LAHF     标志寄存器传送,把标志装入AH.
         SAHF     标志寄存器传送,把AH内容装入标志寄存器.
         PUSHF   标志入栈.
         POPF     标志出栈.
         PUSHD   32位标志入栈.
         POPD     32位标志出栈.

二、算术运算指令
───────────────────────────────────────
         ADD     加法.
         ADC     带进位加法.
         INC     加 1.
         AAA     加法的ASCII码调整.
         DAA     加法的十进制调整.
         SUB     减法.
         SBB     带借位减法.
         DEC     减 1.
         NEC     求反(以 0 减之).
         CMP     比较.(两操作数作减法,仅修改标志位,不回送结果).
         AAS     减法的ASCII码调整.
         DAS     减法的十进制调整.
         MUL     无符号乘法.
         IMUL     整数乘法.
           以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
         AAM     乘法的ASCII码调整.
         DIV     无符号除法.
         IDIV     整数除法.
           以上两条,结果回送:
               商回送AL,余数回送AH, (字节运算);
           或   商回送AX,余数回送DX, (字运算).
         AAD     除法的ASCII码调整.
         CBW     字节转换为字. (把AL中字节的符号扩展到AH中去)
         CWD     字转换为双字. (把AX中的字的符号扩展到DX中去)
         CWDE     字转换为双字. (把AX中的字符号扩展到EAX中去)
         CDQ     双字扩展.     (把EAX中的字的符号扩展到EDX中去)

三、逻辑运算指令
───────────────────────────────────────
         AND     与运算.
         OR       或运算.
         XOR     异或运算.
         NOT     取反.
         TEST     测试.(两操作数作与运算,仅修改标志位,不回送结果).
         SHL     逻辑左移.
         SAL     算术左移.(=SHL)
         SHR     逻辑右移.
         SAR     算术右移.(=SHR)
         ROL     循环左移.
         ROR     循环右移.
         RCL     通过进位的循环左移.
         RCR     通过进位的循环右移.
           以上八种移位指令,其移位次数可达255次.
               移位一次时, 可直接用操作码.   如 SHL AX,1.
               移位>1次时, 则由寄存器CL给出移位次数.
                 如   MOV CL,04
                     SHL AX,CL

四、串指令
───────────────────────────────────────
             DS:SI   源串段寄存器   :源串变址.
             ES:DI   目标串段寄存器:目标串变址.
             CX       重复次数计数器.
             AL/AX   扫描值.
             D标志   0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
             Z标志   用来控制扫描或比较操作的结束.
         MOVS     串传送.
             ( MOVSB   传送字符.     MOVSW   传送字.     MOVSD   传送双字. )
         CMPS     串比较.
             ( CMPSB   比较字符.     CMPSW   比较字. )
         SCAS     串扫描.
             把AL或AX的内容与目标串作比较,比较结果反映在标志位.
         LODS     装入串.
             把源串中的元素(字或字节)逐一装入AL或AX中.
             ( LODSB   传送字符.     LODSW   传送字.     LODSD   传送双字. )
         STOS     保存串.
             是LODS的逆过程.
         REP             当CX/ECX<>0时重复.
         REPE/REPZ       当ZF=1或比较结果相等,且CX/ECX<>0时重复.
         REPNE/REPNZ     当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
         REPC           当CF=1且CX/ECX<>0时重复.
         REPNC           当CF=0且CX/ECX<>0时重复.

五、程序转移指令
───────────────────────────────────────
     1>无条件转移指令 (长转移)
         JMP     无条件转移指令
         CALL     过程调用
         RET/RETF过程返回.
     2>条件转移指令 (短转移,-128到+127的距离内)
         ( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
         JA/JNBE 不小于或不等于时转移.
         JAE/JNB 大于或等于转移.
         JB/JNAE 小于转移.
         JBE/JNA 小于或等于转移.
           以上四条,测试无符号整数运算的结果(标志C和Z).
         JG/JNLE 大于转移.
         JGE/JNL 大于或等于转移.
         JL/JNGE 小于转移.
         JLE/JNG 小于或等于转移.
           以上四条,测试带符号整数运算的结果(标志S,O和Z).
         JE/JZ   等于转移.
         JNE/JNZ 不等于时转移.
         JC       有进位时转移.
         JNC     无进位时转移.
         JNO     不溢出时转移.
         JNP/JPO 奇偶性为奇数时转移.
         JNS     符号位为 "0" 时转移.
         JO       溢出转移.
         JP/JPE   奇偶性为偶数时转移.
         JS       符号位为 "1" 时转移.
     3>循环控制指令(短转移)
         LOOP             CX不为零时循环.
         LOOPE/LOOPZ     CX不为零且标志Z=1时循环.
         LOOPNE/LOOPNZ   CX不为零且标志Z=0时循环.
         JCXZ             CX为零时转移.
         JECXZ           ECX为零时转移.
     4>中断指令
         INT     中断指令
         INTO     溢出中断
         IRET     中断返回
     5>处理器控制指令
         HLT     处理器暂停, 直到出现中断或复位信号才继续.
         WAIT     当芯片引线TEST为高电平时使CPU进入等待状态.
         ESC     转换到外处理器.
         LOCK     封锁总线.
         NOP     空操作.
         STC     置进位标志位.
         CLC     清进位标志位.
         CMC     进位标志取反.
         STD     置方向标志位.
         CLD     清方向标志位.
         STI     置中断允许位.
         CLI     清中断允许位.

六、伪指令
───────────────────────────────────────
         DB       定义字节.
         DW       定义字(2字节).
         PROC     定义过程.
         ENDP     过程结束.
         SEGMENT 定义段.
         ASSUME   建立段寄存器寻址.
         ENDS     段结束.
         END     程序结束.
 
********************************************************************
80x86汇编指令详解(上)  (2009-12-08 13:52:15)
标签: 杂谈  
 

80x86指令系统,指令按功能可分为以下七个部分。
(1) 数据传送指令。
(2) 算术运算指令。
(3) 逻辑运算指令。
(4) 串操作指令。
(5) 控制转移指令。
(6) 处理器控制指令。
(7) 保护方式指令。
  3.3.1数据传送指令
数据传送指令包括:通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令、扩展传送指令等。
一、通用数据传送指令
1 传送指令
传送指令是使用最频繁的指令,格式:MOV DEST,SRC
功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。
传送指令允许的数据流方向见图3 11。

80x86汇编指令详解(上)

图 3.11  传送指令数据流

  由上图可知,数据允许流动方向为:通用寄存器之间、通用寄存器和存储器之间、通用寄存器和段寄存器之间、段寄存器和存储器之间,另外还允许立即数传送至通用寄存器或存储器。但在上述传送过程中,段寄存器CS的值不能用传送指令改变。
 例 3.12CPU内部寄存器之间的数据传送。
MOV AL,DH    ;AL←DH    (8位)
MOV DS,AX    ;DS←AX    (16位)
MOV EAX,ESI   ;EAX←ESI   (32位)
  例 3.13CPU内部寄存器和存储器之间的数据传送。
MOV [BX],AX       ;间接寻址     (16位)
MOV EAX,[EBX+ESI]   ;基址变址寻址   (32位)
MOV AL,BLOCK      ;BLOCK为变量名,直接寻址(8位)
例 3.14立即数送通用寄存器、存储器。
MOV EAX,12345678H   ;EAX←12345678H   (32位)
MOV [BX],12H      ;间接寻址      (8位)
MOV AX,1234H;AX←1234H(16位)
使用该指令应注意以下问题:
·源和目的操作数不允许同时为存储器操作数;
·源和目的操作数数据类型必须一致;
·源和目的操作数不允许同时为段寄存器;
·目的操作数不允许为CS和立即数;
·当源操作数为立即数时,目的操作数不允许为段寄存器;
·传送操作不影响标志位。
2 扩展传送指令
格式:MOV SX DEST,SRC
MOV ZX DEST,SRC
功能:将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的操作数。其中MOVSX是按有符号数扩展,MOVZX是按无符号数扩展。无符号数或正数高位扩展为0,负数高位扩展为全“1”。
  例 3.15带符号数扩展
MOV BL,80H  ; -128
MOVSX AX,BL  ; 将80H扩展为FF80H后送AX中。
  例 3.16无符号数扩展
MOV BL,80H  ; 128
MOVZX AX,BL  ; 将80H扩展为0080H后送AX中。
使用该指令应注意以下问题:
·目的操作数应为16位或32位通用寄存器;
·源操作数长度须小于目的操作数长度,为8位或16位通用寄存器或存储器操作数;
·扩展传送操作不影响标志位。
3 交换指令
(1) 格式:XCHG OPR1,OPR2
功能:交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字。允许通用寄存器之间,通用寄存器和存储器之间交换数据。
  例 3.17
XCHG AX,BX;通用寄存器之间交换数据(16位)
XCHG ESI,EDI;通用寄存器之间交换数据(32位)
XCHG BX,\[SI\];通用寄存器和存储器之间交换数据(16位)
XCHG AL,\[BX\];通用寄存器和存储器之间交换数据(8位)
使用该指令应注意以下问题:
·操作数OPR1和OPR2不允许同为存储器操作数;
·操作数数据类型必须一致;
·交换指令不影响标志位。
如要实现存储器操作数交换,可用如下指令实现:
MOV AL,BLOCK1
XCHG AL,BLOCK2
MOV BLOCK1,AL
(2) 格式:BSWAP REG
功能:将32位通用寄存器中,第1个字节和第4个字节交换,第2个字节和第3个字节交换。
例 3.18
MOV EAX,44332211H
BSWAP EAX;EAX=11223344H
使用该指令应注意以下问题:
·操作数为32位通用寄存器;
·交换指令不影响标志位。
二、堆栈操作指令
1 压栈指令
(1) 格式:PUSH SRC
功能:将源操作数压下堆栈,源操作数允许为16位或32位通用寄存器、存储器和立即数以及16位段寄存器。当操作数数据类型为字类型,压栈操作使SP值减2;当数据类型为双字类型,压栈操作使SP值减4。
  例 3.19
PUSH AX          ;通用寄存器操作数入栈(16位)
PUSH EBX          ;通用寄存器操作数入栈(32位)
PUSH [SI]         ;存储器操作数入栈(16位)
PUSH DWORD PTR [DI]    ;存储器操作数入栈(32位)
PUSHW 0A123H        ;立即数入栈(16位)
PUSHD 20H         ;立即数入栈(32位)
(2) 格式:PUSHA
PUSHAD
功能:PUSHA将16位通用寄存器压入堆栈,压栈顺序为AX,CX,DX,BX,SP,BP,SI,DI。
PUSHAD将32位通用寄存器压入堆栈,压栈顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
2 出栈指令
(1) 格式:POP DEST
功能:从栈顶弹出操作数送入目的操作数。目的操作数允许为16或32位通用寄存器、存储器和16位段寄存器。当操作数数据类型为字类型,出栈操作使SP加2;当操作数数据类型为双字类型,出栈操作使SP加4。
例 3.20
POP AX          ;操作数出栈送寄存器(16位)
POP ECX          ;操作数出栈送寄存器(32位)
POP [BX]         ;操作数出栈送存储器(16位)
POP DWORD PTR [SI]    ;操作数出栈送存储器(32位)
(2) 格式:POPA
POPAD
功能:POPA从堆栈移出16字节数据,并且按顺序存入寄存器DI,SI,BP,SP,BX,DX,CX,AX中。
POPAD从堆栈移出32字节数据,并且按顺序存入寄存器EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中。
使用堆栈操作指令应注意以下问题。
(1) 目的操作数不允许为CS以及立即数。
(2) 堆栈操作指令不影响标志位。
三、地址传送指令
(1) 格式:LEA REG,MEM
功能:将源操作数的有效地址传送到通用寄存器,操作数REG为16位或32位通用寄存器,源操作数为16位或32位存储器操作数。
  例 3.21
LEA BX,BLOCK;将BLOCK的有效地址传送到BX中(16位)
LEA EAX,\[EBX\];将EBX内容(有效地址)传送到EAX中(32位)
(2) 格式LDS(ES,FS,GS,SS)REG,MEM
功能:根据源操作数指定的偏移地址,在数据段中取出段地址和偏移地址分别送指定的段寄存器和指定的通用寄存器。
  例 3.22
LES BX,[SI]        ;将32位地址指针分别送ES和BX
LSS EAX,[EDI]       ;将48位地址指针分别送SS和EAX
80x86汇编指令详解(上)
  例 3.23
DATA1  DD buff
80x86汇编指令详解(上)
LDS BX,DATA1;将buff的32位地址指针分别送DS和BX
80x86汇编指令详解(上)
地址传送指令对标志位无影响。
四、标志寄存器传送指令
(1) 格式:LAHF
SAHF
功能:LAHF将标志寄存器中低8位送AH中。SAHF将AH中内容送标志寄存器中低8位。
(2) 格式:PUSHF
POPF
功能:PUSHF将标志寄存器低16位内容压入堆栈,SP←SP-2。POPF将当前栈顶一个字传送到标志寄存器低16位中,SP←SP+2。
(3) 格式:PUSHFD
POPFD
功能:PUSHFD将标志寄存器32位内容压入堆栈SP←SP-4。POPFD将当前栈顶一个双字传送到32位标志寄存器中,SP←SP+4。
上述SAHF,POPF,POPFD均影响相应的标志寄存器内容。
五、查表指令
格式:XLAT
功能:将寄存器AL中的内容转换成存储器表格中的对应值。实现直接查表功能。
XLAT指令规定:BX寄存器存放表的首地址,AL寄存器中存放表内偏移量,执行XLAT指令,以段寄存器DS的内容为段基址,有效地址为BX和AL内容之和,取出表中一个字节内容送AL中。
例 3.24内存中有一起始地址为TABLE的编码表,试编程将表中顺序号为4的存储单元内容送寄存器AL。
·MODEL SMALL
·DATA
TABLE      DB 11H,22H,33H,44H,55H 某编码表
·CODE
·STARTUP
MOV AL,4           ;AL←4
MOV BX,OFFSET TABLE     ;BX←TABLE表首地址
XLAT             ;结果在AL中,AL=55H
·EXIT
END
查表指令不影响标志位。
六、符号扩展指令
(1) 格式:CBW
功能:将AL中8位带符号数,进行带符号扩展为16位,送AX中。带符号扩展是指对正数高位扩展为全“0”,对负数高位扩展为全“1”。
  例 3.25AL=55H 经CBW扩展后 AX=0055H
AL=A5H 经CBW扩展后 AX=FFA5H
(2) 格式:CWD
功能:将AX中16位带符号数,进行带符号扩展为32位,送DX和AX中。高16位送DX中,低16位送AX中。
(3) 格式:CWDE
功能:将AX中16位带符号数,进行带符号扩展为32位,送EAX中。
(4) 格式:CDQ
功能:将EAX中32位带符号数,进行带符号扩展为64位,送EDX和EAX中。低32位送EAX中,高32位送EDX中。
符号扩展指令对标志位无影响。
  3.3.2 算术运算指令
80x86指令包括加、减、乘、除四种基本算术运算操作及十进制算术运算调整指令。二进制加、减法指令,带符号操作数采用补码表示时,无符号数和带符号数据运算可以使用相同的指令。二进制乘、除法指令分带符号数和无符号数运算指令。
一、加法指令
格式:ADDDEST,SRC
ADCDEST,SRC
功能:ADD是将源操作数与目的操作数相加,结果传送到目的操作数。ADC是将源操作数与目的操作数以及CF(低位进位)值相加,结果传送到目的操作数。
源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
ADD,ADC指令影响标志位为OF,SF,ZF,AF,PF,CF。
  例 3.26
MOV AX,9876H
ADD AH,AL;AX=0E76H CF=1 SF=0O F=0 ZF=0 AF=0 PF=0
ADC AH,AL;AX=8576H CF=0 SF=1O F=1 ZF=0 AF=1 PF=0
二、减法指令
格式:SUB DEST,SRC
SBB DEST,SRC
功能:SUB将目的操作数减源操作数,结果送目的操作数。SBB将目的操作数减源操作数,还要减CF(低位借位)值,结果送目的操作数。
源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
SUB,SBB指令影响标志位为OF,SF,ZF,AF,PF,CF。
  例 3.27
MOV AX, 9966H;AX=9966H
SUB AL, 80H;AL=E6HCF=1SF=1OF=1ZF=0AF=0PF=0
SBB AH, 80H;AH=18HCF=0SF=0OF=0ZF=0AF=0PF=1
三、加1减1指令
格式:INC DEST
DEC DEST
功能:INC指令将目的操作数加1,结果送目的操作数。DEC指令将目的操作数减1,结果送目的操作数。目的操作数为通用寄存器或存储器操作数。
INC,DEC指令影响标志位为OF,SF,ZF,AF,PF。
  例 3.28
INC BL;BL←BL+1
INC AX;AX←AX+1
INC WORDPTR [BX];存储器操作数加1
DEC BYTE PTR [SI];存储器操作数减1
DEC EAX;EAX←EAX-1
四、比较指令
(1) 格式:CMP DEST,SRC
功能:目的操作数减源操作数,结果不回送。源操作数为通用寄存器、存储器和立即数。目的操作数为通用寄存器、存储器操作数。
CMP指令影响标志位为OF,SF,ZF,AF,PF,CF。
  例 3.29
CMP CX,3
CMP WORD PTR [SI],3
CMP AX,BLOCK
执行比较指令后,对状态标志位影响见表3.2。对于两个数的比较(AX-BX)有以下3种情况。

表 3.2 CMP指令对标志位的影响

80x86汇编指令详解(上)


· 两个正数比较,使用SF标志位判断。
SF=0,则AX≥BX,若ZF=1,则AX=BX
SF=1,则AX<BX
· 两个无符号数比较,使用CF标志位判断。
CF=0,则AX≥BX,若ZF=1,则AX=BX
CF=1,则AX<BX
· 两个负数比较,使用SF标志位判断。
SF=0,则AX≥BX,若ZF=1,则AX=BX
SF=1,则AX<BX
· 两个异符号数比较。
如果OF=0,仍可用SF标志判断大小。
如果OF=1,说明结果的符号位发生错误,所以
SF=0,则AX<BX
SF=1,则AX>BX
综上所述:两个异号数比较
当OF=0,SF=0,则AX>BX
SF=1,则AX<BX
当OF=1,SF=0,则AX<BX
SF=1,则AX>BX
用逻辑表达式表示为:
若OF∨-SF=0,则AX>BX
若OF∨-SF=1,则AX<BX
(2) 格式:CMPXCHGDEST,REG
功能:目的操作数减源操作数,
如果DEST=SRC,则SRC→DEST。
如果DEST≠SRC,则DEST→ACC(AL,AX,EAX)。
源操作数允许为通用寄存器。目的操作数可以为通用寄存器,存储器操作数。
CMPXCHG影响标志位为OF,SF,ZF,AF,PF,CF。
(3) 格式:CMPXCHG8BMEM
功能:EDX:EAX中值减存储器操作数。
如果EDX:EAX=MEM64,则ECX:EBX→MEM64。
如果EDX:EAX≠MEM64,则MEM64→EDX:EAX。
该指令为64位比较交换指令,影响ZF标志位。
例 3.30  CMPXCHG8BQWORDPTR[EBX]
五、交换相加指令
格式:XADDDEST,REG
功能:目的操作数加源操作数,结果送目的操作数。原目的操作数内容送源操作数。源操作数允许为通用寄存器。目的操作数允许为通用寄存器、存储器操作数。
XADD指令影响标志位为OF,SF,ZF,AF,PF,CF。
六、求补指令
格式:NEGDEST
功能:对目的操作数求补,用零减去目的操作数,结果送目的操作数。目的操作数为通用寄存器、存储器操作数。
NEG指令影响标志位为OF,SF,ZF,AF,PF,CF。
七、乘法指令
(1) 格式:MULSRC
IMULSRC
功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令。源操作数为通用寄存器或存储器操作数。目的操作数缺省存放在ACC(AL,AX,EAX)中,乘积存AX,DX:AX,EDX:EAX中。
字节乘:AL SRC→AX
字乘:AX SRC→DX∶AX
双字乘:EAX SRC→EDX∶EAX
MUL,IMUL指令执行后,CF=OF=0,表示乘积高位无有效数据;CF=OF=1表示乘积高位含有效数据,对其它标志位无定义。
  例 3.31
MUL BL;字节乘
MUL WORD PTR [SI];字乘
IMUL BYTE PTR [DI];字节乘
IMUL DWORD PTR [ECX];双字乘
如果使用IMUL指令,积采用补码形式表示。
(2) 格式:IMULDEST,SRC
功能:将目的操作数乘以源操作数,结果送目的操作数。目的操作数为16位或32位通用寄存器或存储器操作数。源操作数为16位或32位通用寄存器、存储器或立即数。
源操作数和目的操作数数据类型要求一致。乘积仅取和目的操作数相同的位数,高位部分将被舍去,并且CF=OF=1。其它标志位无定义。
(3) 格式:IMUL DEST,SRC1,SRC2
功能:将源操作数SRC1与源操作数SRC2相乘,结果送目的操作数。目的操作数DEST为16位或32位,允许为通用寄存器。源操作数SRC1为16位或32位通用寄存器或存储器操作数。源操作数SRC2允许为立即数。
例 3.32  IMULEAX,[EBX],12H
要求目的操作数和源操作数SRC1类型相同,当乘积超出目的操作数部分,将被舍去,并且使CF=OF=1,在使用这类指令时,需在IMUL指令后加一条判断溢出的指令,溢出时转错误处理执行程序。
八、除法指令
格式:DIV SRC
IDIV SRC
功能:DIV为无符号数除法,IDIV为带符号数除法。源操作数作为除数,为通用寄存器或存储器操作数。被除数缺省在目的操作数AX,DX:AX,EDX:EAX中。
字节除法:AX/SRC商→AL,余数→AH
字除法:DX·AX/SRC商→AX,余数→DX
双字除法:EDX·EAX/SRC商→EAX,余数→EDX
由于被除数必须是除数的双倍字长,一般应使用扩展指令进行高位扩展。当进行无符号数除法时,被除数高位按0扩展为双倍除数字长。当进行有符号数除法时,被除数以补码表示。可使用扩展指令CBW,CWD,CWDE,CDQ进行高位扩展。例如:
MOV AX,BLOCK
CWD;被除数高位扩展
MOV BX,1000H
IDIV BX
对于带符号除法,其商和余数均采用补码形式表示,余数与被除数同符号。当除数为零或商超过了规定数据类型所能表示的范围时,将会出现溢出现象,产生一个中断类型码为“0”的中断。执行除法指令后标志位无定义。
九、BCD算术运算
十进制数在机器中采用BCD码表示,以压缩格式存放,即一个字节存储2位BCD码,BCD加减法是在二进制加减运算的基础上,对其二进制结果进行调整,将结果调整成BCD码表示形式。

  (1) 格式:DAA
功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。
调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高4位有进位),则
AL+6→AL,1→AF,
若AL中高4位大于9,或标志CF=1,(表示高4位有进位),则
AL+60H→AL,1→CF,
DAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
  例 3.33
ADD AL,BL
DAA
(2) 格式:DAS
功能:将存放在AL中的二进制差数,调整为压缩的BCD码表示形式。
调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高位借位),则
AL-6→AL,1→AF
若AL中高4位大于9或标志CF=1(表示高4位向高位借位),则
AL-60H→AL,1→CF
DAS指令一般紧跟在SUB或SBB指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
  例 3.34
SUB AL,BL
DAS
十、ASCII算术运算
数字0~9的ASCII码为30H~39H,机器采用一个字节存放一位ASCII码,对于ASCII码的算术运算是在二进制运算基础上进行调整。调整指令有加、减、乘、除四种调整指令。
(1) 格式:AAA
功能:将存放在AL中的二进制和数,调整为ASCII码表示的结果。
调整方法:若AL中低4位小于或等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1(进位),则AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。
AAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为AF,CF。其它标志位无定义。
例 3.35
MOV AX,0036H
ADD,AL,35H
AAA;AX=0101H
(2) 格式:AAS
功能:将存放在AL中的二进制差数,调整为ASCII码表示形式
调整方法:若AL中低4位小于等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1,则AL-6→AL,AH-1→AH,1→AF,AF→CF,AL中高4位清0。
AAS指令一般紧跟在SUB,SBB指令之后使用,影响标志位为AF,CF。其它标志位无定义。
例 3.36
MOV AX,0132H
SUB AL,35H
AAS;AX=0007H
(3) 格式:AAM
功能:将存放在AL中的二进制积数,调整为ASCII码表示形式。
调整方法:AL/10商→AH,余数→AL
AAM指令一般紧跟在MUL指令之后使用,影响标志位为SF,ZF,PF。其它标志位无定义。
  例 3.37
MOV AL,07H
MOV BL,09H
MUL BL;AX=003FH
AAM;AX=0603H
(4) 格式:AAD
功能:将AX中两位非压缩BCD码(一个字节存放一位BCD码),转换为二进制数的表示形式。
调整方法:AH 10+AL→AL0→AH
AAD指令用于二进制除法DIV操作之前,影响的标志位为SF,ZF,PF。其它标志位无定义。
例 3.38
MOV AX,0605H
MOV BL,09H
AAD;AX=0041H
DIV BL;AX=0207H
使用该类指令应注意,加法、减法和乘法调整指令都是紧跟在算术运算指令之后,将二进制的运算结果调整为非压缩BCD码表示形式,而除法调整指令必须放在除法指令之前进行,以避免除法出现错误的结果。
使用算术运算类指令应注意:
·如果没有特别规定,参与运算的两个操作数数据类型必须一致,且只允许一个为存储器操作数;
·如果参与运算的操作数只有一个,且为存储器操作数,必须使用PTR伪指令说明数据类型;
·操作数不允许为段寄存器。
·目的操作数不允许为立即数;
·如果是存储器寻址,则存储器各种寻址方式均可使用。
  3.3.3逻辑运算指令
一、逻辑指令
1 逻辑与指令
格式:AND DEST,SRC
功能:目的操作数和源操作数按位进行逻辑与运算,结果存目的操作数中。源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
例 3.39
AND AL,BL
AND EBX,ECX
AND [DI],1101H
AND指令常用于将操作数中某位清0(称屏蔽),只须将要清0的位与0,其它不变的位与1即可。
例 3.40  AND AL,0FH;将AL中高4位清0,低4位保持不变。
AND指令影响标志位为SF,ZF,PF,并且使OF=CF=0。
2 逻辑或指令
格式:OR DEST,SRC
功能:目的操作数和源操作数按位进行逻辑或运算,结果存目的操作数中。源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
 例 3.41
OR AX,BX
OR ECX,[EAX]
OR指令常用于将操作数中某位置1,只须将要置1的位或1,其它不改变的位或0即可。
例 3.42  OR AL,80H;将AL中最高位置1。
OR指令影响标志位为SF,ZF,PF。并且使OF=CF=0。
3 逻辑异或指令
格式:XOR DEST,SRC
功能:目的操作数和源操作数按位进行逻辑异或运算,结果送目的操作数。源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
例 3.43
XOR AX,BX
XOR [BX],1010H
XOR指令常用于将操作数中某些位取反,只须将要取反的位异或1,其它不改变的位异或0即可。
例 3.44  XOR AL,OFH;将AL中低4位取反,高4位保持不变。
XOR指令影响标志位为SF,ZF,PF,并且使OF=CF=0。

  4 逻辑非指令
格式:NOT DEST
功能:对目的操作数按位取反,结果回送目的操作数。目的操作数可以为通用寄存器或存储器。
例 3.45
NOT EAX
NOT BYTE PTR [BX]
NOT指令对标志位无影响。
5 测试指令
格式:TEST DEST,SRC
功能:目的操作数和源操作数按位进行逻辑与操作,结果不回送目的操作数。源操作数可以为通用寄存器、存储器或立即数。目的操作数可以为通用寄存器或存储器操作数。
例 3.46
TEST DWORD PTR [BX],80000000H
TEST AL,CL
TEST指令常用于测试操作数中某位是否为1,而且不会影响目的操作数。如果测试某位的状态,对某位进行逻辑与1的运算,其它位逻辑与0,然后判断标志位。运算结果为0,ZF=1,表示被测试位为0;否则ZF=0,表示被测试位为1。
  例 3.47  TEST AL,80H;测试AL中最高位
JNZ NEXT;如果最高位为1,转到标志NEXT处。
TEST指令影响标志位为SF,ZF,PF,并且使OF=CF=0。
二、移位指令
移位指令对操作数按某种方式左移或右移,移位位数可以由立即数直接给出,或由CL间接给出。移位指令分一般移位指令和循环移位指令。
1 一般移位指令
(1) 算术/逻辑左移指令。
格式:SAL DEST,OPRD
SHL DEST,OPRD
功能:按照操作数OPRD规定的移位位数,对目的操作数进行左移操作,最高位移入CF中。每移动一位,右边补一位0。如图3 12(a)所示。目的操作数可以为通用寄存器或存储器操作数。
SAL,SHL指令影响标志位OF,SF,ZF,PF,CF。

80x86汇编指令详解(上)

图 3.12  移位指令示意图 


  例 3.48
SHL BYTE PTR [DI],2
SAL BX,CL
(2) 算术右移指令。
格式:SAR DEST,OPRD
功能:按照操作数OPRD规定的移位次数,对目的操作数进行右移操作,最低位移至CF中,最高位(即符号位)保持不变。如图3 12(b)所示。目的操作数可以为通用寄存器或存储器操作数。
SAR指令影响标志位OF,SF,ZF,PF,CF。
 例 3.49
SAR AL,5
SAR WORD PTR \[ECX\],CL
(3) 逻辑右移指令。
格式:SHR DEST,SRC
功能:按照操作数OPRD规定的移位位数,对目的操作数进行右移操作,最低位移至CF中。每移动一位,左边补一位0。如图3 12(c)所示,目的操作数可以为通用寄存器或存储器操作数。
SHR指令影响标志位OF,SF,ZF,PF,CF。
  例 3.50
SHR BYTE PTR [SI],3
SHR EDX,CL
算术/逻辑左移,只要结果未超出目的操作数所能表达的范围,每左移一次相当于原数乘2。算术右移只要无溢出,每右移一次相当于原数除以2。
2 循环移位指令
格式:ROL DEST,OPRD
ROR DEST,OPRD
RCL DEST,OPRD
RCR DEST,OPRD
功能:循环左移指令ROL,见图3 13(a)所示,目的操作数左移,每移位一次,其最高位移入最低位,同时最高位也移入进位标志CF。循环右移指令 ROR见图3 13(b)所示,目的操作数右移,每移位一次,其最低位移入最高位,同时最低位也移入进位标志CF。
带进位循环左移指令RCL,见图3 13(c)所示,目的操作数左移,每移动一次,其最高位移入进位标志CF,CF移入最低位。带进位循环右移指令 RCR,见图3 13(d)所示,目的操作数右移,每移动一次,其最低位移入进位标志CF,CF移入最高位。80x86汇编指令详解(上)

图 3.13  循环移位指令


目的操作数可以为通用寄存器或存储器操作数。循环移位指令影响标志位CF,OF。其它标志位无定义。
例 3.51
ROL AL,CL
ROR BX,5
RCL ECX,3
RCR BYTE PTR [SI],CL
  例 3.52  将一个2位数压缩的BCD码转换成二进制数。
·MODEL SMALL
·DATA
BCD DB 01011001B
BIN DB?
CODE
·START UP
MOV AL,BCD
MOV BL,AL
AND BL,0FH
AND AL,0F0H
MOV CL,4
ROR AL,CL
MOV BH,0AH
MUL BH
ADD AL,BL
MOV BIN,AL
·EXIT
END
3 双精度移位指令
格式:SHLD DEST,SRC,OPRD
SHRD DEST,SRC,OPRD
功能:对于由目的操作数DEST和源操作数SRC构成的双精度数,按照操作数OPRD给出的移位位数,进行移位。SHLD是对目的操作数进行左移,如 图3 14(a)所示,SHRD是对目的操作数进行右移,如图3 14(b)所示。先移出位送标志位CF,另一端空出位由SRC移入DEST中,而SRC 内容保持不变。目的操作数可以是16位或32位通用寄存器或存储器操作数。源操作数SRC允许为16位或32位通用寄存器。操作数OPRD可以为立即数或 CL。目的操作数和源操作数SRC数据类型必须一致。

80x86汇编指令详解(上)

图 3.14  双精度移位指令

  SHLD,SHRD指令常用于位串的快速移位、嵌入和删除等操作,影响标志位为SF,ZF,PF,CF,其它标志位无定义。

 

 

 

 

*********************************************************************************


 

你可能感兴趣的:(汇编,职场,休闲,8086)