我正在尝试转换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发布于 2013-11-17 18:57:15
好的,重新阅读后,编辑.所以,在使用and掩盖额外的比特后,需要将秒乘以2。您可以使用mul,但乘2(或任何2的幂)可以与移位左(同除以任何2的幂可以通过右移动)。
因此,只需使用shl ax, 1几秒钟。这会使ax乘以2,这就是您想要的。
在处理秒之前,您还会丢失mov eax, ecx。
然后转换为2位ASCII十进制数字与分钟或小时的方式相同。这意味着,当您将秒数转换为2位小数时,仍然需要除以10,而不是像代码中那样被1除以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范围内才能工作。如果是其他东西,就会得到垃圾输出。
https://stackoverflow.com/questions/20034253
复制相似问题