x86 NASM 崩溃 - 迭代字符串

问题描述 投票:0回答:1

如何迭代 x86 汇编中字符串的各个字符并打印它们?


    global _main            ; declare _main entry point
    extern _printf          ; extern method

    section .data
    string: db 'Iterate over this string #test', 0
    character: db '_', 0
    endStr: db 'Ended.', 0

    section .text
_main:  
    lea eax, string         ;load address of string to eax

loop:
    mov cl, [eax]           ; access [eax] in memory, save char to cl
    test cl, cl         ; check if zero terminator
    jz end              ; exit if 0

    mov [character], cl     ; write char to memory (character)
    push character          ; print character
    call _printf
    add esp, 4          ; clear stack

    inc eax             ; increment address
    jmp loop            ; loop again

end:
    push endStr         ; print 'Ended.'
    call _printf
    add esp, 4          ; clear stack
    ret             ; exit

我当前的程序在打印字符串的第一个字符“I”后崩溃。控制台没有输出错误。

感谢您提前提供的任何帮助。

assembly x86 nasm calling-convention
1个回答
0
投票

如果您知道如何操作,请尝试使用调试器单步执行程序 推荐的调试器 Linux:gdb Windows:x64dbg

我认为问题是你试图清除堆栈,尽管我认为 printf 自己做到了这一点,这取决于架构师和一切 您可以尝试通过编译带有调试信息的 hello world 并反编译它来了解如何使用它

© www.soinside.com 2019 - 2024. All rights reserved.