两个相乘数,要么都是8位,要么都是16位。 8位乘法,16位乘法。
如果是8位,一个数字默认存放在al中,另外一个数字存放在其他8位寄存器中或者字节型内存单元中。
mul 8位寄存器 ;结果存放在ax中
mul byte ptr ds:[0] ;结果存放在ax中
如果是16位,一个数字默认存放在ax中,另外一个数字存放在其他16位寄存器中或者字型内存单元中。
mul 16位寄存器 ;结果存放在dx, ax中
mul word ptr ds:[0] ;结果存放在dx, ax中
结果: 8位乘法,得到一个16位数, 结果存放在ax中
16位乘法,得到一个32位数, 低16位存放在ax中,高16位存放在dx中
assume cs:code, ds:data, ss:stack
data segment
dd 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 di, 0
call init_reg
mov bx, 5 ; 参数
call get_cube ; 对参数进行处理
mov es:[di+0], ax ;call程序的返回值
mov es:[di+2], dx
mov ax, 4C00H
int 21H
;================================ 切割逻辑
get_cube: push bx
mov ax, bx
mul bx
mul bx
pop bx
ret
;=================================
init_reg: mov ax, data
mov ds, ax
mov es, ax
ret
code ends
end start
assume cs:code, ds:data, ss:stack
data segment
dw 11,22,33,44,55,66,77,88
dd 0,0,0,0,0,0,0,0
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 128
call init_reg
call number_cube
mov ax, 4C00H
int 21H
;================================
number_cube:
mov cx, 8
mov si, 0
mov di, 16
cube: mov bx, ds:[si]
call get_cube
mov es:[di], ax
mov es:[di+2], dx
add si, 2
add di, 4
loop cube
ret
;================================ 切割逻辑
get_cube: push bx
mov ax, bx
mul bx
mul bx
pop bx
ret
;=================================
init_reg: mov ax, data
mov ds, ax
mov es, ax
ret
code ends
end start