上面的程序都是给定两个数后 才进行计算
下面我们做一个提示输入两个数后 再计算的程序
先看C语言程序及两种结果图:
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
————
直接上汇编代码:

程序代码:
;#Mode=DOS
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;--------------------------------------------------------------------
; program name: AddTwoNum
; producer: yrjd
; program function: Calculate the sum of two number and show it
; produce data: 2012-10-7 Sunday
;--------------------------------------------------------------------
assume cs:code, ds:data, ss:stack
stack segment
db 128 dup (?)
stack ends
data segment
NumberA db 80
LenA db ?
ActA db 80 dup (0)
NumberB db 80
LenB db ?
ActB db 80 dup (0)
NumberR dw 0, 0, 0, 0, 0, 0
StringR db 80 dup ('$')
PromptA db 'Please input Number a: ', '$'
PromptB db 'Please input Number b: ', '$'
PromptR db 'The sum of a and b is: ', '$'
PromptEnd db 'Press any key to continue', '$'
data ends
code segment
START: ;; Segment register initialize 段寄存器初始化
mov ax, stack
mov ss, ax
mov sp, 128
mov ax, data
mov ds, ax
;; Prompt input number a 提示输入a
lea dx, PromptA
mov ah, 09h
int 21h
;; Input a and set into NumberA 输入a并放置在NumberA中
lea dx, NumberA
mov ah, 0ah
int 21h
call CRLF
;; Convert the string to decimal number 把数字字符串转换为十进制数
mov cl, LenA
mov ch, 0
mov ax, 0
mov dx, 0
lea si, ActA
add si, cx
dec si
mov di, 0
ConvertA: push cx
sub [si], 30h
mov al, BYTE ptr [si]
mov ah, 0
mov dx, 0
cmp di, 0
jz SingleA
mov bx, 10
mov cx, di
MulTenA: mul bx
loop MulTenA
SingleA: add NumberR[0], ax
adc NumberR[2], dx
dec si
pop cx
inc di
loop ConvertA
;; Prompt input number b 提示输入b
lea dx, PromptB
mov ah, 09h
int 21h
;; Input a and set into NumberB 输入a并放置在NumberB中
lea dx, NumberB
mov ah, 0ah
int 21h
call CRLF
;; Convert the string to decimal number 把数字字符串转换为十进制数
mov cl, LenB
mov ch, 0
mov ax, 0
mov dx, 0
lea si, ActB
add si, cx
dec si
mov di, 0
ConvertB: push cx
sub [si], 30h
mov al, BYTE ptr [si]
mov ah, 0
mov dx, 0
cmp di, 0
jz SingleB
mov bx, 10
mov cx, di
MulTenB: mul bx
loop MulTenB
SingleB: add NumberR[4], ax
adc NumberR[6], dx
dec si
pop cx
inc di
loop ConvertB
; Add the two Converted Decimal number
; 把转换的两个十进制数加起来放在ax, dx中
mov ax, NumberR[0]
add ax, NumberR[4]
mov dx, NumberR[2]
adc dx, NumberR[6]
; Get each point number 分解结果的各个位的数字
mov si, 0
GetEachNum: mov cx, 10
call divdw
add cx, 30h
push cx
inc si
cmp ax, 0
jz CmpAgain
jmp GetEachNum
CmpAgain: cmp dx, 0
jz GetEnd
jmp GetEachNum
GetEnd: mov cx, si
mov di, 0
GetResult: pop ax
mov StringR[di], al
inc di
loop GetResult
;; Prompt the result's output 提示并输出结果
lea dx, PromptR
mov ah, 09h
int 21h
lea dx, StringR
mov ah, 09h
int 21h
call CRLF
; Output End Prompt 输出结束提示
lea dx, PromptEnd
mov ah, 09h
int 21h
; View the result and Return DOS 查看结果并返回DOS
mov ah, 01h
int 21h
mov ah, 4ch
int 21h
;; The function of Carriage-Return Line-Feed 回车换行函数
CRLF: push ax
push dx
mov dl, 0dh
mov ah, 02h
int 21h
mov dl, 0ah
mov ah, 02h
int 21h
pop dx
pop ax
ret
divdw: ; not overflow division 实施不溢出除法获取除10的余数
push si
push di
push ax
mov ax, dx
mov dx, 0
div cx
mov si, ax
pop ax
div cx
mov cx, dx
mov dx, si
pop di
pop si
ret
code ends
end START
这个方法的大概构思就是将两个字符串转换为两个十进制数后相加 在显示出来
由于在转换的过程中有个循环相乘溢出的问题 所以相加的两数被限制在6位以内
看看以后能不能解决这个问题。到时候再详细研究下。
如果不用这个方法直接按位
处理BCD码和字符的转换 请参考 我写的那个大数相加的程序
这里就不重复了。
https://bbs.bccn.net/thread-382463-1-1.html
[
本帖最后由 有容就大 于 2012-10-7 22:58 编辑 ]