
data segment
msg_input db 'input two numbers:$'
msg_result db 'the result:$'
x dw ?运算时吵友橘的中转站
y dw ?
data ends
code segment
assume cs:code,ds:data
main proc near
start:
mov ax,data
mov ds,ax
mov dx,offset msg_input
mov ah,09h
int 21h
call crlf
--接收数字并作乘法告岁运算,将最终结果存放于bx寄存器中--
call decibin
call crlf
mov x,bx
call decibin
call crlf
mov ax,bx
mul x
mov bx,ax
-----------------------------------------------
mov dx,offset msg_result
mov ah,09h
int 21h
call crlf
call bini显示结果
mov ah,4ch
int 21h
ret
main endp
-----------------接收数字的子程序--------------
decibin proc near
mov bx,0
newchar:
mov ah,1
int 21h
sub al,30h
jl exit
cmp al,9d
jg exit
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit:
ret
decibin endp
-----------将数字输出的子程序---------------
bini proc near
mov cx,1000d
call bin
mov cx,100d
call bin
mov cx,10d
call bin
mov cx,1d
call bin
ret
bini endp
bin proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
ret
bin endp
----------------------------------------------
---------------回车换行子程序-----------------
crlf proc near
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,02h
int 21h
ret
crlf endp
----------------------------------------------
code ends
end start
下面是32位无符号数乘16位的无符号数的计算子程序,解决8086本身指令无法解决的问题。其实如果在没有乘法指令mul时,就是采用移位相加的方法来实现乘法运算的 !
对于有符号数的乘法运算,是对负数求补后当作无符号数计算,计算完后在来处理符号。
无符号乘法子程序 (mul指令只能实现16位乘16位,本子程序实现32位乘16位--限定数的大小,结果仍为32位)
被乘数放置于dx,ax 中, 乘数放置于 bx中
结果放置于dx,ax中(dx为高16位,ax为低16位)
MULT PROC NEAR
PUSH BX
PUSH CX
PUSH SI
PUSH DI
PUSH BP
PUSHF
MOV SI,0
MOV DI,0
CMP BX,0
迅态扰 JE @MULTEXIT
@MULT1: SHR BX,1
闭兆 JNC @MULT2
ADD SI,AX
ADC DI,DX
@MULT2: SHL AX,1
RCL DX,1
CMP BX,0
JNE @MULT1
MOV DX,DI
MOV AX,SI
POPF
POP BP
POP 亩旦 DI
POP SI
POP CX
POP BX
RET
@MULTEXIT:
MOV AX,0
MOV DX,0
POPF
POP BP
POP DI
POP SI
POP CX
POP BX
RET
MULT ENDP
正确的:-a
1386:0100
mov
ax,8000
1386:0103
mov
dx,0
1386:0106
mul
dx
1386:0108
-t
AX=8000
BX=0000
CX=0000
DX=0000
SP=FFEE
BP=0000
SI=0000
DI=0000
DS=1386
ES=1386
SS=1386
CS=1386
IP=0103
NV
UP
EI
PL
NZ
NA
PO
NC
1386:0103
BA0000
MOV
DX,0000
-t
AX=8000
BX=0000
CX=0000
DX=0000
SP=FFEE
BP=0000
SI=0000
DI=0000
DS=1386
ES=1386
SS=1386
CS=1386
IP=0106
NV
UP
EI
PL
NZ
NA
PO
NC
1386:0106
F7E0
MUL
dx
-t
AX=0000
BX=0000
CX=0000
DX=0000
SP=FFEE
BP=0000
SI=0000
DI=0000
DS=1386
ES=1386
SS=1386
CS=1386
IP=0108
OV
UP
EI
PL
NZ
NA
PO
CY
1386:0108
29C1
SUB
CX,AX
解释:
乘法指令是“单” *** 作数:如果是8位相乘,一个让燃乘数默认是在AL中,另一个乘数由指令给出,必须是游滑悔8位的寄存器或内存单元,结果为16位,默认放在AX中如果是16位相乘,一个乘数默认神正是在AX中,另一个乘数由指令给出,必须是16位的寄存器或内存单元,结果为32位,默认放在AX(低16位)和DX(高16位)中也就是说,虽然乘法是2个 *** 作数,但是指令只给出一个,另外一个是系统默认的。
例如:mov
ax,1122h
mov
bx,3344h
mul
bl
完成al*bl,结果放在ax
mul
bx
完成ax*bx,结果放在ax和dx
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)