gpt4 book ai didi

c - 我想用 C 创建一个简单的汇编程序。我应该从哪里开始?

转载 作者:太空狗 更新时间:2023-10-29 16:43:15 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Building an assembler

(4 个回答)



How Do You Make An Assembler? [closed]

(4 个回答)


8年前关闭。




我最近一直试图让自己沉浸在汇编编程的世界中,最终目标是创建自己的编程语言。我希望我的第一个真正的项目是一个用 C 编写的简单汇编程序,它能够汇编 x86 机器语言的一小部分并创建一个 Windows 可执行文件。没有宏,没有链接器。组装而已。

在纸面上,这似乎很简单。汇编代码进来,机器码出来。

但是当我考虑所有细节时,它突然变得非常令人生畏。操作系统需要什么约定?如何对齐数据并计算跳跃?可执行文件的内部是什么样子的?

我感觉很失落。我找不到任何关于此的教程,并且查看流行汇编程序的源代码并没有什么启发(不过我愿意再试一次)。

我从这里去哪里?你会怎么做?有没有关于这个主题的好的教程或文献?

最佳答案

我自己写了一些(汇编器和反汇编器),我不会从 x86 开始。如果您知道 x86 或任何其他指令集,您可以在短时间内(一个晚上/一个下午)拿起并学习另一个指令集的语法,至少大部分人都知道。编写汇编器(或反汇编器)的行为肯定会很快地教你一个指令集,而且你会比许多没有检查该级别微代码的经验丰富的汇编程序员更了解该指令集。 msp430、pdp11和thumb(不是thumb2扩展)(或mips或openrisc)都是不错的起点,指令不多,也不过分复杂等。

我首先推荐一个反汇编器,然后是一个固定长度的指令集,如 arm 或 thumb 或 mips 或 openrisc 等。反汇编器)并用纸笔了解机器代码和汇编之间的关系,尤其是分支,它们通常有一个或多个怪癖,例如程序计数器在添加偏移量时提前一两条指令,以获得另一位它们有时以整个指令而不是字节来衡量。

使用 C 程序蛮力解析文本以读取指令非常容易。一项更艰巨但可能具有教育意义的任务是使用 bison/flex 并学习该编程语言,以允许这些工具创建(更极端的蛮力)解析器,然后与您的代码接口(interface)以告诉您在何处找到了什么。

汇编器本身非常简单,只需读取 ascii 并在机器代码中设置位。分支和其他与 pc 相关的指令要麻烦一些,因为它们可以多次遍历源/表才能完全解析。

  mov r0,r1
mov r2 ,#1

汇编器开始解析一行的文本(定义为回车 0xD 或换行符 0xA 后面的字节),丢弃空格(空格和制表符)直到遇到非空格,然后用已知的助记符。如果你点击一个然后解析该指令的可能组合,在上面的简单情况下,在 mov 跳过空白到非空白之后,也许你找到的第一件事必须是一个寄存器,然后是可选的空白,然后是一个逗号。删除空格和逗号并将其与字符串表进行比较或只是解析它。一旦该寄存器完成,然后通过找到逗号的位置,并假设它是另一个寄存器或立即数。如果立即让我们说它必须有一个#号,如果注册让我们说它必须以小写或大写的“r”开头。解析该寄存器或立即数后,请确保该行上没有其他不应该出现的内容。为此指令或至少尽可能多地构建机器代码,然后转到下一行。这可能很乏味,但解析 ascii 并不难...

至少,您需要一个表/数组,它在创建时累积机器代码/数据,加上一些将指令标记为不完整的方法,PC 相关的指令将在 future 的通过中完成。您还需要一个表/数组,用于收集您找到的标签以及找到的机器代码表中的地址/偏移量。以及在指令中用作目标/源的标签以及保存它们所使用的部分完整指令的表/数组中的偏移量。在第一遍之后,然后返回这些表,直到将所有标签定义与用作源或目标的标签匹配,使用标签定义地址/偏移量计算到相关指令的距离,然后完成创建该指令的机器代码。 (可能需要进行一些反汇编和/或使用其他方法来记住它是哪种编码,当您稍后返回以完成构建机器代码时)。

下一步是允许多个源文件,如果您想允许的话。现在您必须拥有汇编器无法解析的标签,因此您必须在输出中保留占位符并制作最长跳转/分支指令的一些 flavor ,因为您不知道目的地有多远,预计会更糟。然后是你选择创建/使用的输出文件格式,然后是链接器,它主要是简单的,但你必须记住为最终的 pc 相关指令填写机器码,不比在汇编程序中难本身。

请注意,编写汇编程序不一定与创建编程语言然后为其编写编译器有关,不同的事情,不同的问题。实际上,如果您想制作一种新的编程语言,只需将现有的汇编程序用于现有的指令集。当然不是必需的,但大多数教学和教程将使用 bison/flex 方法来编程语言,并且有许多大学类(class)讲义/资源用于开始编译器类(class),您可以使用它们来开始然后修改脚本来添加您的语言的功能。中后端是比前端更大的挑战。有很多关于这个主题的书籍和许多在线资源。正如另一个答案中提到的,llvm 不是创建新编程语言的好地方,中间和后端都为您完成,您只需要关注编程语言本身,即前端。

关于c - 我想用 C 创建一个简单的汇编程序。我应该从哪里开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15983981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com