使用8086汇编语言,DOS汇编,实现键盘输入两个任意长度十进制数(20位以内)的求和,用“-”来标识负数,正数可以不加符号或加“+”号。采用四个数组的方法实现,软件是masm for windows2015,
时间: 2024-01-01 11:03:37 浏览: 221
好的,下面是实现这个功能的汇编代码,注释中有详细的解释:
```
.model small
.stack 100h
.data
num1 db 21, ?, 20 dup('$') ; 第一个数,21表示最大输入长度为20,加上一个回车符
num2 db 21, ?, 20 dup('$') ; 第二个数
result db 22 dup('$') ; 结果,最大长度为21,加上一个回车符
carry db 0 ; 进位
sign db '+' ; 结果的符号,默认为正号
.code
main proc
mov ax, @data
mov ds, ax
; 输入第一个数
lea dx, num1
mov ah, 0ah
int 21h
; 输入第二个数
lea dx, num2
mov ah, 0ah
int 21h
; 将两个数转换为数字,并相加
mov si, offset num1+2 ; si指向第一个数的首位数字
mov di, offset num2+2 ; di指向第二个数的首位数字
lea bx, result+20 ; bx指向结果的最后一位数字(从后往前加)
mov byte ptr [bx], '$' ; 结果的最后一位为回车符
mov cx, 0 ; cx表示当前位数的进位
mov al, 0 ; al表示当前位数的总和
mov bl, 10 ; bl表示进位的基数
add_loop:
cmp byte ptr [si], '$' ; 如果第一个数已经结束,则跳到sub_loop
je sub_loop
mov ah, 0
mov al, byte ptr [si]
sub al, 48 ; 将字符转换为数字
cmp byte ptr [si-1], '-' ; 判断第一个数是否为负数
je neg1
add al, byte ptr [di] ; 如果不是负数,则加上第二个数的当前位
jmp add_end
neg1:
sub al, byte ptr [di] ; 如果是负数,则减去第二个数的当前位
cmp byte ptr [al], 0 ; 如果相减之后结果为0,则将结果的符号改为负号
jne add_end
mov byte ptr [sign], '-'
add_end:
add al, cx ; 加上当前位的进位
mov cx, 0 ; 进位清零
cmp al, 10 ; 判断是否需要进位
jb no_carry
mov cx, 1 ; 如果需要进位,则将进位设置为1
sub al, 10 ; 用当前位数的总和减去10,得到进位后的结果
no_carry:
mov byte ptr [bx], al ; 将结果存储在结果数组中
dec si ; si指向第一个数的下一位
dec di ; di指向第二个数的下一位
dec bx ; bx指向结果的下一位
jmp add_loop
sub_loop:
cmp byte ptr [di], '$' ; 如果第二个数已经结束,则跳到end_loop
je end_loop
mov ah, 0
mov al, byte ptr [di]
sub al, 48 ; 将字符转换为数字
cmp byte ptr [di-1], '-' ; 判断第二个数是否为负数
je neg2
add al, cx ; 加上当前位的进位
mov cx, 0 ; 进位清零
cmp al, 10 ; 判断是否需要进位
jb no_carry2
mov cx, 1 ; 如果需要进位,则将进位设置为1
sub al, 10 ; 用当前位数的总和减去10,得到进位后的结果
no_carry2:
mov byte ptr [bx], al ; 将结果存储在结果数组中
dec di ; di指向第二个数的下一位
dec bx ; bx指向结果的下一位
jmp sub_loop
neg2:
sub al, cx ; 减去当前位的进位
mov cx, 0 ; 进位清零
cmp byte ptr [al], 0 ; 如果相减之后结果为0,则将结果的符号改为负号
jne sub_end
mov byte ptr [sign], '-'
sub_end:
mov byte ptr [bx], al ; 将结果存储在结果数组中
dec di ; di指向第二个数的下一位
dec bx ; bx指向结果的下一位
jmp sub_loop
end_loop:
cmp byte ptr [cx], 0 ; 如果最后一位有进位,则将符号改为负号
jne carry_end
mov byte ptr [sign], '-'
carry_end:
; 输出结果
mov ah, 9
lea dx, sign
int 21h
lea dx, result
int 21h
mov ah, 4ch
int 21h
main endp
end main
```
需要注意的是,这个代码只能处理两个长度不超过20位的十进制数的加减法,如果超过了20位,则可能会出现错误结果。同时,这个代码也只能处理非负整数和负整数的加减法,不能处理小数和其他类型的数据。
阅读全文