全球旧事资料 分类
45……
这里有一个问题就是简单的通过SI和DI来进行相乘时忽略了一个问题就是两个操作数不能同时为内存单元的数,因此必须借助于寄存器临时存储其中一个数。而AL在每一次乘法操作时均被作为隐含操作数而用到因而可直接由AL来存放其中一个数,而存放和的AX这里应由其他寄存器暂代之如BX。所以优化上图后如下:
BXALSISIDI
1
CX8
8BXAXBXAXALDI76……
23……
43根据以上设想设计流程图:(loop的错误理解导致了这里循环的控制上有问题,其中的注1应该放在注2之后loop之前)
开始
MOV
CX8CX8
fMOVAX0AX0
MOVBX0BX0
LEASINUM1
LEADINUM2
注1
ADDBXAXBXAXBX
MOVALSIALSI
注2
MULDIAXDIAL
INCSI
INC
DI
DEC
CX
N
CX0
Y结束
44最初程序代码错误
fDATA
SEGMENT
数据段DATA开始
NUM1DB12345678第一组数分配字节空间首地址NUM1NUM2DB87654321第二组数分配字节空间首地址NUM2RESTDATAENDSCODESEGMENTASSUMESTARTMOVMOVMOVMOVLEALEANEXTADDDW存放结果数据段DATA结束代码段CODE开始DSDATACSCODEDATACODE对应挂钩DS,CSAXDATADSAXAX0BX0SINUM1DINUM2BXAX程序入口数据段装入AX清零BX清零将NUM1首地址传送给SI将NUM2首地址传送给DIBXAXBX将SI所指单元数据传送给ALDI所指单元数据与AL相乘结果存放在AX指针SI下移,指向NUM1下一个数指针DI下移,指向NUM2下一个数循环跳至NEXT标号处直至CX自减至0
MOVALSIMULDIINCINCLOOPMOVINTCODEENDSENDSTARTSIDINEXTAH4CH21H
调用dos返回dos界面功能代码段CODE开始程序结束
5.调试过程1)11单步调试程序跟踪找到程序的错误。如图:第一次调入si04到BL并进行BL与0比较指令由当前的1416:0013执行后执行0015指令并没有立即跳至0017指令INCAl可知第一次比较
f得与正确处理执行正数个数加一,指针下移操作
12进入循环继续跟踪调入BL第二个数si2FEH再一次比较0此时符合条件JBE中的below即小于应该跳过0015指令执行0017指令INC令INC如图:SI,可从跟踪结果看到0015指
Al依然被执行了,结果当然是正数个数AL2多加了1不符合实际,
由此已经找到了出错位置即在此无需继续跟踪。13分析并修改错误我们知道2显然符合“小于below或者等于equal零”的条件,为什么程序
f却判断2比零大呢,可知因该句条件并没错语法上也正确,现在唯一的问题给忽略了就是符号了,我们知道数据的存储方式是补码形式,2的补码为FE而程序条件是BE是对无符号数的操作FE自然是大于0了,由此我们改该指r
好听全球资料 返回顶部