MOV:寻址方式见下图
LEA:目的寄存器可以是任意寄存器,除了段寄存器。源操作数可以是除了立即数寻址外的任意寻址方式。
LDS LES LGS LSS:源操作数必须是存储器寻址,目的寄存器任意,但不能是段寄存器。
一.算术指令:
计算的时候!注意给出的数据是补码还是原码!
最好化为十进制检验计算结果。
1.加法指令,影响标志位
ADD,ADC,INC,除了INC不影响CF外,它们都影响条件标志位。
源操作数是双精度数,存放在BX CX中,如何实现双精度加法?
ADD AX,CX
ADC DX,BX
寻址方式:双操作数指令除了源操作数为立即数的情况外,必须有一个操作数在寄存器中。单操作数指令不能用立即数寻址。
2.减法指令,影响标志位情况同加法
SUB,SBB,DEC,NEG,CMP(执行减法,但不保存减法结果)
减法的CF值反应无符号数的借位情况。如果有借位即减数>被减数即为1,否则即为0
减法的OF值为1说明带符号数的减法溢出即两个数符号相反并且结果的符号与减数相同,结果是错误的。
NEG指令的条件码设置:按照求补后的结果设置,只有当操作数为0时,求补运算的结果使CF=0,其余都是1,只有对-128(字节运算),-32768(字运算)求补时,OF=1,其余全为0。NEG指令不管操作数是正数还是负数,总是把操作数包括符号位在内全部取反并且+1。
寻址方法:同加法?
3.乘法指令
MUL:无符号乘法
IMUL:有符号数乘法
比如1111 1111b* 1111 1111b看做是无符号数的时候是256d256d,但看恒是有符号数的话就是(-1)(-1)。
除了CF和OF以外,乘法指令对其他条件码无定义,即指令执行后条件码的状态是未知的(注意:无定义不是说无影响,标志码结果不一定不变,而是未知的)。如果乘积的高一半为0,则两标识码为0,否则都为1。
源操作数可以是除立即数以外任何一种寻址。
4.除法指令:
DIV无符号数除法
IDIV带符号数除数,与上面类似,但是余数和被除数必须同符
商在AL,余数在AH;商在AX,余数在DX中。
寻址方式和乘法一样。
除法指令对所有标志码都没有定义。
二.逻辑指令
1.逻辑运算指令
AND OR NOT XOR TEST
NOT不允许立即数,不影响标志位
其他四条指令:除非源操作数是立即数,至少有一个操作数必须放在寄存器中,另一个操作数则可以使用任意寻址方式。使CF和OF为0,AF无定义,SF、ZF和PF会根据运算结果设置。
逻辑指令可以设置屏蔽位(AND)、测试某位是1还是0(TEST)、对某位取反(XOR),置某位为1或0(OR)等。
2.移位指令
SHL SAL SHR SAR
ROL ROR RCL RCR(带进位循环移)
这些指令的格式都是 指令 OPR CNT,OPR是除立即数以外的所有寻址、CNT是1或者CL。
如何设置标志位呢?
OF只有当CNT不等于1的时候,无定义,等于1的时候有定义,且在移位时最高有效位发生变化(0->1或者1->0)置为1。循环移位指令不影响除CF OF以外的条件标志,但是移位指令会根据结果设置SF ZF PF,AF依然无定义
那么如何设置CF位的呢?
3.串操作
首先分析,与REP相配合工作的MOVS,STOS,LODS,INS,OUTS,CX或者ECX作为计数器,重复执行操作直到计数器为0。
(1)MOVS 串传送: MOVS ES:BYTE PTR[DI],DS:[SI]操作数中指明是字/双字/字节操作。此外有MOVSB MOVSW MOVSD。是从高地址到低地址还是从低地址到高地址呢?由控制标志DF决定,前者是DF=1,后者是DF=0。不影响条件码。
(2)STOS 存入串指令:STOSB STOSW STOSD,把AL AX或者EAX的内容存入由目的变址寄存器指向的附加段的某单元。结合DF执行,不影响条件码。与REP结合使用可以快速初始化某一缓冲区。
(3)LODS LODSB LODSW LODSD:把源变址寄存器内容送到AL,AX或者EAX。结合DF控制方向。该指令一般不与REP联用,都是逐次取出来。不影响条件码。
(4)INS OUTS都不影响标志位。
INS:把端口号在DX寄存器的I/O空间的字节、字、双字传送到附加段中目的变址寄存器指向的存储单元。
再来分析,与REPEZ REPE(当为0 相等的时候重复串操作,两者其实相同) REPNE REPNZ联合工作的CMPS和SCAS
退出条件是计数值为0或者ZF=1。
(1)(REPEZ REPE)CMPS,只要两数相等就可以继续比较,否则停止。(REPNE REPNZ)只要两数不相等就继续比较,如果相等或者ZF=1(即CX=0)就退出。CMPS实际是执行的减法而比较的,不过结果不会保存,但会根据结果去设置标志寄存器。CMPS CMPSB CMPSW CMPSD
比如要求比较两个字符串,找出他们不相匹配的位置,就可以使用REPE CMPSB
(2)SCAS:要求从一个字符串中查找到一个指定的字符就可以使用指令REPNZ SCASB。把AL AX EAX的内容与附加段的一个字节 字 双字进行比较。会根据结果设置标志位。
三.跳跃指令
JMP ;无条件跳转
JCXZ ;CX 为 0 则跳转
JECXZ;ECX 为 0 则跳转
;根据标志位跳转的指令
JE ;等于则跳转 同JZ
JNE ;不等于则跳转 同JNZ
JA ;无符号大于则跳转 ;无符号系列 A B CF ZF
JNA ;无符号不大于则跳转
JAE ;无符号大于等于则跳转 同JNB
JNAE ;无符号不大于等于则跳转 同JB
JB ;无符号小于则跳转
JNB ;无符号不小于则跳转
JBE ;无符号小于等于则跳转 同JNA
JNBE ;无符号不小于等于则跳转 同JA
JG ;有符号大于则跳转 ;有符号系列 G L SF OF ZF
JNG ;有符号不大于则跳转
JGE ;有符号大于等于则跳转 同JNL
JNGE ;有符号不大于等于则跳转 同JL
JL ;有符号小于则跳转
JNL ;有符号不小于则跳转
JLE ;有符号小于等于则跳转 同JNG
JNLE ;有符号不小于等于则跳转 同JG
JZ ;为零则跳转 ZF=1
JNZ ;不为零则跳转 ZF=0
JS ;为负则跳转 SF=1
JNS ;不为负则跳转 SF=0
JC ;进位则跳转 CF=1
JNC ;不进位则跳转 CF=0
JO ;溢出则跳转 OF=1
JNO ;不溢出则跳转 OF=0
JP;为偶则跳转 PF=1
JNP ;不为偶则跳转 PF=0
JPE ;奇偶位置位则跳转 同JP
JPO ;奇偶位复位则跳转 同JNP
四,循环控制
LOOP CX不等于0
LOOPE/LOOPZ CX!=0且ZF=1就一直执行
LOOPNZ /LOOPNE ZF=0且CX!=0就一直执行
五.其他
INTO若溢出则中断指令
IRET(D)从中断返回
CLC CF置为0;STC CF置为1;CMC CF取反
CLD DF置为0; STD DF置为1
CLI IF置为0关中断; STI IF置为1开中断
CALL +入口地址
RET该指令也可以携带立即数
INT中断指令