汇编:加减乘除指令

加法指令 (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位乘积存于DXAX中,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

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值