如何编写.S文件并从中生成可执行文件?

时间:2014-01-28 18:37:02

标签: assembly makefile

我有一个任务,涉及编写.S文件并构建一个返回0的可执行文件。我查了一下,它说它是汇编源代码,但是当我像汇编一样编写它时它没有编译。有人能给我一个.S文件的例子或者他们的教程会指出我正确的方向吗?另外,我必须创建一个将创建可执行文件的makefile。

1 个答案:

答案 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。请不要在这里问这个问题,这里有太多的信息,在网上你应该没有问题找到一个非常简单的例子作为参考。