2012-02-26 1 views
1

assigment 일부 C 선언을 AVR 지시문 만 사용하여 어셈블리로 변환해야합니다.어셈블리에 C 문

누구든지 나에게이 작업을 수행하는 방법에 대해 조언을 해 줄 수 있는지 궁금합니다.

예를 들어

:

하는 번역 '문자에 c;' 및 'char * d;'

주의 사항 조립 문에,이

어떤 도움/조언

+0

선생님께서는 어떤 조언을 해주셨습니까? 당신은 그 충고와 당신 자신의 노력으로 얼마나 멀리 있었습니까? –

+0

'char c;'는 변수 정의입니다. 그것은 진술이 아닙니다 (실제로 ** 아무 것도하지 않습니다). 'a = b + c;'는 성명이됩니다. –

+0

죄송합니다. 선언으로 변경되었습니다. 선생님은 실제로 어떤 충고도하지 않으 셨습니다. 일주일의 휴가가 있기 때문에 아무 것도 요구할 수 없습니다. 과제는 어셈블리로 번역되어야하는 선언 만 포함합니다. – Brainscrewer

답변

2

첫째, char c;char* d;이 선언되지 문장입니다 감사하겠습니다, 첫 주 메신저 학습 어셈블리입니다.

# Dump assembly to stdout 
avr-gcc -mmcu=your_avr_mcu -S -c source.c -o - 

그런 다음 인라인 어셈블러 문을 작성하는 관련 어셈블리 출력 부분을 다시 사용할 수 있습니다 : 당신이 할 수있는 일

avr-gcc 옵션 -S로 C 프로그램의 어셈블리 출력을 덤프입니다. avr-gcc 인라인 assember을 작성하는 방법에 여기

봐 :

당신이에서 분해 할 수있는 컴파일러없이

http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

+0

덤프 할 수있는 C 프로그램이 없습니다. 나는 신문에 단지 – Brainscrewer

+2

@Brainscrewer라는 진술 만 가지고 있습니다. 여러분은'source.c'에 C 문장을 써서 어떻게 번역되어서 재사용 할 수 있는지보아야합니다. – ouah

0

(AVR-GCC는 구하기 쉬운),이 시도하기 어려울 수 있습니다 높은 수준의 언어가 컴파일 될 때 어떤 일이 발생하는지 이해하십시오.

그런 선언을 사용할 때 단순히 변수 또는 주소를 원한다고 선언하는 것입니다. 반드시 그럴 필요는 없습니다. 종종 데드 코드와 다른 것들은 컴파일러에 의해 코드에서 제거됩니다. 변수가 끝나는 곳을 아는 컴파일 프로세스가 끝날 때까지는 그렇지 않은 경우도 있습니다. 때로는 char가 레지스터에 만 살기 때문에 프로그램의 짧은 기간 동안 변수에 집이 있습니다. 때로는 변수가 프로그램을 실행하는 전체 시간에 변수가 더 길어지고 하나의 변수에 영원히 보관할 충분한 레지스터가 없기 때문에 변수가 할당 된 메모리 위치를 가져 오는 경우가 있습니다.

마찬가지로 포인터는 레지스터 또는 메모리 위치에도있는 주소입니다.

C 코드를 추가하고 어떤 결과가 발생하는지 실험 해 볼 수있는 컴파일러가 없다면. 그리고 원하는 경우에도 원하는 프로세서 제품군에 대한 설명서를 설정해야합니다. D r은 모두 그래서 당신은, R23를 R10를 추가 할 수 0과 31 것을 예를 들어 추가 작업에

http://www.atmel.com/Images/doc0856.pdf

봐는 RR, RD을 추가하고 당신을 보여줍니다. 그리고 r10 = r10 + r23을 의미하는 연산을 살펴보십시오. C에서 추가하고자하는 char 변수가 있다면 컴파일러가 사용할 수있는 명령어 중 하나입니다.

하나의 16 비트 워드 버전과 두 개의 16 비트 워드를 갖는 두 개의 lds 명령이 있습니다. (일반적으로 어셈블러가이를 선택합니다). rd는 0과 31 사이이며 k는 메모리 공간의 주소입니다. 선언 된 전역 변수가 있다면 lds 또는 sts를 사용하여 액세스 할 수 있습니다. 그래서 K는 포인터, 고정 된 포인터입니다. C에서 char *는 코드에서 포인터로하는 작업에 따라 컴파일 타임에 고정 숫자로 바뀔 수 있습니다.그것이 역동적 인 것이라면 ld와 st의 맛을 살펴 봅니다. 레지스터 쌍을 사용합니다. 그래서 char * 포인터가 포인터 쌍을 저장하는 한 쌍의 레지스터 또는 한 쌍의 메모리 위치로 바뀌면 x, y 또는 z 레지스터 쌍을 사용할 수도 있습니다. ld 및 st를 참조하십시오. ld 또는 st를 사용하기 전에 해당 포인터에 대한 오프셋.

시뮬레이터 http://github.com/dwelch67/avriss이 있습니다. 시뮬레이터와 그 잠재적 인 버그를 조사하여 명령어 세트를 배우고 싶지 않다면, 완전히 디버깅되지 않은 채로 작업이 필요합니다. simavr 및 다른 일부는 코드 실행을 감시하는 데 사용할 수 있습니다. http://gitorious.org/simavr