2016-05-09 33 views
2

Ich habe Code geändert, der ASCII-Zeichen in hexadezimale Werte umwandeln soll. Meine erste Version funktionierte einwandfrei, aber meine neuere Funktion hat einige Probleme.Assembly übersetzt ASCII-Zeichen in HEX-Wert

Das ist meine neue Funktion, die ASCII-Werte in Hexadezimal-Werten übersetzt:

;carry flag cleared if successed, if not then it is set 
;input number should be in AL 
;output number should be in AH 
.translate: 
    xor AH,AH 
    mov BX, HEXASCII 
    .loop: 
     mov DL,[BX] 
     cmp DL,AL 
     je .end 
     inc BX 
     inc AH 
     cmp AH,0x10 
     je .err 
     jmp .loop 
    .end: 
     clc 
     ret 
    .err: 
     stc 
     ret 
; ... some code 
HEXASCII db '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' 

jedoch diese Funktion scheint nicht richtig zu arbeiten - wenn der Ausgang von dieser Funktion zu int 13 Senden bochs wird Fehler zurückgegeben - read/write/verify parameter out of range. die Zahlen, die ich benutze, war 00 für Head, 00 für cylinder und 01 für sector, also denke ich, dass es kein tatsächliches Problem mit Argumenten ist, die ich schrieb.

Ich habe auch meine vorherige Funktion mit den gleichen Argumenten und es richtig geladen Sektor, den ich wollte.

Ich habe versucht, mit dem Bochs-Debugger Register im Speicher vor int 0x13 zu verfolgen, aber es sah so aus, als ob die Register die gleichen Werte haben, die ich eingegeben habe.

Meine bisherige Funktion ist:

;carry flag cleared if successed, if not then it is set 
;input number should be in AL 
;output number should be in AH 
.translate: 
    cmp AL,'0' 
    je .x0 
    cmp AL,'1' 
    je .x1 
    cmp AL,'2' 
    je .x2 
    cmp AL,'3' 
    je .x3 
    cmp AL,'4' 
    je .x4 
    cmp AL,'5' 
    je .x5 
    cmp AL,'6' 
    je .x6 
    cmp AL,'7' 
    je .x7 
    cmp AL,'8' 
    je .x8 
    cmp AL,'9' 
    je .x9 
    cmp AL,'a' 
    je .xA 
    cmp AL,'b' 
    je .xB 
    cmp AL,'c' 
    je .xC 
    cmp AL,'d' 
    je .xD 
    cmp AL,'e' 
    je .xE 
    cmp AL,'f' 
    je .xF 
    cmp AL,'A' 
    je .xA 
    cmp AL,'B' 
    je .xB 
    cmp AL,'C' 
    je .xC 
    cmp AL,'D' 
    je .xD 
    cmp AL,'E' 
    je .xE 
    cmp AL,'F' 
    je .xF 
    jmp .NONE 
    .x0: 
     xor AH,AH 
     clc 
     ret 
    .x1: 
     mov AH,0x1 
     clc 
     ret 
    .x2: 
     mov AH,0x2 
     clc 
     ret 
    .x3: 
     mov AH,0x3 
     clc 
     ret 
    .x4: 
     mov AH,0x4 
     clc 
     ret 
    .x5: 
     mov AH,0x5 
     clc 
     ret 
    .x6: 
     mov AH,0x6 
     clc 
     ret 
    .x7: 
     mov AH,0x7 
     clc 
     ret 
    .x8: 
     mov AH,0x8 
     clc 
     ret 
    .x9: 
     mov AH,0x9 
     clc 
     ret 
    .xA: 
     mov AH,0xA 
     clc 
     ret 
    .xB: 
     mov AH,0xB 
     clc 
     ret 
    .xC: 
     mov AH,0xC 
     clc 
     ret 
    .xD: 
     mov AH,0xD 
     clc 
     ret 
    .xE: 
     mov AH,0xE 
     clc 
     ret 
    .xF: 
     mov AH,0xF 
     clc 
     ret 
    .NONE: 
     xor AH,AH 
     stc 
     ret 

Ich erwarte nicht, in irgendeinem anderen Teil des Codes, beschädigt werden, wie ich es nicht geändert hat. Wenn es benötigt wird, werde ich den vollständigen Code hinzufügen, aber es ist ziemlich lang.

Gibt es etwas, was in der neuen Funktion fehlt oder falsch ist?

bearbeiten: Vergessen zu erwähnen, dass der Code in 16 bit real mode

+1

Warum alle 'cmp' /' je' Paare? Habe einfach eine Zeichenfolge mit allen gültigen Zeichen und benutze 'scasb', um zu sehen, ob ein bestimmtes Zeichen in dieser Zeichenfolge gefunden werden kann. – Michael

+0

Ich bin nicht sehr fortgeschritten in Assembly und ich habe noch nie die Funktion 'Scasb' gesehen, aber ich werde es mir ansehen – vakus

+1

Nun, Sie könnten das gleiche mit' cmp' in einer Schleife erreichen. – Michael

Antwort

0

läuft nach etwas Hilfe bekommen von osdev forum jemand bemerkt, dass die Funktion die Werte richtig funktioniert übersetzen, jedoch ist es zu beschädigen dl Register, das ich zu halten vergessen das gleiche wie es hard drive Nummer hält.

Wenn jemand hier neuere Version dieser Code muss man gehen:

.translate: 
    xor AH,AH 
    mov BX, HEXASCII 
    .loop: 
     cmp [BX],AL 
     je .end 
     inc BX 
     inc AH 
     cmp AH,0x10 
     je .err 
     jmp .loop 
    .end: 
     clc 
     ret 
    .err: 
     stc 
     ret 
;... some code 
HEXASCII db '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'