汇编指令:大约包含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 ← (3B-C)
ADD     BL,10      ; BL ← (3B-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

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏