鱼C老师或各位鱼友,我在实验4里遇到了点问题
这是实验4,第3小题的我写的代码assume cs:code
code segment
start: mov ax,cs; //我这里能写成cs不,编译是没错误的
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,1ch //这里是我故意写成整个代码段的长度
s: mov al,
mov es:,al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
file:///D:/我的文档/My
你看下倒数第5个数据,跟机器码上的不一样
晕,发不出本地截图,只能自己手打了 明明MOV AX,4C00H,INT 21,在DEBUG里用U命令显示的5个长度的机器码是B8 00 4C CD 21 这5个,但用D命令查看20:0的内存数据,这5个数据却是CC 00 4C CD 21,请问下这是怎么回事 题目(3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
本文来自:鱼C工作室<a href=http://www.fishc.com>详细出处参考:http://www.fishc.com/a/kehouti/_huibianyuyan_/828.html 题目(3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
喔,非常有趣的问题...
看起来似乎是使用g命令一次到位才这样,单部调试(漫累的,汗)一切正常.
如果你用u命令来查看,原本mov ax,4c00处的指令变为 int 3h,
应该是debug程序为了调试而暂时改变了该行指令,但是因为使用了g指令
使得指令还没有被还原就被放到es:指向的内存去了,
估计int 3h是类似设置断点之类(停在该行)的中断指令
LZ很有实验精神阿,相信汇编能学的不错的,加油~
呃,还有,其实每一楼的下方都有一个编辑按钮的,可以修改那一楼的内容,
就不会造成每一次加点补充就多一楼. 我没有使用G命令呀,我是按T一步步下来的 恩??那我就不清楚了...
我t单步调试一切正常阿..0x1c=十进制28,一路这样按下来,到CX=0005时
DEBUG显示应该是
MOV AL, DS:0017=B8
B8即是MOV AX,4C00H指令的起始字节.
反之如果我使用g命令或是在LOOP指令处用p指令越过去,
用d指令查看es:0开始的内存内容就会遇到你的结果
无解了...有请潜水的高手们... int 21h,我用DEBUG调试到这一步,然后再T了一下,而不是按P,然后在看其内存的。你试下 int 21h,我用DEBUG调试到这一步,然后再T了一下,而不是按P,然后在看其内存的。
这...不会影响结果吧??指令来到int 21h,所有对於es:写入的指令已经完成,
在这个时候使用t或是p,差别只是有没有进入int 21h中断
(t就是进入,p就是当程序准备执行下一行时停下).
有差别的话(就我而言)只有你调试时是如何走过MOV AX,4C00h指令的,
1)g 17 ->停在MOV AX,4C00h处 ->DEBUG调换该行为int 3h,程序因此复制到es段时开头变成CC
2)一开始用t指令,遇到Loop指令时按下p跳过,因为同样是停在MOV AX,4C00h处,所以结果同上
3)一路都是t,没有别的 ->
下一行暂时调换为int 3h
程序执行当前行
程序执行int3h而停下
恢复原本指令
DEBUG显示该行资讯
因此程序复制正确的字节B8到es段
结果还是对不上我就没辄了... 待会我在看看吧,谢谢你了 加我下好友,我发我的调试截图给你看下
页:
[1]