基本指令

这一篇主要介绍汇编中的基本指令,所谓基本,就是汇编中最常用且不可或缺的指令,就像在学习高级语言时我们常常先学习基本的赋值、输入输出方式那样。

赋值指令

汇编语言的赋值指令MOV可以看成其他高级语言中的“==”指令

使用方法为

;把寄存器BX中的值给AX
MOV AX,BX
;把变量A中的值放入寄存器AX中
MOV AX,A

示例

算术运算指令

算术运算指令介绍几个常用的运算,以下DST是目的操作数的缩写,SRC是源操作数的缩写

加法指令

加法分为一般的加法(无进位)和带进位加法

(1)ADD 加法

使用方式:ADD DST,SRC

执行的操作:(DST)<==(SRC) + (DST)

例如:AX=1,BX=1 执行ADD AX,BX后AX=2,BX=1

(2)ADC 带进位加法

带进位加法与一般的加法指令不同,要考虑进位也就是CF位

使用方式:ADC DST,SRC

执行的操作:(DST)<==(SRC) + (DST) + CF

(3)INC 加1

这条指令有点像高级语言中的“++”运算符

使用方式:INC (OPR)

执行的操作:(OPR)<==(OPR) + 1

在我阅读的汇编语言教材中还有XADD这一条指令,由于我没有使用过,就不在文章中写出来了。

减法指令

减法分为一般的减法(无借位)和带借位减法

(1)SUB 减法

使用方式:SUB DST,SRC

执行的操作:(DST)<==(DST) - (SRC)

(2)SBB 带借位减法

使用方式:SBB DST,SRC

执行的操作:(DST)<==(DST) - (SRC) - CF

(3)DEC 减1

类似高级语言中的“--”运算符

使用方式:DEC OPR

执行的操作:(OPR)<==(OPR)-1

(4)NEG 求补

使用方式:NEG OPR

执行的操作:(OPR)<==(OPR)

(5)CMP 比较

CMP和SUB指令一样都进行减法操作,但和SUB指令不同的是,CMP指令不会将结果保存下来,只是根据结果设置对应标志位的值。在之后讲到条件转移时,我们会经常用到这条指令。

使用方式:CMP OPR1,OPR2

执行的操作:(OPR1) - (OPR2) 结果不会被保存

涉及到乘法除法的操作时,我们就需要考虑带符号数和无符号数的区别

乘法指令

(1)MUL 无符号数乘法

使用方式:MUL SRC

执行的操作:

对字节操作数:(AX)<==(AL)*(SRC)

对字操作数:(DX,AX)<==(AX)*(SRC)

(2)IMUL 带符号数乘法

与MUL指令执行的操作相同,因此不赘述,但注意运算的对象必须是带符号数

除法指令

(1)DIV 无符号数除法

使用方式:DIV SRC

执行的操作:

对字节操作数:(AL)<==(AX)/(SRC)的商

​ (AH)<==(AX)/(SRC)的余数

对字操作数:(AX)<==(DX,AX)/(SRC)的商

​ (DX)<==(DX,AX)/(SRC)的余数

(2)IDIV 带符号数除法

使用方式:IDIV SRC

执行的操作:和DIV指令相同,但是操作数必须是带符号数,商和余数也是带符号数能,余数和被除数的符号相同

逻辑运算指令

逻辑与 AND

将两个操作数各位进行与操作,其中与的规则为:1&1=1,1&0=0,0&1=0,0&0=0(可以记为有0得0,全1得1)

使用方式:AND DST,SRC

执行的操作:(DST)<==(DST)^(SRC)

逻辑或 OR

将两个操作数各位进行或操作,其中与的规则为:1||1=1,1||0=1,0||1=1,0&0=0(可以记为有1得1,全0得0)

使用方式:OR DST,SRC

执行的操作:(DST)<==(DST)∨(SRC)

逻辑非 NOT

非操作就是将二进制位的数1变0,0变1

使用方式:NOT OPR

执行的操作:将操作数OPR取反后放到原来的位置

TEST指令

这是一条很重要的指令,如果你想要测试两个操作数逻辑与的结果,而不希望保存这个结果,那么使用TEST指令

使用方式:TEST OPR1,OPR2

执行的操作:(OPR1)^(OPR2)

移位指令

移位指令实在有些复杂,有逻辑左/右移,循环左/右移,算术左/右移,这些名词听起来就觉得脑袋晕晕的,我认为分辨这些指令最好的方式就是画图!!!

汇编语言图

逻辑左移

SHL

使用方式:SHL OPR,CNT

说明:这里和下面的CNT指的是移位次数,当移位次数等于1时可以直接写出(即采用立即数的方式),大于1时一般把CNT存放在CL寄存器中

逻辑右移

SHR

使用方式:SHR OPR,CNT

循环左移

ROL

使用方式:ROL OPR,CNT

循环右移

ROR

使用方式:ROR OPR,CNT

带进位循环左移

RCL

使用方式:RCL OPR,CNT

带进位循环右移

RCR

使用方式:RCR OPR,CNT

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