鱼C论坛

 找回密码
 立即注册
查看: 2850|回复: 11

鱼C老师或各位鱼友,我在实验4里遇到了点问题

[复制链接]
发表于 2011-12-22 16:42:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是实验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,[bx]

     mov es:[bx],al

     inc bx

     loop s



     mov ax,4c00h

     int 21h

code ends

end start


file:///D:/我的文档/My
你看下倒数第5个数据,跟机器码上的不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-22 16:43:36 | 显示全部楼层
晕,发不出本地截图,只能自己手打了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-22 16:49:47 | 显示全部楼层
明明MOV AX,4C00H,INT 21,在DEBUG里用U命令显示的5个长度的机器码是B8 00 4C CD 21 这5个,但用D命令查看20:0的内存数据,这5个数据却是CC 00 4C CD 21,请问下这是怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-22 16:56:10 | 显示全部楼层
题目(3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
本文来自:鱼C工作室<a href=http://www.fishc.com>  详细出处参考:http://www.fishc.com/a/kehouti/_huibianyuyan_/828.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-22 16:57:04 | 显示全部楼层
题目(3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-22 17:21:52 | 显示全部楼层
喔,非常有趣的问题...

看起来似乎是使用g命令一次到位才这样,单部调试(漫累的,汗)一切正常.
如果你用u命令来查看,原本mov ax,4c00处的指令变为 int 3h,
应该是debug程序为了调试而暂时改变了该行指令,但是因为使用了g指令
使得指令还没有被还原就被放到es:[bx]指向的内存去了,
估计int 3h是类似设置断点之类(停在该行)的中断指令

LZ很有实验精神阿,相信汇编能学的不错的,加油~

呃,还有,其实每一楼的下方都有一个编辑按钮的,可以修改那一楼的内容,
就不会造成每一次加点补充就多一楼.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-22 20:09:53 | 显示全部楼层
我没有使用G命令呀,我是按T一步步下来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-22 20:23:45 | 显示全部楼层
恩??那我就不清楚了...
我t单步调试一切正常阿..0x1c=十进制28,一路这样按下来,到CX=0005时
DEBUG显示应该是

MOV AL,[BX]        DS:0017=B8

B8即是MOV AX,4C00H指令的起始字节.
反之如果我使用g命令或是在LOOP指令处用p指令越过去,
用d指令查看es:0开始的内存内容就会遇到你的结果

无解了...有请潜水的高手们...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-22 20:53:16 | 显示全部楼层
int 21h,我用DEBUG调试到这一步,然后再T了一下,而不是按P,然后在看其内存的。你试下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-22 21:21:40 | 显示全部楼层
int 21h,我用DEBUG调试到这一步,然后再T了一下,而不是按P,然后在看其内存的。

这...不会影响结果吧??指令来到int 21h,所有对於es:[bx]写入的指令已经完成,
在这个时候使用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段

结果还是对不上我就没辄了...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-23 09:16:44 | 显示全部楼层
待会我在看看吧,谢谢你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-12-23 10:18:57 | 显示全部楼层
加我下好友,我发我的调试截图给你看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 10:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表