2016-05-01 29 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

感謝您的幫助。經過一整天的苦苦掙扎,我終於能夠開始工作了! –