clhjswe 发表于 2018-6-24 11:08:03

关于王爽汇编书和“王爽《汇编语言》第二版习题答案.chm”中的错误

书中说到,call指令不可以实现短转移,但如果我call指令转2个字节呢,可以吗?算短转移吗?不是的话,那2是-128~127之间吗?不是吗?他这样表示他的意思行吗?

王爽《汇编语言》第二版习题答案.chm中告诉我这段内容:
题中特别关照别用debug跟踪,跟踪结果不一定正确,但还是忍不住去试试,看是什么结果。
根据单步跟踪发现,执行call word ptr ds:指令时,显示ds:=065D。
ds:0000~ds:0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。
于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。这是为什么呢?中断呗~~~~

程序开始,程序知道栈段在哪,然后自动地把栈段的段地址给ss,是吗?不是的话,你为什么说“发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。”你还没有执行mov ss,ax, ss中的内容是栈段的段地址吗?是的话,你还要执行mov ss,ax干嘛?有个屁用!

王爽《汇编语言》第二版习题答案.chm还告诉我这段内容:
执行call word ptr ds:指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:)。(ds:)=11h,执行inc ax……最终ax=3

你鸦的你call word ptr后会将cs推入栈?不是只有call dword ptr和call far ptr才推吗?你怎么都推?书上明明白白写的是只推ip,不推cs,你看了书没有啊!

很久没来拜访这里了,发现这网站搞得越来越不爽了,手机验证,邮箱验证。。。。浪费时间。

57158597@qq.com 发表于 2018-6-24 17:25:14

call不能实现短转移,指的是不能实现8位的转移如call al
最少是16位的转移如 call ax 这里的ax你想是什么16位地址都行0001也可以


这个题目是检测点10.5的把?我当时也对这段代码进行过调试
直接用G指令执行结果AX=3,单步执行AX的值就变得不确定了
不同的电脑不同的值,原因是我们单步执行的时候用到了DOS的相关中断指令
这些中断指令改变了栈的值,ds:的值变了我们的程序就执行到未知的地方了


“发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。”
这话不难理解因为:
stack segment
   dw 8 dup (0)
stack ends
在你运行debug调试程序的时候,这段代码已经执行了的
也就是让CPU给我们分配一段空间做数据段或栈段用
而第一行指令mov ax,stack 这里stack对应的地址就是我们分配到的空间的第1个偏移地址
DEBUG调试时一开始用R指令查看就会知道STACK对应的地址
然后在用D 指令查看这个地址,就会发现这地址是空的


“执行call word ptr ds:指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:)。(ds:)=11h,执行inc ax……最终ax=3”
call word ptr确实不入栈CS,这里可能是写的人习惯CS先入栈了,没反应过来,不必太在意
页: [1]
查看完整版本: 关于王爽汇编书和“王爽《汇编语言》第二版习题答案.chm”中的错误