我正在尝试在NASM汇编程序中使用strstr C函数,但似乎无法正确打印出来。我尝试了多种变体,但我想我可能会误解NASM如何从C返回指针值,因为我在printf中返回一个空行或'(null)'。有些帮助可以填补我为什么我无法获得正确的返回值进行打印?
section .data
str1 db "Here is some text with a word",0x0A,0x00
str2 db "text",0x0A, 0x00
strFmt db "%s",0x0A,0x00
global _start
extern printf
extern strstr
section .text
_start:
push ebp
mov ebp, esi
push str2
push str1
call strstr
add esp, 8
mov dword [myString], eax
push dword [myString]
push strFmt
call printf
add esp, 8
_exit:
mov ebx, 0
mov eax, 1
int 0x80
答案 0 :(得分:1)
主要问题是搜索字符串中的0x0A
。它是字符串的一部分,因为终止null之前的所有内容都是它的一部分。它必须单独列出,因为汇编器不会解析字符串中的C-style escape sequences。 strstr
无法找到“test \ n”。删除0x0A
,strstr
会找到搜索字符串。
正如Cody Gray所提到的那样,mov ebp, esi
的块很奇怪 - 你可能意味着惯用mov ebp, esp
。而且,在这个例子中不需要它。同样多余的是myString
的间接 - 直接push eax
。
printf
首先将输出写入缓冲区。您通过int 80h
系统调用退出程序。此调用将破坏进程的所有内容,包括printf-buffer。因此不会输出缓冲区。有两种方法可以解决这个问题:
1)使用C函数exit
代替系统调用:
section .data
str1 db "Here is some text with a word",0x0A,0x00
str2 db "text",0x00
strFmt db "%s",0x0A,0x00
global _start
extern printf, strstr, exit
section .text
_start:
push str2
push str1
call strstr
add esp, 8
push eax
push strFmt
call printf
add esp, 8
_exit:
push 0
call exit
2)添加对C函数fflush
的调用:
section .data
str1 db "Here is some text with a word",0x0A,0x00
str2 db "text",0x00
strFmt db "%s",0x0A,0x00
global _start
extern printf, strstr, fflush
section .text
_start:
push str2
push str1
call strstr
add esp, 8
push eax
push strFmt
call printf
add esp, 8
push 0
call fflush
_exit:
mov ebx, 0
mov eax, 1
int 0x80