【问题标题】:Converting assembly code to machine code in C manually [closed]手动将汇编代码转换为 C 中的机器代码 [关闭]
【发布时间】:2016-02-27 11:42:23
【问题描述】:

我从大学得到了一个练习作业,要求我手动将汇编代码转换为机器代码。我将显示之前和之后的图像。它基本上要求我在指令后删除 cmets(分号后)和空格。我发现这很令人费解,因为我是一个 C 菜鸟并且我被扔进了汇编代码。我打算在记事本++中做到这一点。我使用的汇编语言非常简化,因为 x86 开始时会很荒谬。任何帮助将不胜感激!

【问题讨论】:

  • 很高兴我不在你的大学里。
  • 您没有将任何内容转换为机器代码,只是要求您去除 cmets 和空格。在这个练习中,组装纯粹是偶然的,归结为愚蠢的字符串操作。
  • 将文本作为图像发布是违反网站规则的。将文本作为文本发布!
  • 这个作业到底要教你什么?最难的部分可能是学习如何提交作业......当你的课程达到讨论汇编语言的作用时,请参阅assembly tag wiki 链接,而不仅仅是行的格式。
  • 对不起,伙计们,这是我的错,因为这是任务的开始。我继续将 mov 之类的代码转换为 0x01 等...

标签: c assembly


【解决方案1】:

正如评论中所说,这与机器代码无关,只是微不足道的字符串操作(本质上是sed 's/[[:space:]]*\(;.*\)\?$//'):

  1. 读一行
  2. 每次遍历字符串一个字符;每次找到一个非空白字符时,记下它在变量中的位置。
  3. 当您找到字符串的结尾(字符 0)或分号(字符 ';')时,将字符串截断为您找到的最后一个非空白字符之后的字符(实际上,将其设置为零)。
  4. 将更新后的字符串写到另一个文件中。
  5. 重复直到输入文件完成。

【讨论】:

  • 对不起,我不明白为什么你会在notepad++中使用sed,因为它是用于linux的?当然它并不像看起来那么简单,首先你必须使用 fgets 读取每一行,然后以某种方式摆脱空格和 cmets。不幸的是,我不明白如何使用 fread 等常规 C 代码来做到这一点......
  • 我想我可能需要使用 isspace 来检查空格
  • @Jim:sed 部分只是一个示例,向您展示这是一个简单的文本操作,可以通过简单的正则表达式完成(您当然可以在 Notepad++ 中通过搜索/替换对话框,可能它的正则表达式语法更像 Perl,我希望像替换 \s*(;.*)?$ 这样什么都没有)。无论如何,第 1 到第 5 点是您必须在 C 中实现的算法(如果您实际上不需要将结果写入另一个文件,则不需要第 4 步),每个点都相当简单。