程序运行时提示请输入加数和被加数,求完和显示结果后,显示继续和退出。
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)