Assembly 将fat16十六进制解码为秒

Assembly 将fat16十六进制解码为秒,assembly,time,x86,masm,irvine32,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 vTI

我正在尝试转换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

好的,重读后,编辑。。。因此,在使用
屏蔽多余的位之后,需要将秒数乘以2。您可以使用
mul
,但是可以通过向左移位来实现乘以2(或2的任意幂次方)(与通过向右移位来实现除以2的任意幂次方相同)

因此,只需使用
shl ax,1
几秒钟。这将
ax
乘以2,这是您想要的

在处理秒之前,您还缺少
mov-eax、ecx

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

这里的10是用来转换成十进制的,不是用来做别的。它是有效的,因为你得到的结果是除法在AL中,余数在AH中。将0x3030添加到AX时,实际上将0x30添加到AH,将0x30添加到AL,0x30是ASCII码“0”,因此0..9范围内的数字在一次操作中转换为字符“0”…“9”,用于AL和AH。然后,x86是小端CPU,这意味着,当你存储AX时,它首先存储AL,然后是AH,所以你实际上在目标字符串中以正确的顺序获得数字,而不需要交换AL和AH


值得注意的是,这只在并没有溢出的情况下起作用,即AX的初始值在0到99之间。如果是其他原因,则会得到垃圾输出。

错误..哎呀..很高兴您告诉我..谢谢您在上次计算之前可能需要另一个
mov eax,ecx
。您使用的是经过修改的
ax
。您还应该对代码进行注释,阅读未注释的程序集有点。。。猜测。那么你真正缺少的是将一个数字(在ax中)转换为2个十进制数字的代码?@Manual Ok,编辑我的答案以确保正确,并取消删除…所以我理解的方式是和ax,0000000000011111 B shl ax,1 mov bh,10 div bh add ax, 3030h@Manual请注意,您正在
ecx
中保存
eax
的原始值。看起来在
cx
中保存
ax
就足够了。这里没有实际的区别,只是说…@手册可能从更好地理解二进制数开始;)