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的早期,但現在仍廣泛應用於計算機開...