0

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

.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>

4

2 回答 2

1

一个问题是你strlo的代码中间有定义。它将在定义的地方执行。相反,你应该把它移到最后,让你的主要代码看起来像这样:

invoke strlo,addr msg
invoke StdOut,eax
invoke ExitProcess,0
于 2012-03-29T09:06:00.383 回答
0

控制从标签“start”开始,因为您写了“end start”,然后在“ret”处产生。“invoke StdOut,eax”和“invoke ExitProcess,0”从未执行。要在 cmd 屏幕中输出 hello 的字符串长度,您应该更改如下:

strlo proc parm:DWORD
...
strlo endp

start:

invoke strlo,addr msg
invoke StdOut,eax
...
于 2012-05-29T13:22:15.797 回答