Har*_*mis 2 c assembly replace nasm segmentation-fault
使用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
Run Code Online (Sandbox Code Playgroud)
我然后编译使用:
nasm -felf64 test_code.asm && gcc test_code.o -lm
Run Code Online (Sandbox Code Playgroud)
并得到一个段错误.有人请指出这里的缺陷吗?我似乎无法自己找到它.
.text可执行文件的部分中,默认情况下是只读的.您可以在堆栈上分配缓冲区,复制字符串并在那里修改它,或者.data使用该section指令将字符串放入部分(读/写)中.在最后一种情况下,请注意字符替换将是持久的,即使在程序的后期,字符串将保持修改;printf它打印那个字符串必须是NUL终止的.添加,0到db行尾;mov rax, index是错的 - 你上面写的qword index的地址,而你实际上想要在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
Run Code Online (Sandbox Code Playgroud)