【问题标题】:Assembler - write binary in assembly from decimal汇编器 - 从十进制的汇编中写入二进制
【发布时间】:2017-05-18 16:06:01
【问题描述】:

上下文:编写汇编程序。想象一下,您从头开始编写代码,没有工具链支持。你和你面前的电脑是一个人,你会得到 cpu 文档。回到过去。

当你需要用二进制写时,你怎么知道如何在最底层对位进行整形?

例如,将#253(可以是最大为 2^32 的任何值,也可以是十六进制)转换为二进制立即数。我是否有义务从右到左逐个字节地解析它,每次乘以 10(或十六进制为 16))并将结果存储在累加寄存器中?

这是汇编程序在最低级别为形成位流所做的吗? (添加和移位)?

【问题讨论】:

  • 汇编程序只是将源代码翻译成输出格式(“Just”在这里过于简单化了)所以你真正的问题是什么?如何将字符串转换为数字?这是一项基本任务,是的,它基本上是通过加法和乘法来完成的。处理溢出、字符集和字符集编码等警告
  • @MargaretBloom 我正在编写一个汇编程序,我主要关心的是如何有效地编写比特流。我还考虑了一个跳转表,以及十六进制转换以加快速度。十进制对于优化很差。
  • 我建议你用谷歌搜索“编译器构建教程”,有很多非常好的教程教你需要的东西,例如用于解码值的状态机。甚至汇编器也是某种编译器,它们将汇编编译为机器码
  • 请注意,“即时”将二进制转换为十六进制比转换为十进制要容易得多(反之亦然)——这是引入它的原因之一。

标签: assembly binary


【解决方案1】:

是的,您一个接一个地读入字符 2、5 和 3(或者如果硬件是这样做的,则一次读取多个字符,然后一个接一个地依次查看)。

然后您可以将 ASCII 字符转换为十进制数字(通过减去字符 0 的 ASCII 码,即十进制的 48)并将数字乘以 10 的适当幂(或任何底数)。

以 ((0+2)*10+5)*10+3 的形式进行操作既简单又方便。

乘以 10 不需要涉及实际的乘法,这可能是一个缓慢的操作(或者 CPU 甚至可能没有乘法指令),但可以通过移位和加法的组合来执行,例如2*10 = 2*8 + 2*2 =(2 左移 3 个位置)+(2 左移 1 个位置)。

如果没有人为您编写代码,您必须编写它。传统的 CPU 不包含用于解析和从文本转换为数字或其他方式的逻辑。它们只提供简单的构建块(相对简单的指令),您可以从中构建一切。

【讨论】:

  • Alexey,所以在一天结束时,我必须创建一个包含我想要的正确值的跳转表(在循环到 256 中,将寄存器加一,将其二进制表示存储在表在适当的偏移量);当需要转换时,加载一个寄存器并使用该表示做我需要的任何事情(创建寄存器,存储它们等等)。问题解决了吗?
  • 我的意思不是二进制表示,而是二进制值
  • 对不起,我失去了你的思路。但是,在实现汇编程序时还有其他有趣的问题需要解决。例如。 this one。拥有一个快速的解决方案比从数字解析器中获得最大性能更重要。
猜你喜欢
  • 2015-05-29
  • 2016-01-10
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2014-07-20
  • 2016-10-16
  • 2012-03-10
相关资源
最近更新 更多