求用汇编语言编写一个实现任意两个五位数相加的程序

2024-11-20 09:40:27
推荐回答(5个)
回答1:

编程前,应把算法先想清楚了。

code segment;任意两个五位数相加
assume cs:code,ds:code,ss:code
org 100h;标准COM格式
start:
jmp begin
Tips db 0dh,0ah,09,'? $'
X1 db '23456+98765='
Y1 db '000000. Esc to Quit...',24h
begin:
push cs
pop ds
push ds
pop es
mov ax,3;文本模式
int 10h
Again:mov dx,offset Tips;提示
mov ah,9
int 21h
call input;接收任意两个五位数
call count;求和
;*** 输出十进制的结果 ***
mov dx,offset Y1[-1]
mov ah,9
int 21h
mov ah,0;暂停
int 16h
cmp ah,01;Esc 退出
jnz Again;计算下一题
mov ah,4ch;结束
int 21h
input:cld
mov si,offset X1
mov cx,2
T0:push cx
mov cx,5
T1:mov ah,0;接收数字
int 16h
cmp al,30h;数据校验
jb T1
cmp al,39h
ja T1
mov ah,0eh;数据显示
int 10h
mov [si],al;存入数据区
inc si
loop T1
inc si;跳过加号
pop cx
cmp cx,2
jnz T2
mov ax,0e2bh;输出加号
int 10h
T2:loop T0
ret

count:mov si,offset X1[4]
mov di,offset Y1[5]
xor dx,dx;清进位
mov cx,5;改变此值,可实现超大数相加
T3: call subs_c;逐位累加
dec si
dec di
loop T3
cmp dl,1;校正最高位
jnz T4
or dl,30h
mov [di],dl;有进位,置1
jmp T5
T4: mov byte ptr [di],20h;去掉前导0
T5: ret

subs_c: ;[原创]多位加法核心子程序
mov al,[si];最低位对齐
mov ah,[si+6]
and ax,0f0fh
add al,ah;自加
add al,dl;加后面进位
aam;二化十
mov dl,ah;存进位位
or al,30h
mov [di],al;保存1位和值
ret
code ends
end start

回答2:

这个程序难度不是很大,只是比较麻烦.
给个思路:
设三个字符串缓冲区,两个双字的变量.
第一第二字符串缓冲区接收两个输入的数;由于输入的仅是字符,所以要每个字符减去30H,得到的字符存储回原来缓冲区,然后个位*1,十位*10,百位*100,类推...再累加到相应的双字变量中.
两个双字变量再相加(注意进位加!);值存放在第一变量中.
最后,将第一变量中的数值转换成字符串(注意先除再减),再输出就可以了.

最后建议:提高悬赏至200分以上,大家才不嫌麻烦.

回答3:

我写了两个四位数相加的程序 原理相同你自己改啊

data segment ; 定义数据段
x1 dw 1234
x2 dw 5660
data ends
code segment ;定义代码段
main proc far
assume cs:code,ds:data,es:data
start:push dx ;返回DOS的标准方法
mov ax,0
push ax
mov ax,data
mov ds,ax
mov es,ax ;初始化
clc
mov dx,0
mov ax,x1 ;相加
adc ax,x2
mov bx,1000 ;相除
div bx
push dx
add al,30H ;求ASCII值
mov dl,al ;DOS系统功能调用,显示
mov ah,2
int 21H
pop dx
mov ax,dx
mov dx,0
mov bx,100 ;相除
div bx
push dx
add al,30H ;求ASCII值
mov dl,al ;显示
mov ah,2
int 21H
pop dx
mov ax,dx
mov dx,0
mov bx,10 ;相除
div bx
push dx
add al,30H ;求ASCII值
mov dl,al ;显示
mov ah,2
int 21H
pop dx
mov ax,dx

add ax,30H
mov dx,ax
mov ah,2
int 21H
ret
main endp
code ends
end start

回答4:

本来是想写的 想到你这个五位数要用两个寄存器来存放 因为有可能大于65535 真够麻烦的 估计值200分以上了
assume cs:code
data segment
db 6,?,6 dup(?),6,?,6 dup(?)
data ends
code segment
start:mov ax,data
mov ds,ax
xor ax,ax
xor dx,dx
mov AH,0AH
int 21H
mov dx,8
int 21H
mov bx,2
mov cx,5
s1:sub byte ptr [bx],30
sub byte ptr [bx+8],30
inc bx
loop s1
mov bx,2
mov cx,2
s2:
xor ax,ax
mov al,[bx]
mov si,ax
mov al,[bx+1]
mov di,10
mul di
add si,ax
xor ax,ax
mov al,[bx+2]
mov di,100
mul di
add si,ax
xor ax,ax
mov al,[bx+3]
mov di,1000
mul di
add si,ax
xor ax,ax
mov al,[bx+4]
mov di,10000
mul di
add ax,si
adc dx,0
push ax
push dx
add bx,8
loop s2
pop dx
pop ax
pop bx
pop cx
add ax,cx
adc dx,bx

mov ax,4c00H
int 21H
code ends
end start

回答5:

以己昏昏,示人昭昭。
学习了。