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

2021-09-13 18:13:38 字數 5648 閱讀 3395

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

如何用組合語言實現微控制器比較轉移

pan clr cy mov 30h,a subb a,10 jb cy,prog1 mov a,30h clr cy subb a,20 jb cy,prog2 mov a,30h clr cy subb a,30 jb cy,prog3 prog1 nop prog2 nop prog3 nop...

王爽組合語言實驗10除法溢位公式疑惑

把一個 32 位的數字 x,分成兩個 16 位的暫存器存放,如 dx 為高字,ax 為低字。用語言描述 x 時,就要說 x dx 65536 ax。程式設計時,分開存放,就行了。並不需要真的乘以 65536。其實相當於用c語言中的陣列,來解決,比如兩個陣列第一個放12第二個放34 現在把第一個陣列放...

求大神解答,用51微控制器組合語言實現紅綠燈的程式,不是路口的,大概註釋下就好

程式實現功能 西南北路口直行與轉彎交替通行,數碼管顯示直行通行倒計時,紅綠黃燈顯示包括人行道在內的道路交通狀態。某一方向道路擁擠時,可以人工控制調節東西南北方向通行時間。緊急情況時,各路 通燈顯示紅燈,數碼管保持資料不變。工作暫存器及儲存單元分配 1.工作暫存器 r2設定為定時器定時中斷次數,r6 ...