NASM 汇编代码以前可以工作,但现在不行,并且正在删除一个分段错误

NASM assembly code working before, but not now and is dropping a segmentation fault

edit: I added an image of the error shown in gdb 我的汇编代码有问题。这段代码曾经对我有用,它给出了我需要的正确输出(主要是 string1,因为我需要将其元音字符更改为其他字符)。然而,几个小时后,它停止工作,现在正在转储分段错误。

section .data
    NULL equ 0
    SYS_EXIT equ 60
    string1 db 'hello everyone', NULL
    strlen dq 0

section .bss
    string2 resb 20

section .text
_start:
    mov rdi, string1
    mov rsi, strlen
    call get_strlen

    mov rdi, qword[strlen]
    mov rsi, string1
    mov rdx, string2
    call get_vowel

exit_here:
    mov rax, SYS_EXIT
    xor rdi, rdi
    syscall


get_strlen:
    len_loop:
        mov al, byte[rdi]
        cmp al, NULL
        je return

        inc rdi
        inc byte[rsi]
        jmp len_loop
    return:
        ret

get_vowel:
    mov rcx, rdi
    mov rsi, rsi
    mov rdi, rdx
    cld
    str_loop:

    lodsb
    stosb

    cmp al, 'a'
    je vowel_a
    cmp al, 'e'
    je vowel_e
    cmp al, 'i'
    je vowel_i
    cmp al, 'o'
    je vowel_o
    cmp al, 'u'
    je vowel_u
    loop str_loop

    mov byte[rdi], NULL
    jmp str_copy

    vowel_a:
        dec rdi
        mov byte[rdi], '@'
        inc rdi
        jmp str_loop

    vowel_e:
        dec rdi
        mov byte[rdi], '3'
        inc rdi
        jmp str_loop

    vowel_i:
        dec rdi
        mov byte[rdi], '1'
        inc rdi
        jmp str_loop

    vowel_o:
        dec rdi
        mov byte[rdi], '0'
        inc rdi
        jmp str_loop

    vowel_u:
        dec rdi
        mov byte[rdi], 'U'
        inc rdi
        jmp str_loop

    str_copy:
        mov rcx, rdi
        mov rsi, rdx
        mov rdi, rsi
        cld
        jmp loop1

        loop1:
           lodsb
           stosb
           loop loop1 
           mov byte[rdi], NULL
           jmp return1
    return1:
     ret

根据 gdb,函数 get_vowel 的 on loop1 有问题。然而,根据我目前对汇编的了解,我相当确定它是有效的。

本例中 string1 的假设值为

h3ll0 3v3ry0n3

然而它只输出它的默认值

原来代码一开始并没有真正起作用,哈哈。 str_copy 循环中 rcx 的值是一个地址,rdirsi 的值没有被切换,所以如果有的话,那部分没有发生任何事情的代码。为了解决这个问题,我初始化了另一个具有相同值 rcx 的寄存器和另一个交换 rdirsi 地址的函数,这样我就可以将 string2 的内容复制到string1 如下图函数所示

swap:
push rbp
mov rbp, rsp
sub rsp, 8

mov r10, rdi
mov qword[rbp-8], r10
mov r10, rsi
mov rdi, r10
mov r10, qword[rbp-8]
mov rsi, r10
jmp swap1

swap1:
mov rcx, rdx
mov rsi, rsi
mov rdi, rdi
cld

loop1:
    movsb
    loop loop1
    mov byte[rdi], NULL

add rsp, 8
pop rbp
ret