我正在尝试实现一个简单的Pascal到ARM的汇编编译器。我需要实现write()函数,但我不知道如何在汇编程序中使用它。我试着用谷歌搜索它,但没有成功。我正在使用Keil uVision 4来模拟我的汇编代码。
假设我想编译以下程序:
PROGRAM myProg;
var A : integer;
BEGIN
A := 5;
write(A);
END.它在手臂集合中看起来是什么样子?
发布于 2012-02-07 19:02:33
你可以试验一下“免费的pascal”编译器,看看汇编程序是什么样子的,它支持几种ARM架构。
发布于 2012-02-10 07:10:48
亚历克斯
这里有很多因素..。可执行文件的目标是什么?是某种操作系统,还是原始硬件?如果它是一个操作系统,将会有一个API可供您使用,它应该代表您完成大部分繁重的工作。
但即便如此,这也只是故事的一半。write()背后是一个巨大的输出处理库,它知道如何将输入数据转换为有意义的输出::write()是一种奇特的过程,它接受数量可变的非类型化参数,并以某种方式神奇地将它们全部解释清楚。
正如Marco所说,你可以看看FP的汇编器输出,但我有一种感觉,你很快就会陷入无数子例程调用的泥潭。
另一种选择可能是简单地将Marco的想法更进一步-你不能只使用Free Pascal吗?即使您的目标设备上没有操作系统,您仍然可以让它为您完成大部分工作。毫无疑问,您必须提供到stdin和stdout的挂钩,但除此之外,FP可能是一个可行的解决方案?
发布于 2012-02-10 12:05:33
write()是操作系统的东西,而不是处理器指令的东西。操作系统需要成百上千到成百上千条指令才能实现这样的事情,你要么瞄准一个操作系统,要么创建自己的,然后创建一个从处理器到该操作系统的接口,例如,你可以选择使用swi指令进行系统调用。
你会有更好的运气,只要创建一个编译器,编译成指令集,alu操作,加,减,异或等读和写存储器地址,等等。
现在,您实际上是在问如何写入内存,A是内存中的地址?(我的pascal很生疏)然后看看你的arm指令集,有几条/多条不同的指令,主要是看str指令、str、strh和strb (有些arm有一个strd)。因为这是您的pascal编译器,所以您可以让write()做任何您想做的事情,所以如果这就是您想要做的,就从str指令开始并从那里开始。
在我看来,您需要从开发arm汇编器开始,忘记pascal compiler...THEN,编写一个pascal编译器来生成您确实知道如何使用和编写的汇编语言代码。如果你自己不知道如何在汇编语言中做到这一点,也不要让编译器去做。
https://stackoverflow.com/questions/9143260
复制相似问题