- 格式:mov dest,src (B/W)
dest可以是reg、men、sreg,src可以是立即数、reg、men、sreg。其中CS段寄存器只能作为src
dest和src可以同时为reg,但不能同时为mem
立即数不能与sreg直接建立数据传送——在指定段基值时,需两条指令
- 指令功能:将src寻址得到的操作数送往dest,src有效地址与dest有效地址上的内容一致
- 数据传送源—>目图
- 格式:PUSH src (W)
- 功能:将src寻址方式所表示的操作数入栈 SP=SP-2 (SP+1)_(SP)=src
- 栈相关介绍
8086系统的栈采用栈顶值越小的栈存储方式,栈顶指针SP始终指向栈顶,且栈顶处有存储的内容——所以入栈时先递减SP,再放数据;出栈时先取出数据再递增SP
src要求与MOV一致,可以是立即数、reg、mem、sreg
- 格式:POP dest (W)
- 功能:将栈顶数据取出存在dest所表示的有效地址上 dest=(SP+1)_(SP) SP=SP+2
dest要求与MOV一致,只能是reg、mem、非CS的段寄存器
- 格式:XCHG dest,src (B/W)
- 功能:交换src表示的有效地址与dest表示的有效地址上的内容
dest、src的要求与MOV指令相一致
- 格式: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 reg,mem
- 功能:将寻址得到的操作数的有效地址EA送至reg,reg=EA
- 具体示例见XLAT示例中用到的LEA指令
- 格式:LDS reg,mem
- 功能:将mem所表示的寻址内容上的连续4个字节,其中第一、二个字节按小端的存储方式放在reg寄存器中(设置段偏移地址),第三、四个字节同样按照小端的存储方式放在DS段基值寄存器中(设置段基值)
- 示例:
BUF DB 10H,02H,32H,43H LDS AX BUF;AX=0210H DS=4332H
- 格式:LES reg,mem
- 功能:与LDS功能类似,只不过修改的段基值和段偏移地址是ES段
- 示例:
BUF DB 10H,02H,32H,43H LES AX BUF;AX=0210H ES=4332H
LEA、LDS、LES三指令,源操作数均为mem,目的操作数均为reg
- 格式:LAHF
- 功能:取FR标志寄存器的低八位放在AH中,即AH=FR_low
FR存放标志示意图:(空4ODITSZ开始间隔APC)
也可以参考下面图片的源博客,详细学习FR寄存器
- 也就是说LAHF将低八位CF、PF、AF、ZF、SF这些标志存放在了AH中
- 格式:SAHF
- 功能:将AH中的值赋给FR标志寄存器的低八位(SF、ZF、AF、PF、CF)
- 格式:PUSHF
- 功能:将FR两字节的内容压入栈中, PUSHF==PUSH FR
SP=SP-2 (SP+1)_(SP)=FR
- 格式:POPF
- 功能:将栈顶两字节的内容设置给FR
FR=(SP+1)_(SP) SP=SP+2
- 格式: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 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 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 dest,src (B/W)
- 功能:dest=dest+src+CF 对dest,src要求同ADC
- 同ADD影响标志位的结果相同
- 格式:INC dest (B/W)
- 功能:dest=dest+1 dest可以是mem、reg
- 不影响CF标志位,但影响其他标志位
- 常用于修改地址指针和加一计数
- 格式: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
- 功能:对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 dest,src (B/W)
- 功能:dest=dest-src 对dest,src的要求同ADD
- 影响标志位的方法也与ADD相同
- 格式:SBB dest,src (B/W)
- 功能:dest=dest-src-CF
- 影响标志位的方法同SUB
- 格式:DEC dest (B/W)
- 功能:dest=dest-1
- 与INC一致,均不影响CF标志位
- 常用于修改地址指针与减一计数
- 格式:NEG dest (B/W)
- 功能:取反求补 dest=0-dest 或者
- 会影响标志寄存器的值
- 格式:CMP dest,src
- 功能:进行dest和src数值的比较,执行dest-src,并将结果对标志位的影响存放在FR中。若相等,则ZF=1,若大于则SF=0,若小于则SF=1
- 格式: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
- 功能:对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 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
- 功能:对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 src(B/W) 无符号除法
- 功能:当为字节格式时,AL=AL/src的商,AH=AL/src的余数。当为字格式时,AX=AX/src的商,DX为AX/src的余数
- 当溢出时会触发溢出中断INTO
- 格式:IDIV src(B/W) 有符号除法
- 功能:与DIV一致
- 格式:AAD
- 功能:与之前的AAA、AAS、AAM不一致的是,AAD指令放在DIV、IDIV指令之前。但都做的是对结果的非压缩BCD码或者ASCII码的修正
修正方法:
AL=AH*10+AL AH=0
- 格式:CBW
- 功能:默认的操作数是在AL中,将AL的内容扩展到AH,形成AX中的字
- 扩展规则:将AL的最高位即符号位填充至AH中
- 格式:CWD
- 功能:默认的操作数是在AX中,将AX的内容扩展到DX,形成DX_AX中的双字
- 扩展规则:将AX的最高位即符号位填充至DX中
- 格式:AND dest,src
- 功能:将dest寻址与src寻址的操作数进行与运算并将结果写入dest中,影响标志位
- 格式:OR dest,src
- 功能:将dest寻址与src寻址的操作数进行或运算并将结果写入dest中,影响标志位
- 格式:NOT src
- 功能:将src寻址的操作数进行取反并将结果写入src中,不影响标志位
- 格式:XOR dest,src
- 功能:将dest寻址与src寻址的操作数进行异或运算并将结果写入dest中,影响标志位
- 格式:TEST dest,src
- 功能:将dest寻址与src寻址的操作数进行与运算,不写入结果,只影响标志位
- 格式:SHL src,count
- 功能:将src中的数据逻辑左移count位,执行的功能相当于将src无符号乘
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
根据结果影响SF、ZF
- 格式:SHR src,count
- 功能:将src中的数据逻辑右移count位,执行的功能相当于将src无符号除以
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
根据结果影响SF、ZF
- 格式:SAL src,count
- 功能:将src中的数据算术左移count位,执行的功能相当于将src有符号乘
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
根据结果影响SF、ZF
图与SHL图类似
- 格式:SAR src,count
- 功能:将src中的数据逻辑右移count位,执行的功能相当于将src有符号除以
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
根据结果影响SF、ZF
- 格式:ROL src,count
- 功能:将src中的数据循环左移count位
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
只影响OF、CF
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
- 格式:ROR src,count
- 功能:将src中的数据循环右移count位
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
只影响OF、CF
对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1
对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
- 格式:RCL src,count
- 功能:带CF标志位将src中的数据循环左移count位
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
只影响OF、CF对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
- 格式:RCR src,count
- 功能:带CF标志位将src中的数据循环右移count位
- 注意:
count若为1可直接写,若不为1需先mov进cx,用cx表示
只影响OF、CF对OF的影响只在count=1时有:当count=1时若移位前后符号位(最高位)不同则OF=1对CF的影响在每次移位中产生,每次移位符号位(最高位)移向CF
- 格式:一般是直接使用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
- 格式:一般是直接使用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
- 格式:一般是直接使用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
- 格式:一般是直接使用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
- 格式:一般是直接使用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 MOVS/STOS/LODS
- 功能:若CX不为0则重复执行所接指令然后执行CX=CX-1,否则结束,不影响标志位
- 格式:REPZ CMPS/SCAS
- 功能:
若CX不为0且ZF=1 则重复执行所接指令 然后再执行CX=CX-1
若CX为0或ZF=0,则停止
- 格式: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号中断
INTO
执行溢出中断,相当于 INT 0
INT3
执行断点中断,相当于INT 3
- IRET 中断返回指令
执行过程:
常用的有DF、IF、CF标志位的赋值指令:
CLD、STD、CLC、STC、CMC、CLI、STI