使用NASM,我需要在给定索引处更改字符串中的一个字符,并以新的形式打印该字符串
;test_code.asm
global main
extern printf
output_str: db "----------"
index: dq 7
main:
push rbp
mov rdi, output_str
mov rax, index
mov byte[rdi + rax], 'x'
xor rax, rax
call printf
pop rbp
ret
然后我使用进行编译
nasm -felf64 test_code.asm && gcc test_code.o -lm
并得到一个seg错误。有人能指出这里的缺陷吗?我自己好像找不到。
- 您的字符串位于可执行文件的
.text
部分,默认情况下该部分为只读。要么在堆栈上分配一个缓冲区,复制字符串并在那里进行修改,要么使用section
指令将字符串放入.data
部分(读/写)。在最后一种情况下,请注意,字符替换将是持久的,即即使在程序的后期,字符串也将保持修改状态 - 如果要使用
printf
打印该字符串,则必须以NUL结尾。在db
行的末尾添加一个,0
mov rax, index
是错误的-index
是您在上面写的qword的地址,而您实际上想在rax
中复制在那里写的数据;你可能想要mov rax, [index]
所以,类似的东西
;test_code.asm
global main
extern printf
section .data
output_str:
db "----------",0
section .text
index:
dq 7
main:
push rbp
mov rdi, output_str
mov rax, [index]
mov byte[rdi + rax], 'x'
xor rax, rax
call printf
pop rbp
ret