0

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

前 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

好的,重新阅读后,编辑......所以你需要将秒乘以 2,在使用and来屏蔽额外的位之后。您可以使用mul,但是乘以 2(或 2 的任何幂)可以通过左移来完成(与除以 2 的任何幂可以通过右移来完成)。

所以,只需使用shl ax, 1几秒钟。这乘以ax2,这就是你想要的。

您还缺少mov eax, ecx处理前的秒数。

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

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

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

于 2013-11-17T18:57:15.877 回答