2016-05-01 30 views
2

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

,并获得赛格故障。请有人指出这个缺陷吗?我似乎无法自己找到它。

回答

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

感谢您的帮助。经过一整天的苦苦挣扎,我终于能够开始工作了! –