2017-05-21 7 views
2

나는 Arduino를 C로 프로그래밍 할 수 있다고 생각하지만, 현재의 프로젝트 (작은 Arduino 커널)에서는 Assembly를 배우고 효율성을 가장 가볍게 향상시키기 위해 Assembly를 사용합니다.어셈블리에서 Arduino 프로그래밍?

__ASM __()처럼 사용할 수있는 것이 있습니까? 나는 온라인에서 사람들을 C를 배우기 위해 유사한 질문을 한 사람들에게 납득시키려는 시도를 실제로 할 수 있었지만 실제로는 대답하지 않았습니다.

감사합니다.

+0

인라인 어셈블리가 향상되었으며 어셈블리 언어를 먼저 배워야합니다. 그런 다음 나중에 실제로 인라인 어셈블리를 사용해야하는 경우 나중에 수행해야합니다. 어셈블리 언어로 AVR을 프로그래밍 할 수 있습니다 (arduino 또는 아님). –

+0

어셈블리에서 AVR을 프로그래밍하려면 어떻게해야합니까? C 함수에서 사용되는 \ __ asm__ 태그와 같은 것이 있습니까? – LoganJamison

+0

인라인 어셈블리가 없습니다. –

답변

3

나는 오래 전부터 글을 썼다.

.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 일 것입니다. 어딘가에 문서화 될 것입니다. 컴파일러가 이에 부합 할 것이므로 예외가 생겨 컴파일러가 무엇을하는지 알 수있는 적절한 예가 될 것입니다. 실험 할 때까지는 의미가 없을 수도있는 용어를 사용합니다.

+0

당신은 다양한 예제들을보고 싶을 것입니다. AVR은 배우고 싶은 첫 번째 어셈블리가 아닙니다. 마지막으로, 하버드 아키텍처의 특성 때문에 상당히 고통 스럽습니다. msp430 또는 팔 엄지 (cortex-m)은 그들 모두는 명령어 세트 시뮬레이터를 (또는 오후에 써서) 쓸 수 있으며, 맥주 도구처럼 무료로 사용할 수 있으며, 보통 10 달러 주위에 arduino 비용의 일부분 인 보드를 구입할 수 있습니다. 하나의 플러그인 만 사용하면됩니다. –

+0

예, 분명히 일부 예제 코드를 읽게 될 것입니다. 다행스럽게도 ATmega PDF 중 하나에는 Assembly와 C 모두에서 예제 코드가 있다는 것을 알았습니다. 시작하기에 좋은 장소라고 생각합니다. 도움을 주셔서 감사합니다. 그리고 나는 당신의 조언을 염두에 두겠습니다! – LoganJamison