2016-05-01 12 views
2

Mit NASM muss ich ein Zeichen in einer Zeichenfolge an einem bestimmten Index ändern und die Zeichenfolge in seiner neuen Form drucken. Hier ist eine vereinfachte Version von meinem Code:Wie kann ich den Wert eines einzelnen Bytes mit NASM ändern?

;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 

ich mit kompilieren:

nasm -felf64 test_code.asm && gcc test_code.o -lm 

und seg Fehler bekommen. Würde jemand bitte hier auf den Fehler hinweisen? Ich kann es selbst nicht finden.

Antwort

5
  • Ihre Zeichenfolge befindet sich im Abschnitt .text der ausführbaren Datei, die standardmäßig nur gelesen wird. Entweder Sie ordnen einen Puffer auf dem Stapel zu, kopieren den String, und Sie ändern ihn dort, oder Sie setzen die Zeichenfolge in den .data Abschnitt (der gelesen/geschrieben wird) unter Verwendung der section Direktive. Beachten Sie in diesem letzten Fall, dass die Zeichenersetzung persistent ist, d. H. Auch später im Programm bleibt die Zeichenfolge modifiziert;
  • Wenn Sie diese Zeichenfolge mit printf drucken möchten, muss sie NUL-terminiert sein. Hinzufügen eines ,0 an das Ende der db Linie;
  • dass mov rax, index ist falsch - index ist die Adresse der qword Sie oben geschrieben habe, während Sie tatsächlich in rax kopieren möchten das Datum dort geschrieben; Sie wollen wahrscheinlich mov rax, [index].

So etwas wie

;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

Vielen Dank für Ihre Hilfe. Ich war endlich in der Lage, nach einem ganzen Tag des Kampfes die Dinge in Gang zu bringen! –