全球旧事资料 分类
令为有符号操作即JLE确结果6。2)21单步调试找到错误t单步跟踪得到如图在执行调入第一个数到AL后并比较SI如图SI是01即指向数15,由代码可知此时符合JMP条件Bbelow跳转至0014指令段内LOOPL1即进入循环进行下一次比较CMPALSI这里可以看到NEXT或者JNGNEXT,重新编译连接并运行程序最终得正
SI依旧是01仍指向15,并没有下移,由此可知程序出错在于SI未能下移指向下一个即将要比较的数。从代码上看也容易得知程序至终都未曾移动SI指向。
22分析并改错结合程序代码和题目要求,为了找到最小的数并把他存放在M中,程序基本完成了比较部分和存放功能,唯一的错误是在SI的移动未实现,可知在进入循环L1,CMP比较之前因该找到下一个比较的数,而无论比较结果如何下移SI操作均需要执行到,因此在NEXT:里LOOP指针自加功能。具体如下:……L1之前添加INCSI实现
fNEXT
INC
SI
LOOP……3
L1
31编译以上代码出错提示未能通过,出错如下:
提示11行中操作数未指定大小,查看代码知SI为内存单元数据,必须指定大小是byte还是word。32修改其为:CMPBYTEPTRSI0重新编译,
如图已能顺利通过编译并连接。
f33进入debug环境u命令反汇编得知数据段地址076A,RESULT偏移量000A如图
441编译最初代码未能通过提示如下图:
42分析并改错第10行超出内存范围,查看代码为
f可知指令并没错,错误在于注释中的“;”应该为“”后面的随之修改后,重新编译,依然存在错误如图提示未指定操作数大小:
我们知道在数据传送指令中有目的操作数若是内存单元数据和源操作数是立即数时必须指定大小,而若有一是寄存器数据是可无需指定。疏忽了在单操作数的乘除指令也同样必须指定大小使之位数一致。为什么出现这样情况可想而知因为乘除指令的隐含操作数所在寄存器可能是AL或AX,其选择决定于源操作数的位数。因此修改原指令为“MUL终于顺利通过编译并连接如图:BYTEPTRDI”。继续重新编译
43debug调试检查结果g运行程序,要进行d查看时才发现忘了将结果传送给REST,在原代码LOOP指令后添加指令:MOV通过了。完成以上操作后,u反汇编得到数据段首地址076A和REST偏移量0010后,RESTBX,重新回到编译阶段,继续编译,还好正常
fd076a:0010查看REST中内容为6A8C6A为高地址所在如图:通过计算器计算得120对比之得知结果不正确。
44再次分析并改错结合流程图仔细浏览推敲程序,基本上并没问题,最终结果如此大,一个可能便是加上了不必要即定义段之外的r
好听全球资料 返回顶部