2016-04-26 16 views
0

Ich versuche, ein Assembly-Programm zu erstellen, das eine Benutzereingabe hexadezimale Zahl nicht mehr als 4 Ziffern nimmt und dieselbe Nummer in Basis 10 ausgibt. Dies geschieht mit NASM bei einer Linux-Installation . Ich habe einige Tutorials gefunden, die ich gefunden habe, und mein sehr begrenztes Verständnis dieser Sprache habe ich mir ausgedacht.Konvertieren von Benutzereingabe Hexadezimal in Dezimal in Assembly

section .data 
    inp_buf: times 6 db 0 
    numPrompt: db "Enter a hexadecimal value no greater than 4 digits: " 
    len1 equ $ - numPrompt 
    answerText: db "The decimal value is: " 
    len2 equ $ - answerText 

section .bss 
    dec: resb 5 

section .text 
    global _start 
_start: 
    mov edx, len1  
    mov ecx, numPrompt 
    mov ebx, 1  
    mov eax, 4  
    int 0x80 

    mov eax, 3  
    mov ebx, 0  
    mov ecx, inp_buf  
    mov edx, 6  
    int 0x80 

    mov esi, dec+11  
    mov byte[esi], 0xa    
    mov eax, ecx   ;I feel like the problem must be here 
    mov ebx, 0xa    
    mov ecx, 1    

next: 
    inc ecx     
    xor edx, edx    
    div ebx     
    add edx, 0x30   
    dec esi     
    mov [esi], dl   
    cmp eax, 0    
    jnz next 

    mov edx, len2   
    mov ecx, answerText  
    mov ebx, 1    
    mov eax, 4    
    int 0x80 

    mov edx, ecx    
    mov ecx, esi    
    mov ebx, 1    
    mov eax, 4    
    int 0x80    

    mov ebx, 0    
    mov eax, 1    
    int 0x80 

Es soll beachtet werden, dass, wenn die Benutzereingabe ignoriert und Sie gerade in einer Variablen mit dem Hex im Datenteil setzen, das Programm, dass ohne Probleme umwandeln kann. Wenn Sie z. B. die Zeile hexNum: equ 0xFFFF haben und die oben erwähnte kommentierte Zeile durch mov eax, hexNum ersetzen, kann der Code diese korrekt in die Basis 10 konvertieren. Der Fehler muss mit dem Format der Benutzereingabe übereinstimmen, aber ich weiß nicht, wie das zu überprüfen ist.

Ich freue mich über jeden Einblick, was mein Problem hier ist. Dies ist mein erstes Assembly-Programm außer "Hallo Welt" und viele dieser neuen Konzepte sind immer noch verwirrend und schwer für mich zu verstehen. Wenn es für mich einen besseren oder einfacheren Weg gibt, dieses ganze Programm zu machen, dann würde ich das gerne auch hören. Vielen Dank!

+0

Ihr Code kann nur eine Nummer drucken, wenn es bereits eine Nummer ist. Sie nehmen die Eingabe als ASCII-Text, den Sie zuerst in eine Zahl umwandeln müssen. Wie es ist, versuchen Sie nur, die Adresse des Eingabepuffers zu drucken. – Jester

Antwort

1

Die Werte in `inp_buffer werden im Hex-Format sein, z.

1234 

als

0x31 0x32 0x33 0x34 

in 4 aufeinanderfolgenden Bytes gespeichert werden.

Die Zahl muss vom Ascii-Format in das Hexadezimalformat konvertiert werden, wobei das umgekehrte Verfahren für die umgekehrte Konvertierung verwendet wird.

Nach dem Abrufen der Zahl in Hex-Form ist die Prozedur für die Konvertierung in Dezimal korrekt, was als Dezimal-Dabble bezeichnet werden kann.

Ich empfehle vollständige Konvertierung zuerst gefolgt von byteweise Umwandlung in ascii. Es ist immer besser, das Endergebnis zu haben und dann für Konvertierungen zu gehen, besonders in der Assemblerprogrammierung, wo das Debuggen schwierig ist.

+0

Probieren Sie es aus, wenn mehr Hilfe benötigt wird Ich kann meinen eigenen Code als Referenz veröffentlichen. – sulimo