才发现,竟是简单的CX未初始化,而LOOP的理解错误的的确确给自己添了不少麻烦,不过通过T跟踪很快就发现了。此次实验虽然磕磕绊绊的,但很大程度上提升了我的分析问题解决问题的能力,更重要的是让我的思维更开放了,如最后一题的羁绊,虽然猜想错误了,但让我在以后同类的问题中有了个预先的警示。并且深入问题后让我发现,一个问题牵扯出了没有发生但该注意的其他问题,如在最后一题我所犯错误的修改上,第一中改法可以调试过,是因为在该题中0011所指向的也是数据,并且在该数据段内。而如果REST在其他地方定义的话,或者说0010已经是该数据段结尾了,那么第一种改法很可能就会是错的了。附录:1)修改后DSEGSEGMENT定义数据段
MSGDB42605678356开辟字节单元分配数据空间MDB开辟字节单元存放最终结果数据段结束定义代码段
DSEGCSEG
ENDSSEGMENT
ASSUMECSCSEGDSDSEG代码段数据段各自挂钩相应寄存器STARTMOVAXDSEG程序入口MOVDSAX进行数据段寄存器的地址装入初始CX值为LOOP循环次数10AL清零作为临时结果存放位置
MOVCX10MOVAL0
LEASIMSG初始指针指向数据段L1MOVBLSI取数,将SI所指内存单元数据传送给BLCMPBL0进行之前所取数与0比较JLEINCNEXT当BL若小于或等于0跳入NEXT标号处指令AL若BL不符合上一指令条件即BL0,AL加1
fNEXT
INC
SINEXT入口,si指针下移指向即将比较的数L1循环跳至标号L1所指指令直至CX0
LOOP
MOVMAL将结果传送给MMOVAL0AL清零MOVAH4CH调用DOS返回dos界面功能INTCSEG21HENDS代码段结束程序结束
ENDSTART
2)重复部分注释略,同上DSEGSEGMENT
MSGDB131572524MDBENDSSEGMENT
DSEGCSEG
ASSUMECSCSEGDSDSEGSTARTMOVAXDSEGMOVDSAXMOVCX4初始CX值为LOOP循环次数4
MOVALMSG将数据段第一个数传送给ALMOVSIOFFSETMSG1初始指针指向数据段第二个数L1CMPALSI比较AL与指针SI所指内存单元数据JBNEXT当AL小于SI所指内存单元数据跳至NEXT标号处指令MOVALSI当AL大于SI所指内存单元数据改变AL值为SI所指NEXTINCSI指针下移L1循环跳至L1标号处指令直至CX为0
LOOP
MOVMALMOVAL0MOVAH4CHINT21H
fCSEG
ENDS
ENDSTART3最终代码DATASEGMENT数据段DATA开始
BUFDB4260508350分配字节空间首地址BUFRESULTDATAENDSCODEASSUMESEGMENTDB存放结果数据段DATA结束代码段CODE开始
DSDATACSCODEDATACODE对应挂钩DS,CSAXDATADSAXCX10AL0程序入口数据段装入初始循环次数AL用于存放0的个数,初始为0
STARTMOVMOVMOVMOVCMMP
CMPBYTEPTRSI0当前指r