나는 오래 전부터 글을 썼다.
.device ATmega168
.equ DDRB = 0x04
.equ PORTB = 0x05
.org 0x0000
rjmp RESET
RESET:
ldi R16,0x20
out DDRB,R16
ldi R18,0x00
ldi R17,0x00
ldi R20,0x20
Loop:
ldi R19,0xE8
aloop:
inc R17
cpi R17,0x00
brne aloop
inc R18
cpi R18,0x00
brne aloop
inc R19
cpi R19,0x00
brne aloop
eor R16,R20
out PORTB, R16
rjmp Loop
나는 내 자신의 아두 이노 로더
blinker01.s.hex : blinker01.s
avra -fI blinker01.s
clean :
rm -f blinker01.s.*
은 물론 avr_dude를 사용할 수를 쓴 것 아브라을 사용합니다. 조금 다른 GNU 뭔가
: 당신이 포트를 정의하는 헤더 파일이 필요 정말 해달라고
.globl _start
_start:
rjmp RESET
RESET:
ldi R18,0x00
ldi R17,0x00
ldi R20,0x20
Loop:
ldi R19,0xE8
aloop:
inc R17
cpi R17,0x00
brne aloop
inc R18
cpi R18,0x00
brne aloop
inc R19
cpi R19,0x00
brne aloop
rjmp Loop
, 당신은 그에게 자신을 선언 할 수 있습니다. APT-있어 AVR-GCC (그리고 바이너리 유틸리티)를 사용
는
MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > rom
}
avr-as so.s -o so.o
avr-ld -T so.ld so.o -o so.elf
avr-objdump -D so.elf > so.list
avr-objcopy so.elf -O ihex so.hex
가능성과 아두 이노 샌드 박스에 사용되는 동일한 도구를 직접 액세스 할 수 있어야합니다,하지만 난 그렇게 잘 모릅니다 샌드 박스를 사용하지 말아.
편집
또 다른 접근법은 또한 컴파일러는 다음 가서 무엇을보고, 조립의 기초에 도움, 제한,하지만 당신은 다음 개체를 추가 작업 C 응용 프로그램 환경으로 시작부터 툴체인과 성공 가능성이 높습니다 그것을 읽어 :
unsigned short fun (unsigned short x, unsigned short y)
{
return(x+y+5);
}
avr-gcc -c -O2 so.c -o so.o
avr-objdump -D so.o
00000000 <fun>:
0: 6b 5f subi r22, 0xFB ; 251
2: 7f 4f sbci r23, 0xFF ; 255
4: 86 0f add r24, r22
6: 97 1f adc r25, r23
8: 08 95 ret
그렇게
이 so.s
.globl fun
fun:
subi r22, 0xFB ; 251
sbci r23, 0xFF ; 255
add r24, r22
adc r25, r23
ret
avr-as so.s -o so.o
avr-objdump -D so.o
00000000 <fun>:
0: 6b 5f subi r22, 0xFB ; 251
2: 7f 4f sbci r23, 0xFF ; 255
4: 86 0f add r24, r22
6: 97 1f adc r25, r23
8: 08 95 ret
0123을 만들
그리고 C 제작 객체에서 링크하는 대신 어셈블리 생성 객체에서 링크를 사용하면 실험을 통해 알아낼 수있는 호출 규칙을 배워야합니다.
unsigned char fun (unsigned char x, unsigned char y)
{
return(x+(y<<1));
}
00000000 <fun>:
0: 66 0f add r22, r22
2: 86 0f add r24, r22
4: 08 95 ret
이 경우에는 r22의 두 번째 매개 변수가 먼저 r24에 있고, 반환 값은 r24입니다. 그래서 22/23은 short와 같은 큰 항목의 경우 첫 번째 매개 변수이고 두 번째 경우는 24/25 일 것입니다. 어딘가에 문서화 될 것입니다. 컴파일러가 이에 부합 할 것이므로 예외가 생겨 컴파일러가 무엇을하는지 알 수있는 적절한 예가 될 것입니다. 실험 할 때까지는 의미가 없을 수도있는 용어를 사용합니다.
인라인 어셈블리가 향상되었으며 어셈블리 언어를 먼저 배워야합니다. 그런 다음 나중에 실제로 인라인 어셈블리를 사용해야하는 경우 나중에 수행해야합니다. 어셈블리 언어로 AVR을 프로그래밍 할 수 있습니다 (arduino 또는 아님). –
어셈블리에서 AVR을 프로그래밍하려면 어떻게해야합니까? C 함수에서 사용되는 \ __ asm__ 태그와 같은 것이 있습니까? – LoganJamison
인라인 어셈블리가 없습니다. –