Assembly 将fat16十六进制解码为秒
我正在尝试转换fat16十六进制以获得时间hr:min:sec,我获得的是小时和分钟,但我在秒方面遇到了问题 前5位是小时,后6位是分钟,最后5位是秒(结果乘以2) 所以,如果我输入fat16十六进制0154,它应该给我10小时32分2秒,但我不知道如何获得秒数?如果我向左移动几秒钟,我应该如何乘以2 这就是我所拥有的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
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
就足够了。这里没有实际的区别,只是说…@手册可能从更好地理解二进制数开始;)