組合語言實現定點原碼兩位乘法,組合語言實現定點原碼兩位乘法

2021-09-13 18:14:40 字數 5648 閱讀 3272

1樓:血色殘陽下的我

data segment

x db ? ;存放被乘數

y db ? ;存放成數

xb db ? ;存放補碼

c db 0

z db 0 ;結果值的正負值

num db ? ;輸入數字個數控制

str1 db 'input x=$'

str2 db 'input y=$'

str3 db 'output x*y=$'

str4 db 'input error,please input again!$'

str5 db '-0.$'

data ends

code segment

assume ds:data,cs:code

main proc far

mov ax,data

mov ds,ax

mov ax,0

mov ah,9 ;輸出字串str1

lea dx,str1

int 21h

call input ;呼叫輸入子程式,接收被乘數

mov x,bl ;把被乘數放入變數x中

mov dl,bl

neg dl ;對被乘數求補

mov xb,dl ;把補碼放入xb變數中

call crlf ;回車換行子程式

mov ah,9

lea dx,str2 ;輸出字串str2

int 21h

call input ;呼叫輸入子程式,接收乘數

mov y,bl ;把被乘數放入y

;*************************

mov ah,0 ;開始時部分積放入ah

mov al,y ;乘數放入al暫存器

mov cx,00h ;用於記錄部分積的移位次數,當等於三次後退出

again:

mov y,al ;自此以後變數y用於表示yi-1 yi c,用於判斷運算方法

and y,03h ;把y中的最低2位取出

shl y,1 ;邏輯左移y

mov bl,c

add y,bl ;拼接形成yi-1 yi c

;######### 以下用於判斷進行操作的方法

cmp y,00h

jnz l7

add ah,00h ; 操作:部分積+0

mov c,00h ; 操作:0—>c

l7:cmp y,01h

jnz l8

add ah,x ;操作:+x

mov c,00h ;操作:0->c

l8:cmp y,02h

jnz l9

add ah,x ;操作:部分積+x

mov c,00h ;操作:0->c

l9:cmp y,03h

jnz l10

mov bl,x

shl bl,1 ;乘數*2

add ah,bl ;部分積+2x

mov c,00h ;c賦值為0

l10:

cmp y,04h

jnz l11

mov bl,x

shl bl,1 ;乘數*2

add ah,bl ;相當於部分積+2x

mov c,00h ;0->c

l11:

cmp y,05h

jnz l12

add ah,xb ;加上x補碼,相當於減去x

mov c,01h ;欠下4x,1->c

l12:

cmp y,06h

jnz l13

add ah,xb ;部分積減去x

mov c,01h ;欠下4x,1->c

l13:

cmp y,07h

jnz l14

add ah,0 ;部分積+0

mov c,01h ;繼續上步欠下的4x,1->c

jmp l14 ;繞過橋標籤

qiao:

jmp again ;相當於橋的功能,接著下面jnz跳轉到again標籤

l14:

sar ax,1

sar ax,1 ;ax暫存器的內容算術右移兩位,此步根據上面的判斷都要被執行

inc cx ;計數器加一

cmp cx,03h ;因為數值位最多6位,移動三次

jnz qiao

cmp c,01h ;最後一次運算欠下4x即c=1,此時還要加上x

jnz l15

add ah,x

l15: ;乘積完成,其中部分積放在了ah低六位和al的高六位

;****************** 以下用於完成輸出乘積

and al,11111100b ;遮蔽al的低二位

mov bx,ax ;把ax放入bx,左移兩位,去掉兩個符號位

shl bx,1

shl bx,1

call crlf ;換行

mov ah,09h ;輸出字串str3

lea dx,str3

int 21h

cmp z,1 ;若記錄符號位的z=1則,運算結果一定為負值

jnz l18 ;其他值則結果為正數

mov ah,09h ;若乘積為負值則輸出字串str5

lea dx,str5

int 21h

jmp l19

l18:

mov dl,'0' ;輸出字元『0』

mov ah,02h

int 21h

mov dl,'.' ;輸出字元'.'

mov ah,02h

int 21h

l19:

mov cx,0ch ;迴圈輸出bx中存放的乘積,迴圈次數最多為12次

again2:

shl bx,1 ;邏輯左移一位

jc l16 ;判斷移出位是否為1或0

mov dl,'0' ;移出位為0時輸出字元'0'

mov ah,02h

int 21h

cmp bx,0 ;判斷bx中乘積是否全被移出

jz l20 ;若bx=0則全部移出,結束

jmp l17

l16:

mov dl,'1' ;移出位為1則輸出字元'1'

mov ah,02h

int 21h

cmp bx,0 ;同樣判斷bx是否為0

jz l20

l17:

loop again2 ;迴圈移位

l20:

mov ax,4c00h

int 21h ;主程式結束

;***************** 輸入x,y的子程式

input proc near

push ax ;儲存現場,避免影響主程式執行

push dx

mov bl,0 ;用於存放小數部分數值

mov num,0 ;num儲存輸入小數位的個數,最大為6

jmp l3

again1:

call crlf

mov num,0

mov ah,09h ;輸出字串str4,提示出錯資訊

lea dx,str4

int 21h

call crlf

l3:mov ah,01h ;接收第一個字元

int 21h

cmp al,'-' ;若為'-'表示輸入的為負小數,下兩位必須為0.

jz l1

l4:cmp al,'0'

jnz again1 ;如果不是0,則重新輸入

mov ah,01h ;接著接收到的字元必須為'.'

int 21h

cmp al,'.'

jnz again1 ;若不為'.'則重新輸入

jmp l2 ;符號位和0.接收判斷確認正確後則跳到l2->l5開始接收小數部分

l1: ;表示接收的為負數,則z加一

add z,1

mov ah,01h

int 21h

jmp l4 ;接收了一個'-'號,則下一步必須進行判斷是否接收到'0.'

mov bx,0

mov num,0

l2:jmp l5

l6:sub al,30h ;將接收到的ascii碼轉化為數字

add bl,al ;接收到的數字加到bl中

shl bl,1 ;並將bl左移一位為拼接下一個數字做準備

add num,1

cmp num,6 ;若接收小數位數為6位時則退出接收數字的程式

jz in_over

l5:mov ah,01h ;對接收到的字元判斷

int 21h

cmp al,'0'

jz l6

cmp al,'1'

jz l6

jmp again1 ;如果接收到的字元不是'1'和'0'則提示錯誤輸入,並重新輸入

in_over: ;接收完畢

shr bl,1 ;因為bl在最後一步多向左移了一位,則向右移

pop dx ;恢復現場

pop ax

retinput endp

crlf proc near ;回車換行子程式

push ax

push dx

mov dl,0dh ;顯示回車

mov ah,02h

int 21h

mov dl,0ah ;顯示換行

mov ah,02h

int 21h

pop dx

pop ax

retcrlf endp

code ends

end main

2樓:匿名使用者

入口條件:被乘數在r2、r3中,乘數在r6、r7中。

出口資訊:乘積在r2、r3、r4、r5中。

影響資源:psw、a、b、r2~r7 堆疊需求: 2位元組muld: mov a,r3 ;計算r3乘r7mov b,r7

mul ab

mov r4,b ;暫存部分積

mov r5,a

mov a,r3 ;計算r3乘r6

mov b,r6

mul ab

add a,r4 ;累加部分積

mov r4,a

clr a

addc a,b

mov r3,a

mov a,r2 ;計算r2乘r7

mov b,r7

mul ab

add a,r4 ;累加部分積

mov r4,a

mov a,r3

addc a,b

mov r3,a

clr a

rlc a

xch a,r2 ;計算r2乘r6

mov b,r6

mul ab

add a,r3 ;累加部分積

mov r3,a

mov a,r2

addc a,b

mov r2,aret

如何使用組合語言實現多位十進位制數相加

多少位十進位制數相加?用組合語言 編一程式把鍵入的十六進位制數轉化 成十進位制數。50 用組合語言如何實現 3個 16位二進位制數相加 你這是兩個三位元組的二進位制數,即24位的二進位制數,不叫3個16位二進位制數,只是兩個數相加。你的程式這麼寫,每一個數是先存放高位,後放低位。如被加數放20h,先...

微控制器高手們誰會用組合語言實現0 99間的計數 暫停 清零程式。對初學者實在是太難了。大神幫幫忙吧

org 0000h ljmp main org 000bh ljmp t0isr org 0030h able 共陰極數碼管顯示 表db 3fh,06h,5bh,4fh,66h 12345db 6dh,7dh,07h,7fh 6789main mov sp,5fh mov tmod,01h mov ...

什麼是組合語言,什麼是彙編和組合語言?

組合語言就是計算機語言,它是有0,1組成的.通俗的說就是我們人和計算機交流的語言.介於機器語言和高階語言之間的一種 什麼是彙編和組合語言?彙編語copy言是一種低階計算bai機程式語言,說 低階du 並不是指語言的功能和複雜程度,而是它zhi出現在計算機發展史dao的早期,但現在仍廣泛應用於計算機開...