主题:[讨论]QB程序的格式.
thinkSJ
[专家分:0] 发布于 2010-10-01 17:07:00
迫于"生活"压力最近不得不去学一下QB了,目前是7.1,在网上苦搜了一翻之后,发现这里对QB讨论的比较多,因此在这里发贴咨询一下各位大侠,先谢过了~[em1]
一个BAS文件被编译成一个EXE之后,会被生成一个段,真正的代码从第49个字节开始,前48个字节貌似是一些配置信息,如:该BAS文件的名称,但之后的就不知道了,有没有哪个熟悉一点的大侠给指点一下??
回复列表 (共4个回复)
沙发
moz [专家分:37620] 发布于 2010-10-01 17:41:00
好像编译原理里面有说,但我没看懂没看完没去考。
板凳
thinkSJ [专家分:0] 发布于 2010-10-01 17:57:00
谢谢moz的回贴,个人感觉这应该是编译器的特殊做法,因为并不是所有语言的编译器都会生成这48个字节.
具体如下代码所示,这个程序是由MAIN.BAS编译出来的:
=======================================================
seg000 segment byte public 'CODE' use16
assume cs:seg000
assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
aBlmain db 'blMAIN '
db 0BDh ; ?
db 5
db 82h ; ?
db 0C5h ; ?
db 0B0h ; ?
db 2Ch ; ,
db 0D0h ; ?
db 6Ch ; l
db 0
db 0
db 0
db 0
db 0
db 0
db 50h ; P
db 0
db 20h
db 24h ; $
db 0
db 0
db 0
db 0
db 0D0h ; ?
db 6Ch ; l
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0
db 0FFh
db 0FFh
db 85h ; ?
db 1Eh
jmp short user_Entry ; 这是第一行代码,前面的不知道是些什么~!
Seg0_Ignore proc near ; CODE XREF: user_Entry+Ap
cmp ds:g_wIgnoreFuncFlag, 0
jnz short loc_1003A
retn
loc_1003A:
pop ax
push cs
push ax
jmp B$EVK1 ;
Seg0_Ignore endp
user_Entry proc near ; 程序的入口点.
...
3 楼
moz [专家分:37620] 发布于 2010-10-01 22:36:00
16位DOS下MS的编译都是用LINK把中间目标代码二次编译的,应该是一样的。
4 楼
thinkSJ [专家分:0] 发布于 2010-10-02 12:42:00
回MOZ,那个不是由LINK加进去的,再BC编译成OBJ文件的时候,就已经加进去了.
经过大半夜的研究,在文件名后的前两个字节的意义是该段有效代码的长度.
在QB中每个能正常结束的函数,编译器都会加入一条call B$EXSA,而一个段结束编译器加上一条
call B$CENP, 为了达到对齐的效果,在CENP函数之后会存在一些无意义的数据.那两个字节刚好指
向了这里,在上面的代码中是05BDh,正在看其它字段的意义,欢迎高手前来指点.
我来回复