将fat16十六进制解码为秒

时间:2013-11-17 18:05:45

标签: assembly time x86 masm irvine32

我正在尝试将fat16十六进制转换为时间hr:min:sec,我正在得到正确的小时和分钟,但是我遇到了麻烦。

前5位是小时,后6位是分钟,最后5位是秒(结果时间2)......

所以如果我输入一个fat16六角形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

1 个答案:

答案 0 :(得分:1)

好的,重新阅读后,编辑......所以你需要在使用and来掩盖额外的比特之后将秒数乘以2。您可以使用mul,但是可以使用左移(也可以通过向左移动来完成除以2的任何幂的除法)来完成乘以2(或2的任何幂)。

因此,只需使用shl ax, 1秒即可。这会将ax乘以2,这就是您想要的。

在处理秒数之前,您也错过了mov eax, ecx

然后转换为2个ASCII十进制数字,与分钟或小时相同。这意味着,当您将秒转换为2位小数时,仍然需要除以10,而不是像代码中那样将1除以(我的意思是除以1不做任何事情......)。

10是转换为十进制,而不是其他东西。它有效,因为你在AL中得到除法的结果,在AH得到余数。当你向AX添加0x3030时,你实际上将AH30和0x30添加到AL,0x30是ASCII代码'0',因此范围0..9中的数字转换为字符'0'...'9 ',AL和AH都在一次操作中。然后,x86是小端CPU,这意味着,当你存储AX时,它首先存储AL,然后存储AH,所以你实际上在目标字符串中得到正确顺序的数字而不交换AL和AH。

值得注意的是,这只有在没有溢出的情况下才有效,即AX的初始值在0..99范围内。如果它是其他东西,你会得到垃圾输出。