大家好:
我是初学者,自学王爽的《汇编语言第一版》。当然,我看第二版差不多。
第六章实验5的最后一题,我按照网上下载的标准答案写了一下,也没觉得有什么错误,
但是运行的时候报错了。错误信息是----
“NTVDM CPU遇到无效指令。CS:0000 IP:0077 OP:f0 37 05 0c 02”.
我的代码的地址是“0C5B:0000”,根本没有操作“0000:0077”,我又换了一台电脑,还是报错。
我是初学者,知识不多,请大家帮我找找错误。
源码如下:
////////////////////////////////
实现的功能就是把a段的数据倒序放到b段中。
////////////////////////////////
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start:
mov ax,b
mov ss,ax
mov sp,10h
mov ax,a
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
////////////////////////////////
当循环到第5次时,push已经成功,add bx,2出错了。
当时bx的值是000A,sp的值是0004,按理说不是超位的问题。
还有一个问题--就在我调试的时候,我发现刚运行的时候,我的栈段数据都是0,但刚运行到
mov cx,8的时候,也就是还没有向栈压数据时,栈里就有其他的数据了。这个是为啥呀。是不是
就是导致上面问题的原因呢?
高手,请帮帮我把。谢谢了。我已经调试2天了。换了很多种思路,就是不行。
------解决方案--------------------------------------------------------
没看出问题来,不过段还是要关联一下吧.
assume cs:code,ds:a,ss:b
------解决方案--------------------------------------------------------
调试软件的中断、程序执行时发生的硬件中断(比如时钟中断、键盘中断等等)都会使用到你的堆栈,虽然通常不会占用太大的空间,但那 3 个 WORD 却是必须的,然后中断程序往往会将堆栈切换到自己的堆栈段以免对用户程序的堆栈产生大的影响。
这方面的内容,慢慢的累积吧,逐渐会理解的;要是想看看些什么就能彻底明白的话,有些难。