汇编语言程序设计——分支结构例6

汇编语言程序设计——分支结构例6

设计目标

从键盘输入两个两位的十进制数,做加法运算,并显示结果。

从键盘输入数字 0~9 的 ASCII 码为 30H~39H,要想用它们做十进制运算可以将其转换为 BCD 码。数字的 ASCII 码与压缩 BCD 码之间的转换有多种方式,此处采用位运算实现。

设计思路

(1)键盘输入一个两位数之后回车,再输入另外一个两位数。将 4 个数去掉 30H 保存到 X 单元。比如输入 12 和 34,相加结果应为 46;
(2)用移位操作将 4 个数据两两合并为相应的 BCD 码;
(3)相加后用 DAA 十进制调整指令调整,如果有百位的进位,用变量 Z 记住;
(4)用移位以及加 3030H 操作将 BCD 码再变为 ASCII 码,显示百位、十位、个位数值。

;5-6.asm  输入两个2位十进制数,相加并显示结果。
data segment
    x db 4 dup(?)
    z db ?  
data ends
code segment
assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    mov cx,2          ;允许输入两个数据
    mov si,0
let0:
    mov ah,1            ;键盘输入12↓34↓
    int 21h
    cmp al,0dh          ;回车?
    jz let1             ;是,转let1输入第2个数
    and al,0fh          ;去掉30h
    mov x[si],al        ;保存到x
    inc si
    jmp let0
let1:
    mov ah,2             ;换行
    mov dl,0ah
    int 21h
    dec cx
    jnz let0                
    ;将保存在x单元中的01、02、03、04合并为BCD码
    mov ax,0
    mov al,x                ;第1个数变为BCD码12H
    mov cl,4
    shl al,cl                ;01左移4位后变为10
    add al,x+1
    mov bl,x+2                ;第2个数变为BCD码34H
    shl bl,cl                ;03左移4位后变为30
    add bl,x+3
    add al,bl                ;BCD码相加后ax=0046
    daa                        ;对AX作十进制调整
    ;显示十进制结果
    jnc let2                ;没有百位则转let2
    mov z,'1'               ;标记有百位进位
let2:
    mov cl,4
    shl ax,cl                ;左移4位,ax=0460
    rol al,cl                ;al左移4位后ax=0406
    add ax,3030h            ;ax=3436——将BCD码变为ASCII码
    mov bx,ax
    mov dl,0ah                ;换行显示
    mov ah,2
    int 21h
    cmp z,'1'                ;有百位?
    jnz out1
    mov dl,z                ;显示百位数1
    int 21h
out1:
    mov dl,bh                ;显示十位
    int 21h
    mov dl,bl                ;显示个位    
    int 21h
    mov ah,4ch
    int 21h
code ends
    end start

运行结果:

汇编语言程序设计——分支结构例6_第1张图片

第 1 次执行 12 + 34 = 46,第 2 次执行 78 + 89 = 167。

注意:若只输入个位数,必须输入 01、02 等,保持两位数的输入。

你可能感兴趣的:(汇编语言)