数据越界?Open Segment?——汇编程序调试小记
Posted 迂者-贺利坚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据越界?Open Segment?——汇编程序调试小记相关的知识,希望对你有一定的参考价值。
汇编语言的上机课,一位同学的程序在link阶段出问题了。看提示,是这样的:
怪事。在连接环节中,会有存取数据越界的问题。
啥蛾子也敢出来飞。
看学生的程序,是这样的(这不是他的原始程序,我找一段差不多样子的程序展示这个问题):
assume cs:code
code segment
string db 'abcdefghij'
start:
mov ah,01 ;从键盘输入字符1~9
int 21h
and al,0fh
dec al
mov ah,0
mov bx,offset string
add bx,ax
mov dl,cs:[bx]
mov ah,02h ;显示输出
int 21h
mov ah,4ch
int 21h
end start
code ends
“瞪眼法”无效。
我发现一个细节,和他讲,有中断就要用到栈,应该明确地建一个栈段。8086汇编中,并不是用到push和pop指令时才用栈,子程序调用、中断等,都会自动用栈,要注意到这种隐含用栈的需求,指定程序的栈段和栈顶寄存器。
但很显然,这不是发生在运行期间,还轮不上出这个问题。并且,只在模拟器里跑这个小程序,尽管用的是“野栈”,因此而挂掉的可能性几乎没有。
注意到他一开模拟器后就连接。他说在前面编译过,我让他再编译一遍给我看。
异常现身了!
这里提示CODE是个“Open segment”!何为Open段?开了口,没收住?
看程序中的Code段,发现最后两行是:
end start
code ends
应该改为
code ends
end start
程序到了伪指令end
,就认为结束了。后面尽管有code段的ends
,那也只是聋子的耳朵——摆设。所以有code段没收口,它是open的。
再编译、连接。搞定。
与蛾子共舞,妙哉!
以上是关于数据越界?Open Segment?——汇编程序调试小记的主要内容,如果未能解决你的问题,请参考以下文章