我正在尝试实现一个简单的Pascal到ARM汇编编译器。我需要实现write()函数,但我不知道如何在汇编程序中使用它。我试图谷歌但没有成功。我使用Keil uVision 4来模拟我的汇编代码。
让我们说我想编译以下程序:
PROGRAM myProg;
var A : integer;
BEGIN
A := 5;
write(A);
END.
在ARM组装中它会是什么样子?
答案 0 :(得分:0)
您可以尝试使用“free pascal”编译器汇编程序的外观,它支持多种ARM体系结构。
答案 1 :(得分:0)
亚历
这里有很多因素......可执行目标是什么?某种操作系统,还是原始硬件?如果它是一个操作系统,那么将有一个API可供您使用,它应该代表您完成大部分繁重工作。
但即便如此,这只是故事的一半。在write()后面是一个巨大的输出处理库,它知道如何将输入数据转换为有意义的输出:: write()是一个奇怪的过程,它采用可变数量的无类型参数,并以某种方式神奇地理解它们。< / p>
正如Marco说的那样,你可以看一下FP的汇编输出,但我觉得你会在无数的子程序调用中陷入困境。
另一种选择可能只是让Marco的想法更进一步 - 你能不能只使用Free Pascal?即使目标设备上没有操作系统,您仍然可以让它为您完成大部分工作。你无疑必须为stdin和stdout提供钩子,但除了FP之外可能是一个可行的答案吗?
答案 2 :(得分:0)
write()是一个操作系统而不是处理器指令的东西。操作系统需要数百到数十万条指令才能实现类似的操作,您必须要么定位操作系统,要么创建自己的操作系统,然后创建从处理器到该操作系统的接口,例如,选择使用swi指令进行系统调用。
你将有更好的运气来创建一个编译器,编译指令集,alu操作,add,sub,xor等,读写内存地址等。
现在你真的在问如何写内存而A是内存中的地址吗? (我的pascal很生锈)然后看看你的手臂指令集,有几个/多个不同的指令,主要是你要看str指令,str,strh和strb(有些武器有strd)。由于这是你的pascal编译器,你可以让write()做你想做的任何事情,所以如果那是你打算从str指令开始并从那里开始。
听起来像你需要从你的arm汇编程序开始,忘记pascal编译器......那么,制作一个pascal编译器,生成你知道如何使用和编写的汇编代码。如果您不知道如何在汇编程序中执行此操作,请不要让编译器执行此操作。