加法指令 (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
![[C语言]自定义类型详解:结构体、联合体、枚举](https://img-blog.csdnimg.cn/direct/98e2b0b2dcc444b59dabcd1a48b1830b.png)












![[SCTF2019]babyre](https://img-blog.csdnimg.cn/direct/60cc0cbdf2e64ca39118ca2bf8241b29.png)




