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
的值是一个地址,rdi
和 rsi
的值没有被切换,所以如果有的话,那部分没有发生任何事情的代码。为了解决这个问题,我初始化了另一个具有相同值 rcx
的寄存器和另一个交换 rdi
和 rsi
地址的函数,这样我就可以将 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
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
的值是一个地址,rdi
和 rsi
的值没有被切换,所以如果有的话,那部分没有发生任何事情的代码。为了解决这个问题,我初始化了另一个具有相同值 rcx
的寄存器和另一个交换 rdi
和 rsi
地址的函数,这样我就可以将 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