1、运算类指令:
(1)加法指令:ADD
带进位加法指令:ADC,比加法指令多加CF
加1指令:INC
加法指令都影响状态标志位(除了inc指令)
操作数不能是段寄存器
(2)减法指令SUB DST,SRC
带借位减法 SBB DST,SRC
减1指令 DEC OPR
求补运算 NEG OPR
比较指令 CMP OPR1,OPR2 不保存结果,只影响标志位
例子:X,Y,Z,W均是已经定义的双字数据,用指令数据实现W<----X+Y+24-Z
MOV AX,DATA
MOV DS,AX
MOV AX,WORD PTR X
MOV DX,WORD PTR X+2
ADD AX,WORD PTR Y
ADC DX,WORD PTR Y+2
ADD AX,24
ADC DX,0(加上可能产生的进位)
SUB AX,WORD PTR Z
SBB DX,WORD PTR Z+2
MOV WORD PTR W,AX
MOV WORD PTR W+2,DX
所以一般低字部分用一般的加减指令,高字部分用带进位的
乘法指令:
无符号:MUL SRC(SRC不能是立即数或段寄存器)
有符号: IMUL SRC
有无符号看操作数的规定。
影响标志位CF,OF,无符号反映的是高半部分是不是0,是0则两个标志都是0
有符号的反映高半部分是不是低半部分符号的拓展,是的话则两个标志都是0
若SRC是字节类型,则(AL)*(SRC)----》AX
若SRC是字类型,则(AX)*(SRC)----》(DX).,(AX)
除法指令(与乘法对应)idiv div
AX 低部分放商,高部分放余数
2、位运算指令
(1)逻辑非 NOT OPR 你影响标志位
(2)逻辑与 AND DST SRC 可以置0
(3)逻辑或 OR DST SRC 可以置1
(4)逻辑异或 XOR DST SRC 选择地对某些为制反,还可以对某些寄存器清零(XOR BH,BH)
(5)逻辑测试 TEST DST SRC 不改变目的操作数。进行与运算,测试位置1,其他的置0。
比如测试AL是不是偶数,最低位置1,其他0.
即TEST AL,1 ;若D0=0,则是偶数,ZF=1
JZ EVEN
3、移位指令,跟计组的移位差不多
逻辑左移
逻辑右移
算数左移
算数右移
循环
CF,等于移出去的值
OF与移位的位数有关,移1位则置1,其他置0
移位指令实现AX<-----(AX)*10
SHL AX,1
MOV BX,AX
SHL AX,1
SHL AX,1
ADD AX,BX
注意:SHL指令移位的位数,移多于1位的,要先放在CL。就像循环次数一定要放在CX一样
例子:把DX,AX中32位数值左移一位
SHL AX,1;这一步就把AX最高位移到了CF
RCL DX,1;带进位循环左移,刚好吧CF的值移到D0,其余的左移了一位
4、表达式计算
X、Y、Z、V、W都是16位有符号数,计算W<-----(V-(X*Y+Z-1234))/X
CWD是对AX扩展,放到DX,AX
指令寻址方式:确定下一条将要执行指令地址的方法(CS:IP)
1、直接寻址方式
目标地址相对于当前IP的位移量,转移到的目标地址就是当前IP加上位移量
2、间接寻址
先访问寄存器或存储器,得到的才是目标地址
段内转移:不用变CS。 64K范围 near ptr
短转移,偏移地址用一个字节表示的范围 short
段间转移: 1MB内 。要改CS和IP的值 far ptr
无条件转移指令JMP
JMP OPR 无条件跳到OPR标号 的位置开始执行
段内:IP<---(IP)+偏移量
段间:JMP FAR PTR OPR
条件转移指令:jcc label 范围:-127到128
JZ OPR ZF=1
JNZ OPR ZF=0
JS OPR SF=1
JNS OPR SF=0
JO OPR SF=1
JNO OPR SF=0
JP OPR PF =1
JNP OPR PF=0
JC OPR CF=1
JNC OPR CF=0
看标志开头字母
比较2个无符号数,根据结果转移
JA/JNBE OPR 大于转移
JAE/JNB OPR 大于等于转移
JNAE/JB OPR 小于转移
JNA/JBE OPR 小于等于转移
比较2个有符号数
JG/JNLE OPR >
JGE/JNL OPR >=
JNGE/JL OPR <
JNG/JLE OPR <=
循环指令:
先CX-1
再测试是否满足条件,满足转移,继续循环。
LOOP OPR CX!=0继续循环
LOOPZ ZF=1&&CX!=0 继续循环
LOOPNZ ZF=0&&CX!=0 继续循环
重复次数等于CX的值