在NASM中使用strstr()的返回值?

时间:2017-04-23 12:44:48

标签: c assembly x86 nasm

我正在尝试在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

1 个答案:

答案 0 :(得分:1)

主要问题是搜索字符串中的0x0A。它是字符串的一部分,因为终止null之前的所有内容都是它的一部分。它必须单独列出,因为汇编器不会解析字符串中的C-style escape sequencesstrstr无法找到“test \ n”。删除0x0Astrstr会找到搜索字符串。

正如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