简单但让人郁闷的问题。。。!

qkhmyi 2003-09-29 11:07:01
我定义一个字符串,不用简化段定义的时候为什么会是无效指令,程序这样的:

data segment
_str db 'hello,world'
data ends

后边应该是正确的。。但一运行就没了,无效指令,改成:
data segment
_str db 10 dup('a')
data ends
又是好好的,

用简化段定义。。
.data
_str db 'hello,world'

也是好好的。。。为什么啊???
...全文
44 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wylpro 2003-10-10
  • 打赏
  • 举报
回复
哦,过完国庆我才上网的.
你最好这样.

连接时让连接器(不是编译器)输出map文件看看,了解段如何排序
然后大致了解一下exe结构(借些早期的书籍.
csdsjkk 2003-10-01
  • 打赏
  • 举报
回复
end
改成:
end start
是正确的方法,

根据masm的规定,
如果汇编代码中不指定入口地址,
那么,编译程序把0000作为默认入口地址,
也就是从_str开始运行,
而_str开始处的机器码是 'hello,world',
这里本是一段数据,不是指令代码,
(非法)执行它的后果就是系统死机或异常;
但是如果把代码段(code segment)放到前面,则运行正常,
这只是一个巧合,
应为现在start的地址成了0000,
也就是说,start成了程序的默认入口地址(本就应该是),当然运行正常了



qkhmyi 2003-10-01
  • 打赏
  • 举报
回复
不好意思,当初只说给10分,为什么不能多给点,哈哈。。下次再送吧!
qkhmyi 2003-10-01
  • 打赏
  • 举报
回复
谢谢,结贴!只有280分,拿80分来分给楼上的高人和wylpro了。。。
dunkel 2003-10-01
  • 打赏
  • 举报
回复
主要还是没有指定程序从那里开始运行的缘故. 当使用 .data 形式定义数据段时, 也同样使用了 .code 来定义代码段了吧? .code 就有定义程序从那里开始运行的作用. 在程序没有指定从那里开始运行时, 一般是从程序的开始进行, 你原来的程序开始是数据段, 所以运行是有可能非法, 这和数据的内容有关系, 后来 wylpro 将代码段挪到数据的前面就避开了这个问题. 但最好还是要用 end 语句来明确地指定程序实际是从那里开始运行的; 或者用 .STARTUP 之类的宏也可以. 至于在使用了 end start 后编译时出错, 是由于你的 start: 标号为局部属性的, 一是可以定义为全局属性的, start:: , 或者是在用 6.x 的 ml 进行编译是加上 /Zm 以使用 masm5.0 的兼容方式.
SoRoMan 2003-09-30
  • 打赏
  • 举报
回复
但一运行就没了,无效指令??
qkhmyi 2003-09-30
  • 打赏
  • 举报
回复
我试过wylpro说的,果然对了。。不过有点想不通,特别是后边一种,怎么把data段定义在后边也行,那前边用到data的时候用的哪个呢?难道汇编程序自己到后边去找?
qkhmyi 2003-09-30
  • 打赏
  • 举报
回复
wylpro() 能解释一下为什么吗?
Tiangua 2003-09-30
  • 打赏
  • 举报
回复
_str db 'hello,world',$
wylpro 2003-09-30
  • 打赏
  • 举报
回复
end main


要不就调整顺序

code segment
main proc far
assume ds:data,cs:code

start:
mov ax,data
mov ds,ax

exit:
mov ax,4c00h
int 21h

main endp
code ends

data segment
_str db 'hello,world'
data ends

end
qkhmyi 2003-09-30
  • 打赏
  • 举报
回复
对啊。。我也搞不懂,就应该是内存问题。。高手来看看呗!
blooney 2003-09-30
  • 打赏
  • 举报
回复
好像没有用到Hello, world呀。怎么无效了就??
qkhmyi 2003-09-30
  • 打赏
  • 举报
回复
改成end start编译都通不过?说start没有定义!我用的masm6.11编译的。。。
zxy1492 2003-09-30
  • 打赏
  • 举报
回复
最后一行改成
end start
再试试
qkhmyi 2003-09-30
  • 打赏
  • 举报
回复
完整的程序这样的:

data segment
_str db 'hello,world'
data ends

code segment
main proc far
assume ds:data,cs:code

start:
mov ax,data
mov ds,ax

exit:
mov ax,4c00h
int 21h

main endp
code ends
end

   这个程序应该有问题,但我实在看不出还有什么问题!书上和例子也就这样的,今天更奇怪,我用“hello,world”就要错,改短一点,改成"hello",就不会,不知道什么问题?
simclock 2003-09-29
  • 打赏
  • 举报
回复
具体点儿呢?

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧