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



使用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

相关内容

  • 没有找到相关文章

最新更新