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 ...