
datasegment
num1db0;3dup()
num2db0;3dup()
dataends
codesegment'code'
assumecs:code,ds:data
start:
movax,data
movds,ax
movsi,offsetnum1
输入一组数
movah,01h
int21h
subal,'0';;
movdl,al
movcl,3
shlal,cl
shldl,1
addal,dl
mov[si],al
movah,01h
int21h
subal,'0'
add[si],al
movah,01h
int21h
movbx,offsetnum2
再输入一组数
movah,01h
int21h
subal,'0'
movdl,al
movcl,3
shlal,cl
shldl,1
addal,dl
mov[bx],al
movah,01h
int21h
subal,'0'
add[bx],al
movah,02h
movdl,0dh
int21h
movdl,0ah
int21h
把两组数求和
moval,[bx]
addal,[si];al=sum
xorah,ah
movcl,100
divcl
movbx,ax
testal,al
jz @f
addal,'0'
movdl,al
movah,02h
int21h
@@:
moval,bh
xorah,ah
movcl,10
divcl
movbx,ax
addal,'0'
movdl,al
movah,02h
int21h
addbh,'0'
movdl,bh
movah,02h
int21h
movah,4ch
int21h
codeends
endstart
inputexample:
1234<Enter>
or
0208<Enter>
扩展资料:
十进制转二进制代码:
voiddectobin(intn){
intresult=0,k=1,i,temp;
temp=n;
while(temp){
i=temp%2;
result=ki+result;
k=k10;
temp=temp/2;
}
printf("%d\n",result);
}
算法分析:
在实现模2取余后需要逆序输出,这个地方通过不断乘以10来实现后一位比前一位的位数多10,不需要再通过数组或者逆序函数来实现。
参考这个两个6位BCD加法子程序,加数放在33,34,35;被加数放在30,31,32,和放在R2,R3,R4进位在C
QH:
MOV A,30H
ADD A,33H
DA A
MOV R1,A
MOV A,31H
ADDC A,34H
DA A
MOV R2,A
MOV A,32H
ADDC A,35H
DA A
MOV R3,A
RET
assume cs:code,ds:data
data segment
data1 db 12h,34h,56h ;按照高高低低的顺序保存在内存中的,所以是563412h,下同
data2 db 0abh,0cdh,0efh
ans dd
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,offset ans
mov di,offset data1
mov si,offset data2
mov ax,[di]
add ax,[si]
mov [bx],ax
mov ax,[di+1]
adc ax,[si+1] ;用adc带进位加法就能算高位的值了
mov [bx+1],ax
mov ax,[di+2]
adc ax,[si+2]
mov [bx+2],ax
mov ax,0
adc ax,0 ;3字节的值加上有进位,所以要算第4字节的
mov [bx+3],ax
mov ah,4ch
int 21h
code ends
end start
计算的是563412h+efceabh的值,结果是14602bdh,结果无误。可以自己用debug试试
assume cs:cseg
cseg segment
hextab db '0123456789ABCDEF'
A dd 11118888H
b dd 33339444H
c dd 0
start:
mov ax, cseg
mov ds, ax
mov ax, word ptr a
add ax, word ptr b
mov word ptr c, ax
mov ax, word ptr a+2
adc ax, word ptr b+2
mov word ptr c+2, ax
;16进制显示结果
lea bx, hextab
mov ah, 0eh
;高16位
mov dx, word ptr c+2
mov cx, 404h
c1:
rol dx, cl
mov al, dl
and al, 0fh
xlat
int 10h
dec ch
jnz c1
;低16位
mov dx, word ptr c
mov cx, 404h
c2:
rol dx, cl
mov al, dl
and al, 0fh
xlat
int 10h
dec ch
jnz c2
mov ah,4ch
int 21h
cseg ends
end start
ORG 8000H DADD:MOV R0,#DS ;置被加数指针 MOV R1,#DD ;置加数指针 MOV R7,#N ;置循环次数 CLR C ;清进位 NEXT: MOV A,@R0 ;取数 ADDC A,@R1 ;求和 DA A ;调整 MOV @R0,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,NEXT ;未完,继续 DS: DB 20H,35H,27H ······ DD: DB 12H,40H, 11H ······ N : EQU DD一DS END
楼主,你用是什么的汇编啊。是8088/8086,还是单片机的,是什么公司的产品,什么型号的,它们都是有一些差异的。
我在这就说一下思路吧。用汇编做加减法比较容易,带进位不带进位的都可以,做乘除是比较难的,一般是不用它做的,必须时也最好转换成加减,这样在实现的时候才会方便。
我再说点MC51的汇编语言,也许你能用上。(都是一些语法)
带进位加法:addc a,#data ;(a)+#data+(c)--> (a)
addc a,data ;(a)+(data)+(c)-->(a)
addc a,@r;(a)+((r))+(c)-->(a)
带进位的减法:subb a,#data
subb a,data
subb a,@r1
乘法:mul a b;(a)(b)
除法:div a b;(a)/(b)
以上就是关于汇编程序:从键盘输入两个十进制数然后把这两个数相加,并将结果显示在屏幕上全部的内容,包括:汇编程序:从键盘输入两个十进制数然后把这两个数相加,并将结果显示在屏幕上、根据这个汇编程序改成六位BCD码相加的程序、(汇编语言)编写一个程序,实现两个三字节无符号数DATA1和DATA2的相加,结果送四字节变量ANS。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)