c-如何在sperate.asm文件中定义子例程/宏



我正在使用AtmelStudio在AVR中为Atmega32编程。我想知道如何在单独的文件中编写子例程或函数,然后在main.asm中调用它?

当前的问题是我在genArray.asm中有一个子例程genArrays。在main.asm开始时使用.include "genArray.asm"会导致程序在main.asm开始时立即运行genArray,此时我不希望调用它,直到我实际使用调用指令(以下示例(调用它


main.asm:

.include "genArray.asm"
.org 0x0000
start:
...
... ---- ; do some stuff
...
...
call genArrays ---- ; call to genArrays subroutine that is defined in genArray.asm (separate file)
... ---- ; return here and continue with program
... ---- ; do some more stuff

genArray.asm:

genArrays: ---- ; start of subroutine
...
...
...
... -----; do some stuff
...
ret

使用gnu汇编程序/binutils。我的avr很生疏,但是。。。

so的

.globl _start
_start:
nop
nop
rcall fun
nop
nop
here:
rjmp here

有趣的

.globl fun
fun:
nop
nop
ret

构建

avr-as so.s -o so.o
avr-as fun.s -o fun.o
avr-ld -Ttext=0 so.o fun.o -o so.elf
avr-objdump -d so.elf
so.elf:     file format elf32-avr

Disassembly of section .text:
00000000 <__ctors_end>:
0:   00 00           nop
2:   00 00           nop
4:   03 d0           rcall   .+6         ; 0xc <fun>
6:   00 00           nop
...
0000000a <here>:
a:   ff cf           rjmp    .-2         ; 0xa <here>
0000000c <fun>:
c:   00 00           nop
e:   00 00           nop
10:   08 95           ret

汇编语言是特定于汇编程序的,而不是目标程序的,因此您需要使用您正在使用的汇编程序的语言,上面是avr的gnu汇编程序。同样,如何链接它们在很大程度上是特定于工具的。gnu-ld有很多功能,AVR是一个需要(从头开始(构建的PITA,所以您可能想要使用已经构建的工具链和链接器脚本。(在linux上,我只是得到了一个工具链(。

和这一样可怕:

avr-gcc -nostdlib  so.s fun.s -o so.elf
avr-objdump -d so.elf

so.elf:     file format elf32-avr

Disassembly of section .text:
00000000 <__ctors_end>:
0:   00 00           nop
2:   00 00           nop
4:   03 d0           rcall   .+6         ; 0xc <fun>
6:   00 00           nop
...
0000000a <here>:
a:   ff cf           rjmp    .-2         ; 0xa <here>
0000000c <fun>:
c:   00 00           nop
e:   00 00           nop
10:   08 95           ret

工作(迄今为止(。

试着做一件简单的事:把.include "genArray.asm"放在main.asm的末尾,这样它的代码就会在程序内存中的main之后。

现在应该已经足够了。您还可以查看avr-gcc生成的程序集,并了解它是如何定义其函数的。

最新更新