我有一个任务,涉及编写.S文件并构建一个返回0的可执行文件。我查了一下,它说它是汇编源代码,但是当我像汇编一样编写它时它没有编译。有人能给我一个.S文件的例子或者他们的教程会指出我正确的方向吗?另外,我必须创建一个将创建可执行文件的makefile。
答案 0 :(得分:0)
你没有指定一个指令集,所以我希望我选择了一个不够模糊不能为你做功课的指令。
您将要知道调用约定,或者在本例中是返回约定。某些架构的某些编译器使用寄存器来返回某些使用堆栈的东西。
int zero ( void )
{
return(0);
}
我将使用gcc pdp11交叉编译器
编译它pdp11-bsd2.11-gcc -O2 -c zero.c -o zero.o
pdp11-bsd2.11-objdump -D zero.o
并获取
00000000 <_zero>:
0: 1166 mov r5, -(sp)
2: 1185 mov sp, r5
4: 0a00 clr r0
6: 1585 mov (sp)+, r5
8: 0087 rts pc
因此,对于此体系结构,返回值在r0中。所以我们可以缩短已经很短的程序
.global _main
_main:
clr r0
rts pc
不幸的是,我的pdp11交叉编译器是一个交叉编译器,不一定是在指定的操作系统之上构建的。
pdp11-bsd2.11-as zero.s -o zero.o
pdp11-bsd2.11-gcc zero.o -o zero
/opt/gnupdp11/lib/gcc/pdp11-bsd2.11/4.7.3/../../../../pdp11-bsd2.11/bin/ld: cannot find crt0.o: No such file or directory
/opt/gnupdp11/lib/gcc/pdp11-bsd2.11/4.7.3/../../../../pdp11-bsd2.11/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
这并不重要,因为我没有带操作系统的pdp11来运行它。但是在我可以运行的不同平台上做同样类型的事情工作得很好。
在创建makefile之前,您需要知道要执行的命令行命令以执行任务。也许制作一个脚本/批处理文件,执行完整和正确的命令,以便从头到尾,然后它可以像添加一行额外的文本和缩进一样简单,你有一个Makefile。请不要在这里问这个问题,这里有太多的信息,在网上你应该没有问题找到一个非常简单的例子作为参考。