【问题标题】:How can I change the value of a single byte using NASM?如何使用 NASM 更改单个字节的值?
【发布时间】:2016-08-26 00:27:15
【问题描述】:

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

并得到一个段错误。有人可以指出这里的缺陷吗?我自己好像找不到。

【问题讨论】:

    标签: c assembly replace segmentation-fault nasm


    【解决方案1】:
    • 您的字符串位于可执行文件的.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
    

    【讨论】:

    • 感谢您的帮助。经过一整天的挣扎,我终于能够让事情正常进行!
    猜你喜欢
    • 1970-01-01
    • 2020-03-17
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多