【发布时间】:2018-05-29 14:38:00
【问题描述】:
要将基数为 10 的任何数字转换为基数 16,一个好的实现是:
segment data use32 class=data
number dd 0
format_input db "%d", 0
format_output db "%x", 0
segment code use32 class=code
start:
push dword number
push dword format_input
call [scanf]
add esp, 4*2
push dword [number]
push dword format_output
call [printf]
add esp, 4*2
是否有类似的实现将数字从基数 2 转换为基数 8?
【问题讨论】:
-
这只是调用 C 库函数,而不是转换的“实现”。如果这对您来说已经足够了,那么对于八进制,有格式化程序
%o。对于二进制 .. 令人惊讶的是,我没有看到任何内容,因此您必须检查您的scanf文档,是否有一些文档,或者自己编写。但是,这是非常基本的东西,如果您了解数字系统背后的数学,您应该能够轻松地将任何基础转换为纸+笔上的任何基础。然后在汇编中编写这样的数学通常是微不足道的,特别是如果涉及两个基数的幂,你只需要重新排列位值。 -
即以 2 为基数的输入每个输入元素有 1 个重要位(如果它是像“010101”这样的 ASCII 字符串,那么您可以从每个字符中删除除最低位之外的所有位,这就是您的二进制输入,ASCII
'0'是0011_0000和 @ 987654328@ 是0011_0001,因此此类字符串输入的最后一位将是 0, 1, 0, 1, 0, 1 ...) .. 八进制输出需要每个数字 3 位,因此您只需将其分组进入010,101并输出这两个值,即“25”。 ...不需要除法/乘法(与基 10 格式相反,会发生某种乘法/除法)。0b010101 == 0o25 -
@Ped7g: ISO C scanf/printf don't have base 2 conversion specifiers,它不是标准扩展,not even in glibc。不过,对于输入,
strtol将基数作为参数。 -
您好,欢迎您!我想说明为什么这个问题没有得到很好的接受。理想的 SO 问题会隔离一个问题并提出一个(可能)具有客观最佳答案的问题。从您的问题来看,目前尚不清楚问题是一般的基本转换算法、使用 C 标准库的序列化和反序列化,还是编写 x86 程序集。此外,每个主题都单独进行了广泛的介绍,因此我们得到的印象是您希望我们为您编写代码。请不要气馁!我们都必须在某个时候学习这里的文化。
标签: c assembly x86 nasm standard-library