嗨 StackOverflow 社区,
我正在尝试在 Assembler 中对我的旧 Arduino Duemilanove 板(Atmega 168V-10PU)进行编程。我之前尝试过几次,但每次都没有执行代码。所以我尝试用 C 编写一个等效的测试程序,并且它起作用了。这里是:
// file led.c
#include <avr/io.h>
int main(void)
{
DDRB = 0xFF;
PORTB = 0xFF;
while (1) {
asm("nop\n");
}
return 0;
}
编译器的 asm 转储导致(缩短),
ldi r24,lo8(-1) ; tmp44,
out 0x4,r24 ; MEM[(volatile uint8_t *)36B], tmp44
out 0x5,r24 ; MEM[(volatile uint8_t *)37B], tmp44
它可以工作并激活 Arduino 引脚 13(AVR 引脚 PB5)上的 LED。
但是当我使用这个 asm 文件时,
// file led.S
#include "avr/io.h"
.global main
main:
ldi r24, 0xFF
out DDRB, r24
out PORTB, r24
end:
jmp end
编译器转储导致(缩短),
ldi r24, 0xFF
out ((0x04) + 0x20), r24
out ((0x05) + 0x20), r24
什么可以解释为什么什么也没发生。
另外这里是C 版本和汇编器版本的 makefile
感谢您的帮助!
编辑:这里也是 C 版本和汇编器版本的完整汇编器转储文件
编辑 2:我在包含文件 iom168.h 中查找了寄存器地址,该文件引用了 iomx8.h,其中显示#define PORTB _SFR_IO8 (0x05)
. 编译器遵循包含链
io.h -> iom168.h -> iomx8.h
io.h -> common.h -> sfr_defs.h
在 sfr_defs.h 中写着:
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
定义了偏移量向上的几行:
#ifndef __SFR_OFFSET
/* Define as 0 before including this file for compatibility with old asm
sources that don't subtract __SFR_OFFSET from symbolic I/O addresses. */
# if __AVR_ARCH__ >= 100
# define __SFR_OFFSET 0x00
# else
# define __SFR_OFFSET 0x20
# endif
#endif
(抱歉格式化)知道这个错误来自哪里吗?