0

時間 hr:min:sec を取得するために、fat16 hex を変換しようとしています。時間と分を正しく取得していますが、秒に問題があります。

最初の 5 ビットは時、次の 6 ビットは分、最後の 5 ビットは秒 (結果時間 2)...

したがって、fat16 hex 0154 を入力すると、10 時間 32 分 2 秒かかるはずですが、秒を取得する方法がわかりません。左に数秒間シフトすると、どのように 2 倍することになっていますか?

これは私が持っているものです

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
4

1 に答える 1

1

わかりました、読み直した後、編集します...and余分なビットをマスクするために使用した後、秒に2を掛ける必要があります。を使用することもできますmulが、2 (または任意の 2 の累乗) による乗算は左シフトで実行できます (2 の任意の累乗での除算は右シフトで実行できるのと同じです)。

したがって、単にshl ax, 1数秒間使用してください。これは 2 で乗算axされます。これが目的です。

mov eax, ecx処理前の秒数もありません。

次に、分または時間と同じ方法で 2 つの ASCII 10 進数に変換します。つまり、コードのように 1 ではなく、秒を 2 桁の 10 進数に変換するときに 10 で割る必要があります (つまり、1 で割っても何も起こりません...)。

そこにある 10 は、10 進数に変換するためのものであり、他の何かのためではありません。そして、AL で除算の結果を取得し、AH で剰余を取得するため、機能します。そして、AX に 0x3030 を追加すると、実際には AH に 0x30 を追加し、AL に 0x30 を追加します。0x30 は '0' の ASCII コードであるため、範囲 0..9 の数値は文字 '0'...'9 に変換されます。 '、1 回の操作で AL と AH の両方。そして、x86 はリトル エンディアン CPU です。つまり、AX を保存すると、最初に AL が保存され、次に AH が保存されるため、実際には、AL と AH を交換することなく、目的の文字列で正しい順序で数字が取得されます。

これは、オーバーフローがない限り、つまり AX の初期値が 0..99 の範囲内にある場合にのみ機能することに注意してください。それ以外の場合は、ガベージ出力が得られます。

于 2013-11-17T18:57:15.877 に答える