2012-03-29 160 views
0

我尝试使用以下masm代码输出cmd屏幕中hello的字符串长度。 我创建了一个名为strlo的函数来计算字符串长度。masm中的字符串长度

.486 
.Model flat,Stdcall 
option casemap :none ; case sensitive 


include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
include \masm32\include\masm32.inc 
includelib \masm32\lib\masm32.lib 

strlo PROTO :DWORD 
.data 
msg db "Hello",0 

.data? 
pr dd ? 

.code 
start: 

invoke strlo,addr msg 
strlo proc parm:DWORD 
xor eax,eax 
mov edi,parm 
l1: 
cmp byte ptr [edi] ,0 
je l2 
inc edi 
inc eax 
jmp l1 
l2: 
ret 
strlo endp 
invoke StdOut,eax 
invoke ExitProcess,0 
end start 

当我运行它,我得不到输出。

F:\ MASM32> len.exe

F:\ MASM32>

回答

1

的一个问题是,你必须在你的代码的中间的strlo定义。它将在它定义的地方执行。相反,你应该把它移动到结束,让你的主代码如下所示:

invoke strlo,addr msg 
invoke StdOut,eax 
invoke ExitProcess,0 
0

控制在标签“开始”开始,因为你写了“结束的开始”,然后在“RET”产生。 “调用StdOut,eax”和“调用ExitProcess,0”从未执行过。要在cmd屏幕上输出你好的字符串长度,你应该改变如下:

strlo proc parm:DWORD 
... 
strlo endp 

start: 

invoke strlo,addr msg 
invoke StdOut,eax 
...