2016-11-17 6 views
-1

Ich möchte ein Programm schreiben, die die Zeichenfolge, die Sie schreiben, zurückgibt. Aber es druckt immer ohne das erste Zeichen. Außerdem gibt es nichts über den ersten Raum zurück.NASM - printf druckt nicht das erste Zeichen

Beispiel:

IN: test 
OUT: est 

Code:

extern printf, scanf, exit 
global main 

section .text 
main: 
    push rbp 
          ;input of string 
    mov rdi, format 
    mov rsi, string 
    mov rax, 0 
    call scanf 

          ;output of string 
    mov rdi, format_out 
    mov rsi, qword [string] 
    mov rax, 0 
    call printf 
_exit:      ;end of program 
    pop rbp 
    call exit 

section .data 
    format  db "%s", 0 
    string  db 0 
    format_out db "You wrote: %s", 0 

ich bemerkt, dass, wenn ich string db 0-string db“ändern, ist es ein Fehler zeigt, aber das Programm korrekt funktioniert, den Druck der gesamten Satz der 1. Platz Leider habe ich keine Ahnung, was ich mit dieser Info machen soll Danke für die Antwort

+0

Ich denke, 'string' ist die Variable, in der Sie die vom Benutzer eingegebene Zeichenfolge speichern. Wie viele Zeichen erwarten Sie vom Benutzer? Wie groß ist die Variable 'string'? –

+0

Nun, ich weiß es nicht. Sagen wir, dass 20 die maximale Anzahl von Zeichen ist. Was mache ich jetzt? – Zumalo

+3

Dann sollten Sie mehr als 1 Byte für die Zeichenfolge zuweisen, genug für Ihre 20 max –

Antwort

2

printf("%s", ...) dauert ein poin ter arg, aber Sie übergeben es die ersten 8 Bytes des Inhalts Ihrer Zeichenfolge. Verwenden Sie mov rsi, string, um eine mov-sofort anstelle von mov rsi, [string] (die eine Last ist) zu erhalten.

(Oder 2-Code-Bytes zu speichern, mov esi, string da statische Adressen garantiert werden in 32 Bits in dem Standard-Codemodell passen.)


Wie in Kommentaren darauf hingewiesen, Ihre statischen Puffer sind zu klein. Da Ihre Formatzeichenfolge keine Größenbeschränkung hat, benötigen Sie einen Puffer mit unendlicher Größe, um das Risiko zu vermeiden, dass eine lange Eingabezeile überläuft.

Aber täuschen wir vor, dass ein 1024B Puffer sicher genug ist. Oder besser, verwenden Sie %1023s, so ist es garantiert genug. Wir wollen keine 1024B von Nullen in unserer ausführbaren Datei; das wäre albern. Also sollten wir stattdessen behalten 1024B in der BSS:

section .rodata 
    format:  db "%1023s", 0   # actually set a size limit, leaving room for the \0 
    format_out: db "You wrote: %s", 0 

section .bss 
    string:  resb 1024    # RESERVE 1024 bytes. Only works in .bss 

Es gibt keinen Grund ist die : nach Markennamen auf Daten wegzulassen, und good reason not to.

Verwandte Themen