如何使用汇编语言实现多位十进制数相加

如何使用汇编语言实现多位十进制数相加,第1张

从键盘上键入2个10位数以内(位数可变)十进制值数,对其求和并显示纳毁结果

程序运行时提示请输入加数和被加数,求完和显示结果后,显示继续和退出。

code segmentassume cs:code,ds:code

org 100h标准COM格式

start:

mov ax,3文本模式

int 10h

push cs

pop ds

push ds

pop es

Again:

lea dx,mes1提示洞此备

mov ah,9

int 21h

mov di,30fh

call input接收 数A

lea dx,mes2提示

mov ah,9

int 21h

mov di,31fh

call input接收 数B

call count求和

lea dx,mes3

mov ah,9

int 21h

*** 输出十进制的结果 ***

call crt

lea dx,mes4

mov ah,9

int 21h

mov ah,0暂停

int 16h

cmp ah,15h "Y(y)"继续

jz Again计算下一题

mov ah,4ch结束

int 21h

input:

mov cx,10

T1:mov ah,0接收数字

int 16h

cmp al,0dh

jz ok

cmp al,'0'数据校验

jb T1

cmp al,'9'

ja t1

yes:

mov ah,0eh 显示有效数据

int 10h

w2:push ax 压入堆栈

loop T1

ok:mov bp,cx

inc bp

mov cx,11

sub cx,bp

std

jcxz u3

u1:pop ax

stosb

loop u1

u3:mov al,'0'

mov cx,bp

u2:stosb

loop u2

ret

count:mov si,30fh

mov di,31fh

xor dx,dx清进位

mov cx,11改变此值,可扒山实现超大数相加

T3: call subs_c逐位累加

dec si

dec di

loop T3

ret

subs_c: [原创]多位加法核心子程序

mov al,[si]最低位对齐

mov ah,[di]

and ax,0f0fh

add al,ah自加

add al,dl加后面进位

aam二化十

mov dl,ah存进位位

or al,30h

mov [SI],al保存1位和值,这里抄错了。

ret

crt:cld

xor bp,bp

mov si,305h

mov cx,10

cr3:

mov al,[si]

cmp al,'0'

jnz cr0

inc bp

inc si

loop cr3

cr0:

mov cx,11

sub cx,bp

mov si,305h

add si,bp

cr1:lodsb

mov ah,0eh

int 10h

loop cr1

ret

mes1 db 0dh,0ah,09,'Input A(0-9,999,999,999): $'

mes2 db 0dh,0ah,09,'Input B(0-9,999,999,999): $'

mes3 db 0dh,0ah,09,'Sum A+B= $'

mes4 db 0dh,0ah,09,'Continue Y(y)? $'

code ends

end start

8086的汇编我不熟,我运誉键用51的汇编做的这虚历个程序,希望对你有启发

ORG 0000H

LJMP MAIN

ORG 1000H

DB 55H,44H,59H,54H,0CBH,0ADH,21H,45H

ORG 2000H

DB 55H,44H,59H,54H,0CBH,0ADH,21H,45H  将数据存储

ORG 3000H

MAIN:

MOV R0,#57H

MOV R1,#10H

MOV R2,#00H

MOV R3,#20H

MOV R4,#00H

MOV R5,#08H

CLR C

LOOP:

MOV DPH,R1

MOV DPL,R2

MOV A,#00H

MOVC A,@A+DPTR 取一个字节,

MOV R6,A  将取出的字节存住

MOV DPH,R3

MOV DPL,R4

MOV A,#00H

MOVC A,@A+DPTR 取另一字节

ADDC A,R6  带进位的加法,第一次时需保证Cy位为零

LOOP 前面一旁巧句的作用,就在于此

MOV @R0,A  将结果数据存储

DEC R0      存储区减一指向下一个区域

INC R2

INC R4

DJNZ R5,LOOP 控制位数

SJMP $

END

运行结果如图

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

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,01Esc 退出

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


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

原文地址: https://outofmemory.cn/yw/12291815.html

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

发表评论

登录后才能评论

评论列表(0条)

保存