汇编指令助记符、语法及编程结构

汇编指令助记符 

数据传送指令

MOV 传送内容

  • 格式:mov dest,src (B/W)

dest可以是reg、men、sreg,src可以是立即数、reg、men、sreg。其中CS段寄存器只能作为src

dest和src可以同时为reg,但不能同时为mem

立即数不能与sreg直接建立数据传送——在指定段基值时,需两条指令

  • 指令功能:将src寻址得到的操作数送往dest,src有效地址与dest有效地址上的内容一致
  • 数据传送源—>目图

bd030e93603f488f8d77998c02928ce1.png

PUSH

  • 格式:PUSH src (W)
  • 功能:将src寻址方式所表示的操作数入栈 SP=SP-2 (SP+1)_(SP)=src
  • 栈相关介绍

8086系统的栈采用栈顶值越小的栈存储方式,栈顶指针SP始终指向栈顶,且栈顶处有存储的内容——所以入栈时先递减SP,再放数据;出栈时先取出数据再递增SP

src要求与MOV一致,可以是立即数、reg、mem、sreg

POP

  • 格式:POP dest (W)
  • 功能:将栈顶数据取出存在dest所表示的有效地址上 dest=(SP+1)_(SP)   SP=SP+2

dest要求与MOV一致,只能是reg、mem、非CS的段寄存器

XCHG

  • 格式:XCHG dest,src (B/W)
  • 功能:交换src表示的有效地址与dest表示的有效地址上的内容

dest、src的要求与MOV指令相一致

XLAT

  • 格式:XLAT (B) 或者 XLAT 变量名/数组首地址 (B)
  • 功能:

XLAT (B) 格式隐含了源操作数[BX+AL]的寄存器间接寻址和目的操作数AL,其中BX为基值(隐含段DS),功能是将BX+AL所表示的存储器地址上的内容送AL,即AL=[BX+AL];XLAT 变量名/数组首地址 (B)格式与上述格式的区别在于不再使用BX为基值,而是显式指定基值(省去了将变量名/数组首地址MOV给BX的指令),也就是AL=[变量名/数组首地址+AL]

  • 例子:
BUF DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH; 定义变量: 变量名 类型 数值(多个数值用,间隔) 
LEA BX,BUF;取BUF表示的地址送至BX
MOV AL,01H;立即数01H送至AL
XLAT;之后AL=06H 相当于 XLAT BUF

LEA

  • 格式:LEA  reg,mem
  • 功能:将寻址得到的操作数的有效地址EA送至reg,reg=EA
  • 具体示例见XLAT示例中用到的LEA指令

LDS

  • 格式:LDS reg,mem
  • 功能:将mem所表示的寻址内容上的连续4个字节,其中第一、二个字节按小端的存储方式放在reg寄存器中(设置段偏移地址),第三、四个字节同样按照小端的存储方式放在DS段基值寄存器中(设置段基值)
  • 示例:
BUF DB 10H,02H,32H,43H
LDS AX BUF;AX=0210H DS=4332H

LES

  • 格式:LES reg,mem
  • 功能:与LDS功能类似,只不过修改的段基值和段偏移地址是ES段
  • 示例:
BUF DB 10H,02H,32H,43H
LES AX BUF;AX=0210H ES=4332H

LEA、LDS、LES三指令,源操作数均为mem,目的操作数均为reg 

LAHF

  • 格式:LAHF
  • 功能:取FR标志寄存器的低八位放在AH中,即AH=FR_low

FR存放标志示意图:(空4ODITSZ开始间隔APC)

2a00872074ab4f319d6fcbf50afac59a.png

也可以参考下面图片的源博客,详细学习FR寄存器

  • 也就是说LAHF将低八位CF、PF、AF、ZF、SF这些标志存放在了AH中

SAHF

  • 格式:SAHF
  • 功能:将AH中的值赋给FR标志寄存器的低八位(SF、ZF、AF、PF、CF)

PUSHF

  • 格式:PUSHF
  • 功能:将FR两字节的内容压入栈中, PUSHF==PUSH FR

SP=SP-2  (SP+1)_(SP)=FR

POPF

  • 格式:POPF
  • 功能:将栈顶两字节的内容设置给FR

 FR=(SP+1)_(SP) SP=SP+2

IN

  • 格式:IN AL,port (B) 或者 IN AX,port(W)
  • 功能:格式一:AL=[port] 格式二:AX=(port+1)_(port)

IN指令默认的目的操作数即为AX/AL

当port端口值为8位时,port端口可直接指定数值

当port端口值为16位时,port端口的数值必须先传送给DX,字节操作的port位置填DX

OUT

  • 格式:OUT port,AL (B) 或者 OUT port,AX(W)
  • 功能:格式一:[port]=AL 格式二:(port+1)_(port)=AX

OUT指令默认的源操作数即为AX/AL

当port端口值为8位时,port端口可直接指定数值

当port端口值为16位时,port端口的数值必须先传送给DX,字节操作的port位置填DX

算术运算指令

ADD

  • 格式:ADD dest,src (B/W)
  • 功能:dest=dest+src 
  • 会影响标志寄存器FR

dest可以是reg、mem,src可以是reg、mem、立即数,但不能同时为mem

影响方法:

        OF:符号位进位与数值最高位进位异或值为OF

        SF:符号位值为SF

        ZF:结果为0时ZF=1

        AF:低四位有进借位则AF=1

        PF:若低8位的1的个数为偶数,则PF=1

        CF:数值最高位有进借位则CF=1

ADC

  • 格式:ADC dest,src (B/W)
  • 功能:dest=dest+src+CF 对dest,src要求同ADC
  • 同ADD影响标志位的结果相同

INC 

  • 格式:INC dest (B/W)
  • 功能:dest=dest+1 dest可以是mem、reg
  • 不影响CF标志位,但影响其他标志位
  • 常用于修改地址指针和加一计数

DAA

  • 格式:DAA
  • 功能:对BCD码ADD、ADC的结果进行压缩BCD码的修正,默认的源操作数、目的操作数均是AL。DAA要放在ADD,ADC指令之后
  • 修正方法:

若AL低四位>09H或AF=1,AL=AL+06H,AF=1

若AL高四位>09H或CF=1,AL=AL+60H,CF=1

  • DAA不影响OF位
  • 压缩BCD码与非压缩BCD码的区别

压缩BCD码:压缩BCD码即是一个字节表示两位的十进制数,高四位为十位,低四位为个位

非压缩BCD码:非压缩BCD码即是用两个字节表示两位的十进制数,每个字节的高四位全为0,高字节的低四位为十位,低字节的低四位为个位

;例如,十进制数52
;压缩BCD码是 00H 52H
;非压缩BCD码是 05H 02H
MOV  AL,68H     ;(AL)=68H

MOV  BL,59H     ;(BL)=59H

ADD  AL,BL      ;(AL)=C1H,(AF)=1

DAA              ;(AL)=27H,(CF)=1



MOV  AX,0007H   ;(AL)=07H,(AH)=00H

MOV  BL,08H     ;(BL)=08H

ADD  AL,BL      ;(AL)=0FH

DAA              ;(AL)=15H,(AH)=00H,(AF)=1,(CF)=0

AAA

  • 格式:AAA
  • 功能:对BCD码ADD、ADC的加法结果进行非压缩BCD码或者十进制ASCII码进行修正,源操作数是AL,目的操作数是AX。DAA要放在ADD,ADC指令之后
  • 修正方法:

若AL低四位>09H或AF=1,AL=AL+06H,AH=AH+1,AF=1,AL=AL^0FH,CF=1

若AL低四位<09H且AF=0,AL=AL^0FH,CF=AF

 MOV AX,0007H    ;(AL)=07H,(AH)=00H

 MOV BL,08H      ;(BL)=08H

 ADD AL,BL       ;(AL)=0FH

 AAA              ;(AL)=05H,(AH)=01H,(CF)=(AF)=1

SUB

  • 格式:SUB dest,src (B/W)
  • 功能:dest=dest-src 对dest,src的要求同ADD
  • 影响标志位的方法也与ADD相同

SBB

  • 格式:SBB dest,src (B/W)
  • 功能:dest=dest-src-CF
  • 影响标志位的方法同SUB

DEC

  • 格式:DEC dest (B/W)
  • 功能:dest=dest-1
  • 与INC一致,均不影响CF标志位
  • 常用于修改地址指针与减一计数

NEG

  • 格式:NEG dest (B/W)
  • 功能:取反求补 dest=0-dest 或者 gif.latex?dest%3D%5Cbar%7Bdest%7D&plus;1
  • 会影响标志寄存器的值

CMP

  • 格式:CMP dest,src
  • 功能:进行dest和src数值的比较,执行dest-src,并将结果对标志位的影响存放在FR中。若相等,则ZF=1,若大于则SF=0,若小于则SF=1

DAS

  • 格式:DAS
  • 功能:对BCD码SUB、SBB相减得到的结果进行压缩BCD码的修正。源目操作数均为AL。使用放在SUB、SBB指令后
  • 修正方法:

若AL低四位>09H或AF=1,则AL=AL-06H,AF=1

若AL高四位>09H或CF=1,则AL=AL-60H,CF=1

  • 影响除OF外的标志位
MOV  AL,83H      ;(AL)=83H

MOV BL,38H       ;(BL)=38H

SUB  AL,BL       ;(AL)=4BH

DAS               ;AL)=45H

AAS

  • 格式:AAS
  • 功能:对BCD码SUB、SBB相减得到的结果进行压缩BCD码的修正。源操作数为AL目操作数为AX。使用放在SUB、SBB指令后
  • 修正方法:

若AL低四位>09H或AF=1,则AL=AL-06H,AH=AH-1,AL=AL^0FH,AF=1,CF=1

若AL低四位<09H且AF=0,则AL=AL^0FH,CF=AF

  • 影响AF、CF。OF,SF,ZF,PF不确定
MOV AX,0103H     ;(AH)=01H,(AL)=03H

MOV  BL,04H      ;(BL)=04H

SUB  AL,BL       ;(AL)=03H-04H=FFH

AAS               ;(AL)=09H,(AH)=0

MUL和IMUL

  • 格式:MUL src (B/W) IMUL src (B/W) 
  • 功能:MUL表示无符号乘法,IMUL表示有符号乘法。两种指令的目操作数均隐含AL,AX。

若表示字节B,则AX=AL*src

若表示字W,则DX_AX=AX*src ,DX_AX为16位寄存器组成的32位寄存器组

  • src可以是mem、reg
  • 当乘积的高半部分为0时,CF=0,OF=0否则CF=1,OF=1.其余标志位根据具体结果分析

AAM

  • 格式:AAM
  • 功能:对BCD码MUL或IMUL的结果进行非压缩BCD码或者ASCII码的修正。操作数为AX隐含,AAM指令要放在MUL、IMUL指令之后使用
  • 根据AL中的结果影响状态标志位SF、ZF和PF,但AF、CF和OF的值不定。

修正方法:

AH=AL/10的商  AL=AL/10的余数即AL%10

MOV  AL,07H     ;(AL)=07H

MOV  BL,09H     ;(BL)=09H

MUL  BL          ;(AX)=07H´09H=003FH

AAM              ;(AH)=06H,(AL)=03H

DIV

  • 格式:DIV src(B/W) 无符号除法
  • 功能:当为字节格式时,AL=AL/src的商,AH=AL/src的余数。当为字格式时,AX=AX/src的商,DX为AX/src的余数
  • 当溢出时会触发溢出中断INTO

IDIV

  • 格式:IDIV src(B/W) 有符号除法
  • 功能:与DIV一致

AAD

  • 格式:AAD
  • 功能:与之前的AAA、AAS、AAM不一致的是,AAD指令放在DIV、IDIV指令之前。但都做的是对结果的非压缩BCD码或者ASCII码的修正

修正方法:

AL=AH*10+AL   AH=0

CBW

  • 格式:CBW 
  • 功能:默认的操作数是在AL中,将AL的内容扩展到AH,形成AX中的字
  • 扩展规则:将AL的最高位即符号位填充至AH中

CWD

  • 格式:CWD
  • 功能:默认的操作数是在AX中,将AX的内容扩展到DX,形成DX_AX中的双字
  • 扩展规则:将AX的最高位即符号位填充至DX中

逻辑运算指令

AND

  • 格式:AND dest,src
  • 功能:将dest寻址与src寻址的操作数进行与运算并将结果写入dest中,影响标志位

OR

  • 格式:OR dest,src
  • 功能:将dest寻址与src寻址的操作数进行或运算并将结果写入dest中,影响标志位

NOT

  • 格式:NOT src
  • 功能:将src寻址的操作数进行取反并将结果写入src中,不影响标志位

XOR

  • 格式:XOR dest,src
  • 功能:将dest寻址与src寻址的操作数进行异或运算并将结果写入dest中,影响标志位

TEST

  • 格式:TEST dest,src
  • 功能:将dest寻址与src寻址的操作数进行与运算,不写入结果,只影响标志位

移位指令

SHL

  • 格式:SHL src,count
  • 功能:将src中的数据逻辑左移count位,执行的功能相当于将src无符号乘 gif.latex?2%5E%7Bcount%7D
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1

对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

根据结果影响SF、ZF

589003858f904d25a7b9c1f18ec1fa83.png

SHR

  • 格式:SHR src,count
  • 功能:将src中的数据逻辑右移count位,执行的功能相当于将src无符号除以 gif.latex?2%5E%7Bcount%7D
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1

对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

根据结果影响SF、ZF 

9cebd786119c48709182ccc666922a8a.png

SAL

  • 格式:SAL src,count
  • 功能:将src中的数据算术左移count位,执行的功能相当于将src有符号乘 gif.latex?2%5E%7Bcount%7D
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1

对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

根据结果影响SF、ZF 

图与SHL图类似

SAR

  • 格式:SAR src,count
  • 功能:将src中的数据逻辑右移count位,执行的功能相当于将src有符号除以 gif.latex?2%5E%7Bcount%7D
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1

对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

根据结果影响SF、ZF 

3add75d34a1847618421b33d5491dbc7.png

ROL

  • 格式:ROL src,count
  • 功能:将src中的数据循环左移count位
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

只影响OF、CF

对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1

对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

5ee45c6126fa406eb809e71bc662be4a.png

ROR

  • 格式:ROR src,count
  • 功能:将src中的数据循环右移count位
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

只影响OF、CF

对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1

对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

 

77d194907b3041c0a008973903251dee.png

RCL

  • 格式:RCL src,count
  • 功能:带CF标志位将src中的数据循环左移count位
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

只影响OF、CF
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

dd248c9a701349c1b239b73cad9dec93.png

RCR

  • 格式:RCR src,count
  • 功能:带CF标志位将src中的数据循环右移count位
  • 注意:

count若为1可直接写,若不为1需先mov进cx,用cx表示

只影响OF、CF
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF

5dca2610130149839ca96f8286a41372.png

串操作指令

MOVS

  • 格式:一般是直接使用MOVSB、MOVSW
  • 功能:[ES:DI]<---[DS:SI] 将DS段SI起始的串开始传送至ES段的DI偏移地址上
  • 注意:

在使用前,需先将串偏移地址赋值给SI、DI(ES与DS可共段)

每次执行完根据DF标志位的值决定SI和DI的变化

      若DF=0,则SI、DI增加

      若DF=1,则SI、DI减少

若采用的是字操作,则SI、DI每次变化2,字节操作则每次变化1

STOS

  • 格式:一般是直接使用STOSB、STOSW
  • 功能:[ES:DI]<---AL/AX 将AX/AL表示的字符串开始传送至ES段的DI偏移地址上
  • 注意:

在使用前,需先将串偏移地址赋值给DI(ES与DS可共段)

每次执行完自动根据DF标志位的值决定DI的变化

      若DF=0,则SI、DI增加

      若DF=1,则SI、DI减少

每次执行完需手动给AX/AL值进行变化

若采用的是字操作,则DI每次变化2,字节操作则每次变化1

LODS

  • 格式:一般是直接使用LODSB、LODSW
  • 功能:AL/AW<---[DS:SI] 将DS段SI起始的串开始传送至AX/AL上
  • 注意:

在使用前,需先将串偏移地址赋值给SI(ES与DS可共段)

每次执行完自动根据DF标志位的值决定SI的变化

      若DF=0,则SI、DI增加

      若DF=1,则SI、DI减少

每次执行完需手动给AX/AL值进行变化

若采用的是字操作,则SI每次变化2,字节操作则每次变化1

CMPS

  • 格式:一般是直接使用CMPSB、CMPSW
  • 功能:[ES:DI]-[DS:SI]  将ES段DI起始的串与DS段SI起始的串作减法进行比较,比较影响标志位,根据标志位进行处理——比较两个串的大小
  • 注意:

在使用前,需先将串偏移地址赋值给SI、DI(ES与DS可共段)

每次执行完根据DF标志位的值决定SI和DI的变化

      若DF=0,则SI、DI增加

      若DF=1,则SI、DI减少

若采用的是字操作,则SI、DI每次变化2,字节操作则每次变化1

SCAS

  • 格式:一般是直接使用SCASB、SCASW
  • 功能:AL/AX-[ES:DI] 将AL/AX表示的字符串与ES段DI起始的串作减法进行比较,比较影响标志位,根据标志位进行处理——在一个串中查找字符(串)的位置(或者可以描述成字符(串)是否存在)
  • 注意:

在使用前,需先将串偏移地址赋值给DI(ES与DS可共段)

每次执行完自动根据DF标志位的值决定DI的变化

      若DF=0,则SI、DI增加

      若DF=1,则SI、DI减少

每次执行完需手动给AX/AL值进行变化

若采用的是字操作,则DI每次变化2,字节操作则每次变化1

REP

  • 格式:REP MOVS/STOS/LODS
  • 功能:若CX不为0则重复执行所接指令然后执行CX=CX-1,否则结束,不影响标志位

REPZ\REPE

  • 格式:REPZ CMPS/SCAS
  • 功能:

若CX不为0且ZF=1 则重复执行所接指令 然后再执行CX=CX-1

若CX为0或ZF=0,则停止

REPNZ\REPNE

  • 格式:REPZ CMPS/SCAS
  • 功能:

若CX不为0且ZF=0 则重复执行所接指令 然后再执行CX=CX-1

若CX为0或ZF=1,则停止

跳转指令

无条件跳转

  • JMP

格式:JMP 后接跳转标号

段内直接都是加入IP、段间和段内间接都是送入IP

  • CALL

格式:CALL 子程序标号

与JMP处理IP类似,段内直接是加入IP,段间和段内间接都是送入IP

  • RET 用在子程序的最后

RET 段内返回 (SP+1)_(SP)->IP SP+2->SP  

RETF  段间返回 (SP+1)_(SP)->IP SP+2->SP  (SP+1)_(SP)->CS SP+2->SP 

RETF expr 用的较少,expr为能计算出值的表达式,用于SP增

(SP+1)_(SP)->IP SP+expr->SP  (SP+1)_(SP)->CS SP+2->SP 

标志跳转指令

  • 单标志跳转

JO、JNO、JS、JNS、JZ、JNZ、JC、JNC、JP、JNP

  •  多标志跳转

有符号比较:JG、JNG、JL、JNL

无符号比较:JA、JNA 大于、小于等于

  • JCXZ dest 当CX为0时跳转

循环控制

  • LOOP dest

先判断CX是否为0,不为0转到标号地址处,并执行CX=CX-1;为0则顺序执行下条指令

  • LOOPZ dest

先判断CX、ZF是否为0,若CX不为0且ZF=1则跳转并执行CX=CX-1,否则顺序执行

  • LOOPNZ dest

先判断CX、ZF是否为0,若CX不为0且ZF=0则跳转并执行CX=CX-1,否则顺序执行

中断

  • INT n

执行第n号中断

b79566d70a404c55879a23c61857c57c.jpeg

  • INTO

执行溢出中断,相当于 INT 0

  • INT3 

执行断点中断,相当于INT 3

  • IRET 中断返回指令

执行过程:

97a2f96ed80c414e99c2fcb90571f3eb.jpeg

处理器控制指令

常用的有DF、IF、CF标志位的赋值指令:

CLD、STD、CLC、STC、CMC、CLI、STI 

猜你喜欢

转载自blog.csdn.net/weixin_53966032/article/details/127052392
今日推荐