我正在尝试将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
答案 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范围内。如果它是其他东西,你会得到垃圾输出。