如何使用NASM更改单个字节的值?

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)

并得到一个段错误.有人请指出这里的缺陷吗?我似乎无法自己找到它.

Mat*_*lia 5

  • 您的字符串位于.text可执行文件的部分中,默认情况下是只读的.您可以在堆栈上分配缓冲区,复制字符串并在那里修改它,或者.data使用该section指令将字符串放入部分(读/写)中.在最后一种情况下,请注意字符替换将是持久的,即使在程序的后期,字符串将保持修改;
  • 如果你想用printf它打印那个字符串必须是NUL终止的.添加,0db行尾;
  • 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)