📜  8086程序减去两个8位BCD编号(1)

📅  最后修改于: 2023-12-03 14:38:54.339000             🧑  作者: Mango

8086程序减去两个8位BCD编号

本篇文章介绍如何使用8086汇编语言编写程序,实现减去两个8位BCD编号的功能。

BCD编码简介

BCD编码是一种二进制编码,用于表示0到9之间的数。BCD编码使用4位二进制数来表示一个十进制数,因此称为“二进制编码的十进制数”,简称“BCD码”。

例如,数字3的BCD编码为0011。

程序设计思路

为了实现减去两个8位BCD编号的功能,我们可以使用以下步骤:

  1. 读入两个8位BCD数字,并将它们存储到内存中。

  2. 将第一个数字减去第二个数字,得到结果。

  3. 如果结果为负数,将最高位设置为1,并加上10。

  4. 将结果存储到内存中。

  5. 显示结果。

代码实现

下面是代码实现的主程序:

.data
  num1 db 60h  ; 存储第一个数字的地址
  num2 db 61h  ; 存储第二个数字的地址
  result db 62h  ; 存储结果的地址

.code
  main proc
    ; 读入两个数字
    mov ah, 01h
    int 21h
    sub al, 30h
    mov [num1], al

    mov ah, 01h
    int 21h
    sub al, 30h
    mov [num2], al

    ; 减去第二个数字
    mov al, [num1]
    sub al, [num2]
    cmp al, 0
    jge skip_adjust ; 如果结果非负,则跳过调整

    ; 调整结果
    add al, 10
    mov ah, 0
    inc ah
    skip_adjust:

    ; 存储结果
    mov [result], al

    ; 显示结果
    add al, 30h
    mov dl, al
    mov ah, 02h
    int 21h

    ; 结束程序
    mov ah, 4Ch
    int 21h
  main endp
代码解释

上述代码实现了以下功能:

  1. 从用户输入中读入两个数字,并将它们存储到内存中的地址为num1num2的位置。

  2. 用第二个数字减去第一个数字,并将结果存储到内存中地址为result的位置。

  3. 如果结果为负数,则将最高位设置为1,并加上10。

  4. 将结果显示在屏幕上。

代码解释如下:

  • .data:声明数据段

    • num1 db 60h:定义了一个字节类型变量num1,将存储于地址60h
    • num2 db 61h:定义了一个字节类型变量num2,将存储于地址61h
    • result db 62h:定义了一个字节类型变量result,将存储于地址62h
  • .code:声明代码段

    • main proc:主函数开始

      • mov ah, 01h:调用dos中断21h,读取一个字符(键盘输入),并将其存储于AL寄存器中。

      • sub al, 30h:将al中存储的ASCII码减去30h(即字符'0'),转化为数字。

      • mov [num1], al:将转化为数字的第一个键盘输入存储于地址num1中。

      • mov ah, 01h:调用dos中断21h,读取另一个字符(键盘输入),并将其存储于AL寄存器中。

      • sub al, 30h:将al中存储的ASCII码减去30h(即字符'0'),转化为数字。

      • mov [num2], al:将转化为数字的第二个键盘输入存储于地址num2中。

      • mov al, [num1]:将存储于地址num1中的数字移动到al寄存器中。

      • sub al, [num2]:将num2中的数字从al中减去,并将结果存储到al中。

      • cmp al, 0:比较al是否小于0。

      • jge skip_adjust:如果al大于等于0(即非负),则跳转到程序错误的位置(程序流被移动到地址skip_adjust)。

      • add al, 10:如果al小于0,将其加上10,将其值变为原值的相反数。

      • mov ah, 0:将最高位设置为1。

      • inc ah:将ah中的值加上1,变为1。

      • skip_adjust::跳转到结果调整结束的位置。

      • mov [result], al:将结果存储到result中。

      • add al, 30h:将结果转换为ASCII码,加上30h

      • mov dl, al:将结果移动到dl寄存器中,用于显示。

      • mov ah, 02h:将02h存储到ah寄存器中,表示dos中断21h的'显示字符'功能。

      • int 21h:调用dos中断21h,显示结果。

      • mov ah, 4Ch:将4Ch存储到ah寄存器中,表示dos中断21h的'程序终止'功能。

      • int 21h:调用dos中断21h,程序终止。

    • main endp:主函数结束。

总结

本篇文章介绍了使用8086汇编语言编写程序,实现减去两个8位BCD编号的功能。对于那些想要学习汇编语言的程序员来说,该文可以作为一个参考,帮助他们理解ASIC 2的基础知识。

完整代码见下:

; Subtracts two 8-bit BCD numbers
 
; Data segment
    num1 db 60h  ; 存储第一个数字的地址
    num2 db 61h  ; 存储第二个数字的地址
    result db 62h  ; 存储结果的地址
 
; Code segment
    main proc
        ; 读入两个数字
        mov ah, 01h
        int 21h
        sub al, 30h
        mov [num1], al
 
        mov ah, 01h
        int 21h
        sub al, 30h
        mov [num2], al
 
        ; 减去第二个数字
        mov al, [num1]
        sub al, [num2]
        cmp al, 0
        jge skip_adjust ; 如果结果非负,则跳过调整
 
        ; 调整结果
        add al, 10
        mov ah, 0
        inc ah
        skip_adjust:
 
        ; 存储结果
        mov [result], al
 
        ; 显示结果
        add al, 30h
        mov dl, al
        mov ah, 02h
        int 21h
 
        ; 结束程序
        mov ah, 4Ch
        int 21h
    main endp
end