汇编语言实现最高十五位数加十五位数加法

前段时间刚做完老师布置的实验作业,由简单的功能一步步扩展到实现最终的十五位数加十五位数加法。在此将自己的思路分享出来,与大家一起交流。

需要解决的问题

  • 对于不同位数的加法,如何正确的使对应位相加,而且实现起来不是很麻烦。
  • 如何将计算后的数值以十进制的形式输出
  • 如何不输出和的最高位前面的零
    (以上问题是我在编程时,困扰我的问题,可能与大家的问题不同。)

思路

流程图

子程序:datacate数据前期处理

我的想法是:因为刚输入的数据,假设第一个加数是1234,第二个加数是46。第一个加数在内存单元中是按照1234的顺序存放的,如果两个加数的位数不同,那么最低位并没有对齐。如果分别获取每个加数的长度,然后使用SI和DI指向最低位,依次相加也可以。但是最低位前面的位数是不同的,相加的时候很难使用循环去写,因为位数不一样,一个加数到头了,另一个加数还没有,这里的循环很难写的十分简洁。所以我把1234按照4321进行存储,这样的话,每一个缓冲区的第三个字节存放的都是最低位,依次为更高位。而且每一个加数的最高位之后都是0,即使相加也不会出现任何问题。只需要固定循环15次。即使加数不是15位,相加的0对结果没有任何影响。

需要注意的几个问题

  • 在使用栈进行倒序存储时,为了方便理解,在此附上我的思考过程。(这里的叉号并不是pop之后栈里的数据没了,而是这与我们关注的数据无关。阅读王爽的汇编语言一书可以知道,pop后内容还在,但是SP变了,所以再次压栈就会覆盖原有数据。)
    push
    pop
  • 输入结束时,在缓冲区的最后会有一个回车符的ASCII码值;在逆序存储之后,最高位前会有一个我们不需要的字符(为什么可以参见上一条图示)。这两处数据注意清零

子程序:adder

调用adder子程序,对应位相加,进位存放在一个内存单元中,每次加完对应的位之后,再加一次进位内存单元的数值,这个数值由AL给出。这里可以参见程序注释。

子程序:display

在输出前需要先判断和最高位在哪里。因为res中的十进制数如果不足16位,则后面全是0,我们不想让输出的时候前面有一堆0。所以要判断和有多少位。想法是:

假设最长的加数为X位。(注意这里是从低位到高位进行存储的)因为最起码跟最长加数一样的位数,所以以最长加数的长度X为基础,判断它的X+1位是否为0,若是0,则只有X位,若不是0,则有X+1位。然后循环输出即可。细节可以参见注释。

代码

数据段与栈的定义
数据段与栈的定义
代码段定义
代码段定义
datacate第一部分
datacate第一部分
datacate第二部分datacate第二部分
子程序adder
子程序adder
子程序display
子程序display
最后
结尾
以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值