对于课程设计一的反思
在写完课程设计一之后,我发现我之前的代码有很多问题,特此专开一篇文章来检讨和总结之前所犯下的错误,并引以为鉴!
- 运算逻辑的问题
- 子程序(函数)的参数与返回值
栈的操作
反思我之前编写dtoc子程序块的问题(没考虑周全)
原文章:
因为后期测试过程不到位,只是用了些简单数字,也没有细品代码执行过程,当我输入的数字中间含0的情况,则会得到不一样的结果:
回顾一下之前的错误逻辑:
首先第一个错误,in_num字段前三行
我的目的是不断除10,但这里跳出操作的判断依据是dx,这个dx存储的数据是余数,余数为0则跳出,那么30201则只会显示1了
然后也是in_num字段,push操作
在网上搜罗资料之后,发现对栈操作的数据最低是16位,而我这里只需要低8位就行,这里直接对余数dx进行操作,显得有点突兀,虽然后面出栈操作可以改回。
对照push操作,看看set_num字段
这里属于是碰巧了,我直接pop出栈,实际出栈的数据是16位,但每次前进1字节,导致高位被覆盖,所以这里没改正也不影响结果
对照问题改正后结果如下:
改正后的逻辑呢?参考我的课程设计一:
这里讲讲,改正过程中出现的问题,也是在in_num字段
因为我们要将判断的寄存器赋值到cx,所以我们得临时保存cx寄存器,这里cx在其他段没有使用,这里的cx就无需暂存啦。如果是前一种情况,那么对用push cx和pop cx将跳转指令包裹,而且还要再跳转后对这个多一次push的操作进行合理安排,否则结果会出现异常!!!
思考函数在汇编语言中是怎么实现的?
对于C语言中的函数,我们知道函数有两个重要的属性,就是参数和返回值。对于汇编语言这么多的操作指令,它的函数实现原理又是怎么样的呢?
在课程学习中,当我们程序跳转到另一个代码段的时候,首先要做的就是暂存跳入子程序前所有寄存器的状态,而利用栈的特性,先进后出的思想,恰好能够用来暂存数据。
我们可以大致地把汇编语言的函数描述成这样:
mov ax, XXXX
mov dx, XXXX
....初始化要传入数据...
call function
....得到调用函数后的结果...
mov XXX
add XXX
...执行返回值的操作...
因为我们还得用到传入的数据,所以秉持最大化节约空间的原则,我们对开始的暂存数据操作就可以不用暂存这么多寄存器,仅仅保留函数段使用到的寄存器即可,并且传入参数的寄存器也可以不用暂存(这个按情况来)。
对栈操作的反思
因为我之前在使用栈的时候老师踩坑,所以这个我也得提一嘴。