汇编程序:从键盘输入两个十进制数然后把这两个数相加,并将结果显示在屏幕上

汇编程序:从键盘输入两个十进制数然后把这两个数相加,并将结果显示在屏幕上,第1张

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。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10112529.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存