请问各位“51598+398146 bytes symbol space free”的具体意思是什么?

bsnhk 2004-10-18 12:16:25
我编了一个汇编语言源程序tt.asm,然后用masm 5.0进行汇编,提示信息如下:
-----------------------------------------------
c:\>masm tt.asm
Microsoft (r) macro assembler version 5.00
copyright (c) microsoft corp 1981-1985,1987. all rights reserved.

object filename [tt.obj]:
source listing [nul.lst]:
cross-reference [nul.crf]:
51598+398146 bytes symbol space free
0 warning errors
0 severe errors
-----------------------------------------------

我的问题是:
1、“51598+398146 bytes symbol space free”中那两个数字分别是什么意思?它们加起来又是指什么的大小?
2、“n bytes symbol space free”这句话是什么意思?

在这之前我已经找了好久的相关资料,可就是没见有这方面的解释,所有只好上csdn来求助于各位了,请帮帮忙,小弟不胜感激!
...全文
2754 67 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
67 条回复
切换为时间正序
请发表友善的回复…
发表回复
clumsy 2004-11-11
  • 打赏
  • 举报
回复
不是 Intel 的人吧, 应该是 ms 的才对
xjp6688 2004-11-11
  • 打赏
  • 举报
回复
有INTEL的人吗?
bsnhk 2004-11-10
  • 打赏
  • 举报
回复
再发一遍:将“这258.82k是废弃堆栈的空余部分和其他可用基本内存之和”改为“这258.82k是废弃堆栈的已用部分和其他可用基本内存之和”
别说权威的答案,到目前为止还没有一个没有矛盾的答案,一定是某些事实还没发现。
我整理一下前面qingjin(qingjin)的解释,实在不明白以下三处解释如何才能统一:
(1)masm5.exe脱壳后是107k。

(2)这130k左右的空间正是masm5本身占用的。

(3)
|------------------||-----+++++|
masm5占用的空间 masm5废弃的堆栈(减号部分是第一个数字50.38k)



现在只根据第(2)、(3)两条整理一下解释:
废弃的堆栈由已用的和空余的这两部分组成,如果两个数字之和是可用基本内存大小,现在两数字之和为439.2k,减去masm5本身占用的130k,剩下309.2k,再减去第一个数字50.38k(废弃堆栈的空余部分),剩下258.82k,这258.82k是废弃堆栈的已用部分和其他可用基本内存之和。258.82k加上masm5占用的130k等于388.82k正是第二个数字。总结:第一个数字是masm5废弃堆栈空余部分,第二个数字是masm5本身占用的空间、masm5废弃堆栈中已用部分和其他不被任何应用程序占用的可用基本内存这三者之和。(有点头晕!)
“废弃的堆栈”到底是什么东西呢?程序似乎有生命,将本来属于它的一部分抛弃,于是该程序在内存执行的过程中其体积会发生变化。
我相信事实不会很复杂。
bsnhk 2004-11-10
  • 打赏
  • 举报
回复
别说权威的答案,到目前为止还没有一个没有矛盾的答案,一定是某些事实还没发现。
我整理一下前面qingjin(qingjin)的解释,实在不明白以下三处解释如何才能统一:
(1)masm5.exe脱壳后是107k。

(2)这130k左右的空间正是masm5本身占用的。

(3)
|------------------||-----+++++|
masm5占用的空间 masm5废弃的堆栈(减号部分是第一个数字50.38k)



现在只根据第(2)、(3)两条整理一下解释:
废弃的堆栈由已用的和空余的这两部分组成,如果两个数字之和是可用基本内存大小,现在两数字之和为439.2k,减去masm5本身占用的130k,剩下309.2k,再减去第一个数字50.38k(废弃堆栈的空余部分),剩下258.82k,这258.82k是废弃堆栈的空余部分和其他可用基本内存之和。258.82k加上masm5占用的130k等于388.82k正是第二个数字。总结:第一个数字是masm5废弃堆栈空余部分,第二个数字是masm5本身占用的空间、masm5废弃堆栈中已用部分和其他不被任何应用程序占用的可用基本内存这三者之和。(有点头晕!)
“废弃的堆栈”到底是什么东西呢?程序似乎有生命,将本来属于它的一部分抛弃,于是该程序在内存执行的过程中其体积会发生变化。
我相信事实不会很复杂。
xjp6688 2004-11-09
  • 打赏
  • 举报
回复
不知何时才能有一个权威的答案!
notno 2004-11-09
  • 打赏
  • 举报
回复
路过,呵呵。
bsnhk 2004-11-07
  • 打赏
  • 举报
回复
本人才疏学浅,有哪位高手能给小弟解答“废弃的堆栈”是什么东西吗?为什么“masm5占用的空间不包括它废弃的堆栈”?
本人认为,无论MASM5的堆栈空间如何使用,整个MASM5在内存的大小自始至终是固定的,因为堆栈空间是MASM5这个程序一开始就开辟的,无论堆栈空间使用了多少废弃了多少,都是整个MASM5占用内存的其中一部分。如果我的观点不对别骂我!:)
bsnhk 2004-11-07
  • 打赏
  • 举报
回复
to qingjin(qingjin):
我真不明白你怎么就这么激动?看来我以后提任何问题都要小心翼翼的用“请问XX高手是……的吗?”模式,否则就是在无知的“振振有词”!我在这里是讨论问题的,尽管学有所短,也有提问的权利,也有错误的肯定某些东西的权利,你大可以说“你错了,因该是这样的……”。我这点分算得了什么?何至于你说出“分给不给随你便”、“算我倒霉”、“遇上你这种人”之类的话?兄台真是搞笑!
你在这个问题中发不发言那是你的自由,你在这个问题上的贡献也有目共睹,没人能够抹煞!
这是网络,我不会因为什么攻击、诬蔑而生气、激动、歇斯底里,因为这些是没意义的!除非你把我的裸照放到网上,让千千万万的人看到真实的我!
qingjin 2004-11-07
  • 打赏
  • 举报
回复
再讲得详细些吧。
|----------------------------------------------------------------|可用基本内存空间
|------------------||-----+++++|
masm5占用的空间 废弃的堆栈(减号部分是第一个数字)
|--------------------------------------------|
通过调用两次21h中断功能48h得到的空间大小(二个数字之和)

masm5.exe在执行过程中换了一次堆栈,因此之后通过调用两次21h中断功能48h得到的空间大小是图上的部分。我想这下你该清楚了吧,至于为什么要把第一个数字表示出来而不是直接写两数的和,原程序如此,你那么能想,你就自己想吧。

引用:
你说“masm5得到的可用基本内存的大小”应该是在未运行masm5之前用mem查到的可用基本内存的大小。所以这130k左右的空间应该不是masm5本身占用的。

哈哈,笑死我了。
我用mem查?运行masm5之前?告诉你吧,这130k左右的空间正是masm5本身占用的。

我说你像是中文系的,不是因为你咬文嚼字,而是因为你有点歇斯底里。
我说你注意点提问的艺术,是因为我从来没看到对计算机学个一鳞半爪,一知半解的人如此振振有词,提问如此不客气。

我的分给不给随你便。算我倒霉,遇上你这种人。我不准备在这个帖子再发一次言。
kokblack 2004-11-07
  • 打赏
  • 举报
回复
每天都来看看, bsnhk 兄弟,问题越论越明了,从中也学到不少东西。哈哈PF
bsnhk 2004-11-07
  • 打赏
  • 举报
回复
to qingjin(qingjin):
我一开始就赞赏你的观点,我觉得你指明了一个方向,但我没有必要立即就说你全对,我需要印证。我跟你的讨论就是要鸡蛋里挑骨头,目的就是要将我的疑虑扫除,这完全是一种求是的做法。
我昨晚作了一个实验,发现了一个疑点,如果你还对这个“旁枝末节”的问题有兴趣的话,就请你来讨论讨论吧!

用一张dos启动盘启动计算机,然后运行mem命令得到信息:
memory type total used free
------------------------------------
conventional 640k 97k 543k
基本内存

汇编ts.asm后得到的信息为:
51672+372008 Bytes symbol space free.

51672+372008=423680字节=413.75k(可用基本内存为543k,而这里是413.75k)
543k-413.75k=129.25k (这129.25k空间是什么呢?)

再次运行mem得到的信息还是:
memory type total used free
------------------------------------
conventional 640k 97k 543k
基本内存

运行smartdrv.exe让其驻入基本内存,再次运行mem,得到的信息如下:
memory type total used free
------------------------------------
conventional 640k 127k 514k
基本内存

可见smartdrv.exe驻入基本内存后占了29到30k左右的空间。

再次汇编ts.asm得到信息如下:
51672+341544 Bytes symbol space free.

发现只有第二个数字变化了,372008字节-341544字节=30464字节=29.75k,汇编提示的信息正好印证了smartdrv.exe所占去的空间的大小。第一个数字没有变化说明这个数字跟masm5有关(或者还跟被汇编的源程序有关)。现在可以确信第二个数字跟可用基本内存的大小有关。

51672+341544=384k
514k-384k=130k
这跟前面的129.25k应该是同一样东西。那么这部分空间到底是什么?

按照你的解释,两个数字之和是可用基本内存的大小,可用基本内存的大小是在没有运行masm5之前就可以用mem命令查看得到的,可是前面的实验数据表明masm5提示的两个数字之和跟用mem命令查看到的可用基本内存之间有130k左右的缺口。
你说“masm5得到的可用基本内存的大小”应该是在未运行masm5之前用mem查到的可用基本内存的大小。所以这130k左右的空间应该不是masm5本身占用的。

所以我的实验结论是:两个数字之和+130k=可用基本内存大小(这里的130k左右的空间只是我在这次实验中得到的数据,也许在别的实验中有所变化)。
bsnhk 2004-11-07
  • 打赏
  • 举报
回复
那好吧,算是我先前对“可用基本内存”理解有误。现在我知道“可用基本内存”就是剩余的可以提供给应用程序使用的基本内存的大小。

你的原话是:前一个数字是masm.exe执行后的自身堆栈剩余大小,后一个数字是该程序先得到可用基本内存大小,再减去前面的数字;也就是说两者之和是可用基本内存大小。
你说这话的前提显然是masm.exe执行后还占据着内存空间不释放,所以才有“自身堆栈剩余大小”的说法。
从你这个前提出发,请看下面图示(这应该就是你的原意):
|---------------------------|(可用基本内存空间)
|------------------| (masm5占有的空间)
|---------| (堆栈剩余空间)
|---------| (前一个数字表示的空间)
|-----------------|(后一个数字表示的空间)
|---------------------------|(两个数字加起来的空间)

请注意“后一个数字表示的空间”中既包含了masm5占用的空间也包含了不被任何程序占用的剩余基本内存。而这显然跟“space free”提示不符。
“堆栈剩余大小”是space free的,这可以理解;但将masm5中代码跟数据所实际占用的空间加上其他基本内存剩余空间也说是space free的,这很难接受。

讨论问题就讨论问题呗,还讲什么艺术!:)
qingjin 2004-11-06
  • 打赏
  • 举报
回复
无语!!!
可用基本内存=available memory也就是说剩余内存大小。
强烈建议你了解计算机常用语,也就是说你去好好学习计算机再来这里嚼舌头。

我用的masm5.exe是68571字节,脱壳之后是109767字节,也就是107k,嘿嘿,这回你可说对了。

我看楼主怎么像是学中文的,不像是学计算机的,我希望你以后注意点提问的艺术。
bsnhk 2004-11-06
  • 打赏
  • 举报
回复
to qingjin(qingjin) :
“n Bytes symbol space free”很明显是说什么空余空间的大小。
而你说:
1、“前一个数字是masm.exe执行后的自身堆栈剩余大小”,暂时接受这一说法。
2、“后一个数字是该程序(指masm5)先得到可用基本内存大小,再减去前面的数字;也就是说两者之和是可用基本内存大小”。显然,你说的“该程序(指masm5)先得到可用基本内存大小”并不是指masm5允许使用的基本内存大小,而是指masm5实际占的基本内存的大小。如果你说的“该程序(指masm5)先得到可用基本内存大小”是指masm5允许使用的基本内存大小,那跟你后面说的“两者之和是可用基本内存大小”是矛盾的,因为两者是一回事。所以我只好作前一个理解了。
请看图示:
masm5实际占用的基本内存大小|=====================| (这不是什么剩余空间)
masm5执行后自身堆栈剩余大小|-----|***************| (*号部分表示已用的,-号部分表示堆栈剩余大小)
后一个数字表示的内存大小 |===============| (这也不是什么剩余空间)
两个数字之和是masm5实际占用|=====================| (这更不是什么剩余空间)
的基本内存大小

而“n Bytes symbol space free”很明显是说什么空余空间的大小,如果按你的说法那只有前一个数字是“空余空间大小”,后一个数字不是。

51598+398146约439k,这439k是我们正在探讨的什么空余空间的大小。
基本内存全部有640k,减去中断向量表、BIOS数据区、还有预留给DOS等使用的空间后,剩下638K左右的空间给程序使用,再减去92K的COMMAND.COM(这里假设COMMAND.COM没有压缩)就剩下546K空余空间,现在用546K减去439k剩下107k,这107k是被占用的空间大小,masm5的可执行文件有100.8k左右,如你在前面实验所说,masm5有压缩壳,就算是在内存解压后有107k吧,这区区7k就是masm5的作者对一个107k的程序的压缩程序效果!
kokblack 2004-11-06
  • 打赏
  • 举报
回复
每次电脑加电的时候也有这么个信息,你可以对比一下!
qingjin 2004-11-06
  • 打赏
  • 举报
回复
我看你倒挺有意思
bsnhk 2004-11-06
  • 打赏
  • 举报
回复
汇编语句和机器码的关系是一一对应关系,你是否以为因为这样所以汇编语句就可以简单的一条一条的变换成对应的机器码了?你说的“MASM 5 是使用Microsoft C 4.0 编写的”我还是第一次听见这种说法。
你是说那两个数字跟masm5有关,与编译的程序无关?这个说法有意思,容我再研究研究。
qingjin 2004-11-06
  • 打赏
  • 举报
回复
To bsnhk:
关于汇编语句和机器码的关系还请再仔细看看。

我再解释一遍:前一个数字是masm.exe执行后的自身堆栈剩余大小,后一个数字是该程序先得到可用基本内存大小,再减去前面的数字;也就是说两者之和是可用基本内存大小。
bsnhk 2004-11-06
  • 打赏
  • 举报
回复
附上我前面问题中tt.asm的内容:
----------------------------
dseg segment

dseg ends

cseg segment
assume ds:dseg,cs:cseg
start:
push ds
sub ax,ax
push ax
mov ax,dseg
mov ds,ax
mov ah,4ch
int 21h
cseg ends
end start
----------------------------
其实这只是一个汇编语言源程序框架而已。
bsnhk 2004-11-06
  • 打赏
  • 举报
回复
下面我写了一个程序来验证qingjin(qingjin)的说法:
------------------------------------
dseg segment
tt db 65000 dup (0) ;定义65000字节的数据空间
dseg ends

sseg segment
db 65000 dup (0) ;开辟65000字节堆栈空间
sseg ends

cseg segment
assume cs:cseg,ds:dseg,ss:sseg
start:
push ds
sub ax,ax
push ax
mov ax,dseg
mov ds,ax
mov ax,sseg
mov ss,ax
mov ah,4ch
mov cx,32000 ;压栈32000次,让堆栈空间被尽量地占用。
s:
push ax
loop s
int 21h
cseg ends
end start
-------------------------------------
以上这个程序数据段超过65000字节,堆栈段超过65000字节,可是用MASM5.0汇编这个程序后提示信息如下:
------------------------------------
C:\>masm ts.asm
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.

Object filename [ts.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:

51594 + 398150 Bytes symbol space free

0 Warning Errors
0 Severe Errors
---------------------------------------
这里的“51594字节+398150字节”跟我前面问题中的“51598字节+398146字节”相比较,根据你的解释,我们现在可用的堆栈空间有51594字节,仅仅比我前面第一个程序中的可用堆栈空间少了4个字节;而现在可用的基本内存比我前面第一个程序中的可用基本内存还多了4个字节(我现在这个程序的可执行文件有127k左右,而我前面那个程序的可执行文件只有525字节)。

其实,进来讨论这个问题的人都不在乎这个问题的答案是否实用,也许我刚开始提出这个问题时确实是想知道确切地答案,不过我现在发现讨论这个问题更有趣。
加载更多回复(47)

21,497

社区成员

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

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