加法指令 (ADD)
ADD指令用于将两个操作数相加,结果存储在第一个操作数中。 语法:
ADD destination, source
示例:
assume cs:code
code segment
mov ax,3
mov bx,2
add ax,bx //相加,结果会放在ax中
mov ax,4c00h
int 21h
code ends //代码段结束
end //汇编程序结束
.code
标识代码段开始,程序的指令从这里开始;assume cs:code
:指令告诉汇编器,代码段寄存器(CS)将使用标记为code
的段;
code segment
定义了一个名为code
的代码段;这个段内包含了接下来的所有指令:
mov ax,3
将立即数3加载到AX寄存器中;AX是一个16位的通用寄存器,用于存储操作数或结果。
mov bx,2
将立即数2加载到BX寄存器中;BX也是一个16位的通用寄存器。
add ax,bx
将AX和BX寄存器中的值相加,结果存储在AX寄存器中;此时,AX的值是5(3 + 2 = 5)。
mov ax,4c00h
将立即数4C00h(十六进制的4C00)加载到AX寄存器中;这是用于DOS系统调用的特殊值。
int 21h
触发中断21h,这是DOS系统调用的入口点。结合之前的指令mov ax, 4c00h
,这个中断指令的作用是终止程序并返回到DOS;具体来说,4C00h中的4C是DOS的终止程序功能码,00是返回码。、
code ends
表示代码段的结束; end
指示汇编程序的结束,并告诉链接器程序从哪里开始执行。默认情况下,汇编程序从段的开头开始执行。
具体的执行过程
接着使用MASM
套件中的ML.exe
将汇编代码生成exe
程序,接着使用debug
工具来进行低级别的调试和汇编编程;debug
是一个命令行程序,提供了直接与内存和硬件交互的能力。(尽管debug
在现代操作系统中不再常用,但它仍然可以在Windows XP下运行。)
cmd中输入:
debug exe程序名称
输入r
显示所有寄存器的值;
接着输入p
或者t
继续执行程序,此时立即数3被加载进AX寄存器中;
接着往下执行,发现立即数2被载入BX寄存器中,且AX寄存器中的值和BX寄存器中的值相加,存储在BX寄存器中。
最后传入4c00h到AX寄存器中,并调用中断,程序成功退出。
补充:T参数和P参数的区别
-
T 命令(单步执行):逐条指令执行,遇到子程序调用时进入子程序逐步执行。
-
P 命令(过程执行):逐条指令执行,但遇到子程序调用时执行完整个子程序。
减法指令 (SUB)
SUB
指令用于将第二个操作数从第一个操作数中减去,结果存储在第一个操作数中。 语法:
SUB destination, source
示例:
mov eax, 10 ; 将10赋值给eax寄存器
sub eax, 4 ; 将eax寄存器的值减去4,结果存储在eax中
; eax现在的值是6
乘法指令 (MUL 和 IMUL)
1.MUL
指令用于无符号乘法,语法:
MUL source ; 结果存储在AX、DX:AX或EDX:EAX中,取决于操作数的大小
MUL
指令将两个操作数相乘,并将结果存储在一个或多个寄存器中;MUL
指令通常用于乘法运算,它可以是一个乘法操作数与累加器的相乘,也可以是一个乘法操作数与其他寄存器或内存中的值相乘。
示例:
乘以其他寄存器或内存中的值
MOV AX, 5 ; 将5加载到AX寄存器中
MOV CX, 10 ; 将10加载到CX寄存器中
MUL CX ; 将AX和CX寄存器中的值相乘,结果存储在AX中,AX = AX * CX
可以看到在使用mul
指令时需要将被乘数提前放入AX
寄存器中。
注意: 当16位乘法时,32位乘积存于DX
和AX
中,8位乘法,乘积存于AX
中。
2.IMUL
指令用于有符号乘法。 语法:
IMUL destination, source1, source2 ; 目标寄存器 = source1 * source2
示例:
mov eax, 5 ; 将5赋值给eax寄存器
mov ebx, 3 ; 将3赋值给ebx寄存器
imul eax, ebx ; eax = eax * ebx
; eax现在的值是15
EAX
是x86系列处理器中的一个32位寄存器。它是“扩展累加器”(Extended Accumulator)的缩写,也可以称为“累加器”。在32位模式下,EAX
是一个通用寄存器,可用于存储数据和执行算术和逻辑操作。EAX
寄存器在处理器中具有特殊的用途,通常用于存放函数的返回值,也用于存储临时数据。
除法指令 (DIV 和 IDIV)
1.DIV
指令用于执行无符号除法。它将累加器(AX)中的值除以一个操作数,并将商存储在累加器中,余数存储在另一个指定的寄存器中。DIV
指令通常用于除法运算,它可以是累加器与一个除数的相除,也可以是累加器与其他寄存器或内存中的值相除。 语法:
DIV source ; 被除数在AX或DX:AX中,结果商存储在AX中,余数存储在DX中
示例:
MOV AX, 10 ; 将10加载到AX寄存器中
MOV CX, 2 ; 将2加载到CX寄存器中
DIV CX ; 将AX寄存器中的值除以CX寄存器中的值,商存储在AX中,余数存储在DX中,AX = AX / CX,DX = AX % CX
在这个示例中,AX
的值将变为 5(10 / 2),DX
的值为 0。
在16位除法中,如果被除数大于16位,则高位存放于DX
中,低位存放于AX
中;
2.IDIV
指令用于执行有符号除法;它将累加器中的有符号整数除以一个操作数,并将商存储在累加器中,余数存储在另一个指定的寄存器中。IDIV
指令通常用于有符号除法运算,它可以是累加器与一个除数的相除,也可以是累加器与其他寄存器或内存中的值相除。语法:
IDIV source
示例:
MOV AX, 20 ; 将有符号数 20 加载到 AX 寄存器中
MOV DX, -5 ; 将有符号数 -5 加载到 DX 寄存器中
IDIV DX ; 将 AX 中的值除以 DX 中的值,商存储在 AX 中,余数存储在 DX 中,AX = AX / DX,DX = AX % DX
乘法和除法操作可能会改变多个寄存器的值,所以要注意保存和恢复必要的寄存器值。
自加指令(INC)
在汇编语言中,自加操作通常使用 INC
(Increment,增加)指令来实现;INC` 指令用于将一个操作数的值增加1。
语法
INC destination
使用:
mov AX,3
INC AX ; 将AX寄存器中的值增加1
;此时AX寄存器中的值位4
自减指令(DEC)
在汇编语言中,自减操作通常使用 DEC
(Decrement,递减)指令来实现。DEC
指令用于将一个操作数的值减去1。
语法:
DEC destination
使用:
mov AX,3
DEC AX ; 将AX寄存器中的值减去1
; 此时AX中的值为2