请问汇编怎样用乘法

请问汇编怎样用乘法,第1张

结果在3-4位,最小为100,最大为9801,规定升团均以四位表示如100显示为0100

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12256857.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存