汇编指令:大约包含100多个指令
- 类型:
- 数据传输指令:在寄存器或内存变量之间传输数据的命令
- 算术运算指令:加法、减法、乘法、除法等算术运算所需指令
- 逻辑运算指令:AND、OR、XOR、NOT等 与逻辑运算相关的指令
- 串操作指令、程序转移指令、其他指令
MOV指令:用于将一个数据从源地址传送到目标地址,相当于高级语言中的赋值
两个操作数的类型必须一致
格式为:MOV 目标操作数(destination),源操作数(source)
注意:是从后面的源操作数传送到目标操作数
例:
;MOV 目标,源 注释
MOV AX,DX ;DX寄存器的内容传送到AX里
MOV BX,WRD ;把变量WRD的值传送到BX里
MOV AL,'D' ;ASCII值44H传送到AL里
MOV CX,2500 ;2500传送到CX里
-MOV 指令的目标操作数和源操作数的关系 下图
XCHG指令:数据交换指令,交换两个操作数的内容。
不可以是操作单元、立即数
格式为:XCHG 目标操作数,源操作数
例:
;XCHG 目标,源 注释
XCHG DL,AL ;AL和DL的内容互相交换
XCHG AX,WRD ;AX和WRD的内容互相交换
-XCHG 指令的目标操作数和源操作数的关系 下图
下面这个例子是错误的:
XCHG WRD1,WRD2
修正以后:
MOV AX,WRD1 ;使AX的值等于WRD1的值,AX ← WRD1
XCHG AX,WRD2 ;两个值交换,AX ← WRD2, WRD2 ← AX (WRD1)
MOV WRD1,AX ;使WRD1的值等于AX的值,由第二步可得此时AX的值是最初WRD2的值,所以相当于是WRD1=WRD2,WRD1 ← AX (WRD2),至此完成两个变量交换
ADD指令:用于将两个寄存器的内容或寄存器与内存变量的内容相加
注意: 目标操作数可以是寄存器或者存储器,源操作数可以是立即数,寄存器或者存储器。但是源操作数和目标操作数不能同时为存储器。另外,不能对段寄存器进行加法运算
※不会改变源操作数的值,只会改变目标操作数
格式为:ADD 目标操作数,源操作数
例:
;ADD 目标,源 注释
ADD AX,BX ;AX和BX的值相加,存储到AX里
ADD WRD,CX ;WRD和CX的值相加,存储到WRD里
ADD CL,10 ;CL的值和10相加,存储到CL里
SUB指令: 用于将两个寄存器的内容或寄存器与内存变量的内容相减
注意:不会改变源操作数的值,只会改变目标操作数
格式为: SUB 目标操作数,源操作数
例:
;SUB 目标,源 注释
SUB AX,BX ;AX的值减BX的值,存储到AX里 相当于AX=AX-BX
SUB BYT,CL ;BYT的值减CL的值,存储到BYT里
SUB AX,-150
-ADD和SUB 指令的目标操作数和源操作数的关系 下图
INC指令:把目标操作数的值加1
格式为:INC 目标操作数
例:
;INC 目标操作数 注释
INC CL ;CL的值加1,存储到CL里 相当于CL=CL+1
INC WRD ;WRD的值加1,存储到WRD里
DEC指令:把目标操作数的值减1
格式为:DEC 目标操作数
例:
;DEC 目标操作数 注释 DEC AX ;AX的值减1,存储到AX里 相当于AX=AX-1 DEC BYT ;BYT的值减1,存储到BYT里
NEG指令: 把操作数按位取反加一 (可以用来求一个数的相反数)。 取补指令
格式为:NEG 目标操作数
NOT指令: 把操作数按位取反
格式为:NOT 目标操作数
例:
;NEG 目标操作数
NEG WRD
NEG BX
;NOT 目标操作数
NOT CX
将高级语言转换为汇编语言例子:
1)高级语言:B=A-2×C (相当于是B=A-C-C)
汇编语言↓
MOV AX,A ; AX ← A ,把A存放到AX里面
SUB AX,C ; AX ← (A-C) 用AX减C,也就是A-C,结果存放到AX里
SUB AX,C ; AX ← (A-2×C) 再次减去C存放到AX里
MOV B,AX ; B ← AX 把AX的值存放到B里
2)高级语言:A=3×B-C+10 (相当于是A=B+B+B-C+10)
汇编语言↓
MOV BL,B ; BL ← B
ADD BL,BL ; BL ← (B+B)
ADD BL,B ; BL ← (B+B+B)
SUB BL,C ; BL ← (3B-C)
ADD BL,10 ; BL ← (3B-C+10)
MOV A,BL ; A ← BL
DIV除法指令:用于无符号数的除法
格式为:DIV SRC
字节操作:16位被除数在AX,8位除数为源操作数百,结果的8位商在AL中,8位余数在AH中。表示为
(AL)<-(AX)/(SRC) 的商
(AH) <-(AX)/(SRC) 的余数
字操作:32位被除数放在DX,AX中。其中DX为高位字,专16位除数为源操作数,结果的16位端在AX中,16位余数属在DX中。表示为
(AX)<-(DX,AX)/(SRC) 的商
(DX)<-(DX,AX)/(SRC) 的余数
双字操作:64位被除数在EDX,EAX中,其中EDX为高位双字,32位除数为源操作数,结果的32位商在EAX中,32位余数在EDX中,表示为
(EAX)<-(EDX,EAX)/(SRC) 的商
(EDX)<-(EDX,EAX)/(SRC) 的余数。
商和余数均为无符号数。
比如我们要做 11/5 这个除法运算的时候,要把 11传送给AX,把5就是SRC
最后结果 的商是存储在AL里的,余数存储在AH里的
AH 和AL 可能我们在进行键盘输入输出的时候会把其中的值破坏,需要注意
例:写一个输出输入的两个数字之和的程序。如果总和超过10,首先输出1,输出1的位数。
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
MOV AH,2
MOV DL,'?'
INT 21H
MOV AH,1
INT 21H
MOV BL,AL ;把第一个数存储到BL里
SUB BL,30H ;BL转换成真实数值
INT 21H
MOV BH,AL ;把第二个数存储到BH里
SUB BH,30H ;BH转换成真实数值
ADD BL,BH ;把两个数相加
MOV AL,BL ;把相加的结果放到AL里
MOV AH,0 ;必须把AH先清零
MOV CL,10 ;CL传送10
DIV CL ;进行除法,因为此时AH已经被清空相当于AX只有AL在里面
CMP AL,1 ;判断商是否为1,如果为1表明加法运算后结果是大于10的
JE @DA ;如果是1就跳转DA
MOV AH,2
MOV DL,BL ;BL是两个数相加的结果
ADD DL,30H
INT 21H ;输出
JMP @END
@DA:
MOV CH,AH ;把余数先暂存CH
MOV AH,2
MOV DL,31H
INT 21H ;先输出31H(数字1)
MOV DL,CH
ADD DL,30H
MOV AH,2
INT 21H ;再输出余数
@END:
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
1 条评论
[…] 汇编(6)汇编指令 […]