王爽老师的汇编教材实验10
一开始写的时候忘记出栈DX和CX(判断为0后跳过了出栈CX那步)了,指针老是到不了int 21h
后来我抽了一根烟,没事把call和ret换成了call far ptr和retf,居然正常结束程序了,然后我又抽了根烟想这是为什么,再后来我单步调试时发现了我忘记出栈DX和CX了,把CALL时入栈的指针地址压下去了,如图,我后来在RET前pop了DX和CX就没问题了,但是疑问产生了,... 为什么没出栈DX和CX时,用call far ptr 和retf能正常结束呢? 逐步调试时发现retf之后IP没有指向mov ah,4ch的内存地址,而是之前入栈没出栈的DX:CX这个内存地址,为什么直接运行的时候就能正常结束呢? 我又试着压入了两个字的地址,结果很奇怪,哪位大大帮我试试看吧,到底是为什么啊???我用的masm for windows 操作系统是64位win7的(这个没影响吧..)
------最佳解决方案--------------------------------------------------------
64位win7能执行16位代码吗?
------其他解决方案--------------------------------------------------------
反汇编一下772那段的代码看看
------其他解决方案--------------------------------------------------------
你直接跟到最后退出不知道为什么吗?
------其他解决方案--------------------------------------------------------
怪不得。。。
------其他解决方案--------------------------------------------------------
我又抽了好几根了,想不通睡不着觉啊~
------其他解决方案--------------------------------------------------------
masm for windows 自带的dosbox可以吧 应该是模拟16位机的 之前的程序都没问题..
------其他解决方案--------------------------------------------------------
直接跟到最后退出太远啦,要按几千下啊.... retf后跳转的地址是703:2(图中的代码去掉ok后的两次压栈),而中止指令在772:x 所以我直接用g指令试了下,然后就是看不懂的显示缓冲区了。然后我把程序源码改成如图,想的是从这几个地址出发直接run一下看结果(反正逐步debug也看不懂),结果从703附近的地址出发都能run出正确结果(有结束提示符),600+,800+的也可以,不过退出提示符上面有个divde error,然后900+的DOSBOX就死了,500+的也不能出现结束提示。
我在想会不会是DOS有自动在附近地址搜寻中止程序语句的功能...
求达人指导啊~