Frage

Ich versuche, fat16 hex umzuwandeln, um die Zeit Std:Min:Sek zu erhalten. Ich erhalte Stunden und Minuten richtig, aber ich habe Probleme mit Sekunden.

Die ersten 5 Bits sind Stunden, die nächsten sechs Bits sind Minuten und die letzten 5 Bits sind Sekunden (Ergebnis mal 2) ...

Wenn ich also ein fat16-Hex 0154 eingebe, soll es mir 10 Stunden, 32 Minuten und 2 Sekunden geben, aber ich bin nicht sicher, wie ich die Sekunden bekomme?Wenn ich mich für Sekunden nach links bewege, wie soll ich das dann mit 2 multiplizieren?

Das ist es, was ich habe

INCLUDE Irvine32.inc
.data

        vFAT16 BYTE "Enter FAT16 to convert: " ,0
        vTIme BYTE "--:--:--" ,0

.code
main PROC
    ;--------- Enter Code Below Here

            call Clrscr





;-------------------------

        mov dh, 11
        mov dl, 0
        call Gotoxy

        mov edx, OFFSET vFAT16
        call WriteString

;-------------------------

        mov dh, 12
        mov dl, 0
        call Gotoxy

;-------------------------

        call ReadHex
        ror ax, 8
        mov ecx, eax

        and ax, 1111100000000000b
        shr ax, 11
        mov bh, 10
        div bh
        add ax, 3030h

        mov word ptr [vTime+0], ax
        mov eax, ecx


        and ax, 0000011111100000b
        shr ax, 5
        mov bh, 10
        div bh
        add ax, 3030h

        mov word ptr [vTime+3], ax

        and ax, 0000000000011111b
        shl ax, 11
        mov bh, 1
        div bh
        add ax, 3030h

        mov word ptr [vTime+6], ax




        mov edx, offset vTime
        call Writestring

        xor ecx, ecx
        call ReadString


    exit
main ENDP

END main
War es hilfreich?

Lösung

Ok, nach dem erneuten Lesen bearbeiten Sie ...Daher müssen Sie die Sekunden nach der Verwendung mit 2 multiplizieren and um die zusätzlichen Bits auszublenden.Du könntest benutzen mul, aber die Multiplikation mit zwei (oder einer beliebigen Potenz von 2) kann durch Verschieben nach links erfolgen (dasselbe wie die Division durch eine beliebige Potenz von 2 durch Verschieben nach rechts erfolgen kann).

Also einfach nutzen shl ax, 1 für Sekunden.Das vervielfacht sich ax um 2, was Sie wollen.

Dir fehlt auch das mov eax, ecx vor der Verarbeitung von Sekunden.

Konvertieren Sie dann auf die gleiche Weise wie bei Minuten oder Stunden in 2 ASCII-Dezimalstellen.Das heißt, Sie müssen immer noch durch 10 dividieren, wenn Sie Sekunden in 2 Dezimalstellen umwandeln, und nicht durch 1 wie im Code (ich meine, Division durch 1 bringt nichts ...).

Die 10 dient der Konvertierung in eine Dezimalzahl, nicht etwas anderem.Und es funktioniert, weil man das Ergebnis der Division in AL und den Rest in AH erhält.Und wenn Sie 0x3030 zu AX hinzufügen, fügen Sie tatsächlich 0x30 zu AH und 0x30 zu AL hinzu, und 0x30 ist der ASCII-Code von „0“, sodass eine Zahl im Bereich 0..9 in ein Zeichen „0“...'9 umgewandelt wird ', sowohl für AL als auch für AH in einem Arbeitsgang.Und dann ist x86 eine Little-Endian-CPU, was bedeutet, dass beim Speichern von AX zuerst AL und dann AH gespeichert werden, sodass Sie tatsächlich die Ziffern in der Zielzeichenfolge in der richtigen Reihenfolge erhalten, ohne AL und AH zu vertauschen.

Es ist erwähnenswert, dass dies nur funktioniert, solange kein Überlauf vorliegt, d. h. der Anfangswert von AX im Bereich 0..99 liegt.Wenn es sich um etwas anderes handelt, erhalten Sie eine Müllausgabe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top