我正在使用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
生成的程序集,并了解它是如何定义其函数的。