数据越界?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?——汇编程序调试小记的主要内容,如果未能解决你的问题,请参考以下文章

数据越界?Open Segment?——汇编程序调试小记

Segment fault 常见原因

linux出现segment fault怎么解决?

Segment fault及LINUX core dump详解 (zz)

cogs 775山海经 ——Segment Tree

Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)