汇编语言 乘法和除法指令

除法指令
  • DVI无符号数除法指令

  • 指令格式:DIV 源

  • 指令功能:对两个无符号二进制数进行除法操作。源操作数可以是字或字节。

  • 如果源操作数为字节,16位被除数必须放在AX中,8位除数为源操作数,它可以是寄存器或存储单元。相除之后,8位商在AL中,余数在AH中。即

    AL ← AX/源(字节)的商
    AH ← AX/源(字节)的余数

  • 要是被除数只有8位,必须把它放在AL中,并将AH清0,然后相除。

  • 如果源操作数为字,32位被除数在DX、AX中,其中,DX为高位字,16位除数作源操作数,它可以是寄存器或存储单元。相除之后,AX中存16位商,DX中存16位余数。即

    AX ← (DX, AX)/源(字)的商
    DX ← (DX,AX)/源(字)的余数

  • 要是被除数只有16位,除数也是16位,则必须将16位被除数送到AX中,再将DX寄存器清0,然后相除。

  • 与被除数和除数一样,商和余数也都为无符号数。DIV指令执行后,所有标志均无定义。

; 以下程序实现 1001 ÷ 100 的结果
assume cs:code, ds:data, ss:stack

data segment
		db 256 dup(0)
data ends


stack segment stack
			db 128 dup(0)
stack ends


code segment

start:		
			mov ax, stack
			mov ss, ax
			mov sp, 128
			
			mov ax, 1001
			mov bl, 100
			div bl
			
			
			mov ax, 4C00H
			int 21					
code ends

end start

代码执行结果:
在这里插入图片描述

; 以下程序实现 100001 ÷ 100 的结果
assume cs:code, ds:data, ss:stack

data segment
		dd  	100001
		dw      1
		db      1
data ends


stack segment stack
			db 128 dup(0)
stack ends


code segment

start:		
			mov ax, stack
			mov ss, ax
			mov sp, 128
			
			mov ax, data
			mov ds, ax
			
			mov ax, ds:[0]
			mov dx, ds:[2]
			
			mov bx, 100
			div bx
			
			
			mov ax, 4C00H
			int 21					
code ends

end start

代码执行结果:

在这里插入图片描述

; 以下程序使用 word ptr 实现 1232131 ÷ 100 的结果
assume cs:code, ds:data, ss:stack

data segment
		dd  	1232131  ;  dd 占用4个字节
		dw      100      ; dw  占用 2个字节
		db      1        ; db 占用一个字节
data ends


stack segment stack
			db 128 dup(0)
stack ends

code segment

start:		
			mov ax, stack
			mov ss, ax
			mov sp, 128
			
			mov ax, data
			mov ds, ax
			
			mov ax, ds:[0]
			mov dx, ds:[2]
			
			div word ptr ds:[4]
			
			mov ax, 4C00H
			int 21					
code ends

end start

在这里插入图片描述

总结:

  1. 除数:8bit或16bit 存在内存单元中或者寄存器中

  2. 被除数:存放在AX或者 AX和DX中
    如果除数为8bit,被除数则为16bit,存放在AX中
    如果除数为16bit,被除数则为32bit,AX存放低16bit,DX存放高16bit

  3. 结果:如果除数为8bit,则AL 存商,AH存放余数
    如果除数为16bit,则AX存放商,DX存放余数


乘法指令

MUL 无符号数乘法指令

  • 指令格式:NUL 源
  • 指令功能:把源操作数和累加器中的数都当成无符号数,然后将两数相乘,源操作数可以是字节或字。
  • 如果源操作数是一个字节,它与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送到AL。即
    • AX ← AL * 源
  • 如果源操作数是一个字,则它与累加器AX的内容相乘,结果为32位数,高位字放在DX寄存器中,低位字放在AX寄存器中。即
    • (DX,AX) ← AX * 源
  • 乘法指令中,源操作数可以是寄存器,也可以是存储单元,但不能是立即数。当源操作数是存储单元时,必须在操作数前加BYTE 或 WORD 说明是字节还是字。
; 以下程序实现 200 * 29 的结果
assume cs:code, ds:data, ss:stack

data segment
		db 256 dup(0)
data ends

stack segment stack
		db 128 dup(0)
stack ends

code segment
		start:	mov ax, stack
				mov ss, ax
				mov sp, 128
				
				mov al, 200
				mov bl, 29
				mul bl
				
				mov ax, 4C00H
				int 21H
				
code ends

end start

在这里插入图片描述
在这里插入图片描述

; 以下程序实现 200 * 50 的结果
assume cs:code, ds:data, ss:stack

data segment
		db 50
data ends

stack segment stack
		db 128 dup(0)
stack ends

code segment
		start:	mov ax, stack
				mov ss, ax
				mov sp, 128
				
				mov bx, data
				mov ds, bx
				
				mov al, 200
				mul byte ptr ds:[0]
				
				mov ax, 4C00H
				int 21H
				
code ends

end start

在这里插入图片描述

在这里插入图片描述

; 以下程序实现 200 * 12345 的结果
assume cs:code, ds:data, ss:stack

data segment
		db 256 dup(0)
data ends

stack segment stack
		db 128 dup(0)
stack ends

code segment
		start:	mov ax, stack
				mov ss, ax
				mov sp, 128
				
				mov bx, data
				mov ds, bx
				
				mov ax, 200
				mov bx, 12345
				mul bx
				
				mov ax, 4C00H
				int 21H
				
code ends

end start

在这里插入图片描述
在这里插入图片描述

; 以下程序实现 54321 * 200 的结果
assume cs:code, ds:data, ss:stack

data segment
		dw 54321
data ends

stack segment stack
		db 128 dup(0)
stack ends

code segment
		start:	mov ax, stack
				mov ss, ax
				mov sp, 128
				
				mov bx, data
				mov ds, bx
				
				mov ax, 200
				mul word ptr ds:[0]
				
				mov ax, 4C00H
				int 21H
				
code ends
end start

在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值