注册 登录
编程论坛 汇编论坛

Lengthof伪指令的疑惑

爱末流 发布于 2012-08-22 18:42, 2348 次点击
如题:Lengthof伪指令的疑惑  

我在模块1的文件定义的变量(数组),在模块2文件中 用lengthof  strMsg  返回的是1 无法返回长度
但是我在 主模块返回 28 没有任何问题。
还有我将改为 strMsg 地址传入 用pMsg 模块2 过程的形参pMsg 来接受然后改为 mov eax,lengthof pMsg 这句,也是返回1

百思不得其解,这是怎么回事啊?





这是主模块文件:

public strMsg     ;允许外部模块访问
.data
 strMsg byte "Please enter a size of stack to create: "  
.code
..........


 模块文件2:
extern strMsg:byte        ;说明为是外部模块定义的变量
.code
DisplayMsg proc pMsg:dword
           LOCAL @stdHandle:dword
           LOCAL @Reallbyte:dword
           mov eax,lengthof strMsg         这返回1,不知道怎么回事
                                           改为 mov eax,lengthof pMsg 这句也是返回1
endp DisplayMsg
2 回复
#2
zklhp2012-08-22 19:08
这玩意就是个伪指令 当然有点限制也正常啊
#3
爱末流2012-09-06 22:41
回复 2楼 zklhp
抱歉,原来没看仔细,是在其它模块里使用字符串类外部变量的长度。这个,恐怕不行了。象 sizeof 这样的,应该是编译时就确定了的,其实际内容就是一个立即数;而对外部变量的话,则必须要等到链接时才能确认,因为编译只是针对当前模块的;而且,链接时的对外部变量的相关信息,往往也只是地址的修正上。
所以,楼主你这样的要求,恐怕只能折中了。要么通过求字符串长度函数来得到其长度;要么再增设一个字符串长度的变量,在定义该字符串的模块里设置其内容,并 public 之;在其它模块里定义其为外部引用并使用它。


我终于明白了   我忽略了编译的问题。  是因为外部模块要需要独立编译的(MASM32手工编译),所以你在编译这个(模块2文件)引用外部变量的时,sizeof或lengthof是无法得知该全局变量的初始化造成的,因为他们是伪指令,要编译时候要确定其值,所以主模块中被引用的全局变量还没被编译,所以模块2引用他的时候编译时,这个全局变量的值是无法得知的(长度)。
1