除法指令
- 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
总结:
- 除数:8bit或16bit 存在内存单元中或者寄存器中
- 被除数:存放在AX或者 AX和DX中 如果除数为8bit,被除数则为16bit,存放在AX中 如果除数为16bit,被除数则为32bit,AX存放低16bit,DX存放高16bit
- 结果:如果除数为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
本文转载自: https://blog.csdn.net/qq_44989881/article/details/117991043
版权归原作者 ʚVVcatɞ 所有, 如有侵权,请联系我们删除。
版权归原作者 ʚVVcatɞ 所有, 如有侵权,请联系我们删除。