十进制到十六进制的转换如何在汇编中工作?

Posted

技术标签:

【中文标题】十进制到十六进制的转换如何在汇编中工作?【英文标题】:how does decimal to hex conversion work in assembly? 【发布时间】:2015-10-01 00:51:45 【问题描述】:

我试图弄清楚十进制的 12345 如何产生十六进制的 0x39 0x30。谁能解释一下?自从介绍组装以来已经有一段时间了。建议的帖子对我有所帮助,但没有一个例子可以说明这是如何工作的。

.hword 0xAA55, 12345 ; inserts the bytes 0x55 0xAA 0x39 0x30

给定 hword 一次处理 16 位,12345 如何给出规定的十六进制结果?

64 位的值是否相同?只是用 0xFF 填充?

@dwelch - 非常感谢。

【问题讨论】:

【参考方案1】:

汇编语言与这些有什么关系?什么都没有。

127秒是多少分钟?你怎么想出来的?每分钟60秒对吗?所以 127/60 = 2.116666.... 对吗?或 2 余数 7,127 秒是 2 分 7 秒。

4000 秒是多少小时、分钟、秒?好吧,每分钟 60 秒和每小时 60 分钟,所以每小时 3600 秒,从最大的占位符开始,4000/3600 是 1 余数 400,所以 1 小时 400 秒。 400 秒/60 是 6 的余数 40。所以 4000 秒是 1 小时 6 分 40 秒。

我们在小学就学会了如何做到这一点,是吗?从十进制到基数 60 的转换。从十进制到基数 16 有什么不同?不是。

注意个位是 10 的 0 次方,十位是 10 的 1 次方,百位是 10 的 2 次方,以此类推。秒是 60 的 0 次方,分钟位置是 60 的 1 次方,小时位置是 60 的 2 次方。

12345 十进制。我们的 base 16 占位符是什么? 16 的 0 次方是 1,16 的 1 次方是 16,16 的 2 次方是 256,16 的 3 次方是 4096,16 的 4 次方是 65536。12345 小于 65536,大于 4096 所以我们从那里开始,12345/4096 = 3 余数 57。所以这是 16 的 3 次方位或 0x3xxx。 57/256 = 0 余数 57 所以 0x30xx。 57/16 = 3 余数 9 所以 12345d = 0x3039。

然后手臂是小端的,因此字节交换到内存中的 0x39,0x30。

【讨论】:

【参考方案2】:

如果将参数转换为十六进制,则更有意义(12345 为 0x3039):

.hword 0xAA55, 0x3039 ; inserts the bytes 0x55 0xAA 0x39 0x30

考虑到机器的字节序,0xAA55 0x3039 变成了命名为 55 aa 39 30。

【讨论】:

以上是关于十进制到十六进制的转换如何在汇编中工作?的主要内容,如果未能解决你的问题,请参考以下文章

ARMv8:使用 ARMv8 汇编语言将十进制转换为二进制

从二进制文件读取时将大端转换为小端

GDB 问题 - 我如何逐行查看反汇编代码?

汇编 MIPS:带伪旋转的十进制到 32 位二进制

将十六进制字符串转换为 Int [重复]

他们如何快速(记住)将十进制转换为十六进制?