2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

Similar documents
슬라이드 1

Microsoft Word - FunctionCall

Microsoft Word - ExecutionStack

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

C# Programming Guide - Types

lecture4(6.범용IO).hwp

6주차.key

untitled

MicrocontrollerAcademy_Lab_ST_040709

슬라이드 1

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

K&R2 Reference Manual 번역본

MAX+plus II Getting Started - 무작정따라하기

강의10

BMP 파일 처리

02 C h a p t e r Java

C++-¿Ïº®Çؼ³10Àå

hlogin2

UART.h #ifndef _UART_H_ #define _UART_H_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ UL UART PORT1 void UAR

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

untitled

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

Deok9_Exploit Technique

PowerPoint 프레젠테이션

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

Microsoft PowerPoint - ch07 - 포인터 pm0415

No Slide Title

hlogin7

Microsoft PowerPoint - a10.ppt [호환 모드]

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

PowerPoint 프레젠테이션

MPLAB C18 C

Microsoft Word - ASG AT90CAN128 모듈.doc

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi


4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

[8051] 강의자료.PDF

슬라이드 1

Microsoft PowerPoint - ch07 - 포인터 pm0415

SRC PLUS 제어기 MANUAL

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - chap6 [호환 모드]

컴파일러

歯9장.PDF

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

untitled

C. KHU-EE xmega Board 에서는 Button 을 2 개만사용하기때문에 GPIO_PUSH_BUTTON_2 과 GPIO_PUSH_BUTTON_3 define 을 Comment 처리 한다. D. AT45DBX 도사용하지않기때문에 Comment 처리한다. E.

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

13주-14주proc.PDF

<BDC7C7E83120B0E1B0FABAB8B0EDBCAD202832C1D6C2F7292E687770>

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint APUE(Intro).ppt

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft Word - 1. ARM Assembly 실습_xp2.doc

2. Deferred Interrupt Processing A. Binary Semaphores를이용한동기 (Synchronization) i. Binary Semaphores는 Interrupt가발생하였을때특정한 를 Unblock 하는데사용할수있다. 이러한기능은 In

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

금오공대 컴퓨터공학전공 강의자료

본 강의에 들어가기 전

C++ Programming

PowerPoint 프레젠테이션

<BDC7C7E83220B0E1B0FABAB8B0EDBCAD202833C1D6C2F7292E687770>

T100MD+

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - a8a.ppt [호환 모드]

chap10.PDF

중간고사

PowerPoint 프레젠테이션

<4D F736F F D20BDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCADB0ADC1C2202D203420C7C1B7CEB1D7B7A1B9D62E646F63>

인터럽트 * 인터럽트처리메커니즘 ATmega128 인터럽트 2

untitled

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

chap7.key

untitled

untitled

디지털공학 5판 7-8장

ATmega128

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap06-2pointer.ppt

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

PowerPoint 프레젠테이션

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

목차 1. 제품 소개 특징 개요 Function table 기능 소개 Copy Compare Copy & Compare Erase

Microsoft PowerPoint - chap03-변수와데이터형.pptx

5 167 Python Jon Franklin Python Python Python Python USB USB RS485 C Python DLL Python Python dll Python Python ctypes dll ctypes Python C Linux Wind

PowerPoint 프레젠테이션

9

11장 포인터

Chapter #01 Subject

untitled

금오공대 컴퓨터공학전공 강의자료

EWAVR 5.1x 프로젝트 옵션 설정(1_2) 2. Project -> > Option -> > General Option -> > Output / Library Configuration Library Configuration 은 사용하게 될 Library file을

PRO1_09E [읽기 전용]

No Slide Title

KEY 디바이스 드라이버

목차 1. 개요 USB 드라이버 설치 (FTDI DRIVER) FTDI DRIVER 실행파일 USB 드라이버 확인방법 DEVICE-PROGRAMMER 설치 DEVICE-PROGRAMMER

Transcription:

C 언어와 Assembly Language 을사용한 Programming 20011.9 경희대학교조원경 1. AVR Studio 에서사용하는 Assembler AVR Studio에서는 GCC Assembler와 AVR Assmbler를사용한다. A. GCC Assembler : GCC를사용하는경우 (WinAVR 등을사용하는경우 ) 사용할수있다. New Project 를만들때 Project Type Window에서 AVR GCC를선택한다. B. AVR Assembler : AVR Studio를설치하면함께설치된다. New Project 를만들때 Project Type Window에서 Atmel AVR Assembler를선택한다. C. GCC C와 Assembly 언어를혼합한프로그램을작성할경우에는 AVR GCC Project를선택한다.

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다. iii. GCC Assembler는 GCC C/C++ 와같은 Preprocessor을사용한다. #include, #define 등을사용할수있다. iv. Data Segment 에정의된변수를초기화할수있다. Assembler 는 Initialized Data 를초기화하는데필요한 Startup Code 를발생 시키고, 이프로그램에서 Initialized Data 를 SRAM 에 Copy 한다. B. Atmel AVR Assembler 를사용하는경우 i. Assembly Language Program 은.asm Extension 을갖는다. ii. Atmel AVR Assembler는 Data Segment 영역을초기화하지않는다. 만약초기화가필요한경우에는 Code Segment 내에초기화에필요한 Data를포함시키고, 이값을 Data Segment 영역으로복사하여주는초기화프로그램을작성하여실행하여야한다. C. 기타차이 GCC Assembler hi8 lo8.asciz hello.section.data.section.text <avr/io.h> Atmel AVR Assembler high low.db hello,0.dseg.cseg m128def.inc 3. GCC Assembly Language Program 예 // Project Name : sw_led_basic # ifndef atmega128 #define atmega128 # endif

#define FOSC 16000000// Clock Speed #include <avr/io.h> // Definition file for ATmega128 // [Add all hardware information here] // Program Constants // Program Variables Definitions #define RG_TEMP r0 // Temporary Register #define RG_ZERO r1 // #define AC0 r16 // #define AC1 r17 // // SRAM Definitions #define SFR_OFFSET 0.section.data.ORG 0x0000 //cbyte:.byte 0x00 // Define Constant Byte //cword:.word 0x0000 // Define Constant Word //clongword:.long 0x00000000 // Define Constant Long Word.section.text.global main // Main Entry into program main: // I/O Port Init clr AC0 sts PORTF, AC0 // PORTF : Memory Mapped I/O Port

out DDRD, AC0 // PORTD : I/O Maped Inputport ser AC0 out PORTD, AC0 sts DDRF, AC0 // Input Port PullUp // PORTF : Output Port loop:.end in AC0, PIND andi AC0, 0x03 sts PORTF, AC0 rjmp loop // Loop Indefinitly 4. Atmel AVR Assembly Language Program 예.NOLIST.include "m128def.inc" ; Definition file for ATmega128 ; Interrupt Vectors Table.include "avr128_interrupt_table.inc" ; [Add all hardware information here].device ATmega128.LIST ; Program Constants.equ const = $00 ; Generic Constant Structure ; ; Program Variables Definitions.def AC0 = r16 ;.def AC1 = r17 ; ; SRAM Definitions

.DSEG.ORG 0x0100 ;cgbyte:.db $00 ;cgword:.dw $0000 ;vgbyte:.byte 1 ;vgword:.byte 2 ;vgdword:.byte 4 ; Define Constant Byte ; Define Constant Word ; Reserve 1 Byte to Global Variable ; Reserve 2 Byte to Global Variable ; Reserve 4 Byte to Global Variable.CSEG ; Func: RESET Handler Routine RESET: ; Stack Pointer Init ldi AC0, LOW(RAMEND) out SPL, AC0 ldi AC0, HIGH(RAMEND) out SPH, AC0 rjmp MAIN ; Main Entry into program MAIN: ; I/O Port Init clr AC0 sts PORTF, AC0 out DDRD, AC0 ser AC0 out PORTD, AC0 sts DDRF, AC0 ; PORTF : Memory Mapped I/O Port ; PORTD : I/O Maped Inputport ; Input Port PullUp ; PORTF : Output Port LOOP: in AC0, PIND ;

andi AC0, $03 sts PORTF, AC0 rjmp LOOP ; Loop Indefinitly 5. C와 Assembly Language을혼합한 Program에서 Register의사용 C Program에서 Assembly 언어로작성된 Subroutine을 Call 하는경우호환성을위하여 C Compiler에서 Rg를사용하는규칙을아는것이중요하다. A. C Compiler에서 Register 사용 i. r0 : Temporary Register 로사용한다. Assembly 언어로작성된프로그램에서 C 함수를호출하는경우이 Rg는 Assembly Code 내에서 Save 되고, Restore 되어야한다. 그러나, Compiler에의하여생성된 Interrupt Routine은 r0 Rg를 Save 하고 Restore 한다. ii. r1 : Compiler는이 Rg의값이 zero라고가정한다. iii. r2 r17, r28, r29 : 이 Rg 들은 Compiler에의하여생성된 Code 에서임시저장장소로이용되기때문에 Assembly Code에서이 Rg가사용되고, Compiler에의하여생성된 Code에서 Call 된다면이 Rg들은 Assembly Code 내에서 Save 되고, Restore 되어야한다. Y Index Register(r29:r28) 는 Function의 Stack Frame Pointer 로사용된다. iv. r18 r27, r30, r31 : 이 Rg 들도 Assembly Code에서사용되고, Assembly Code에서 Compiler에의하여생성된 Code를 Call 하여야한다면 Assembly Code 내에서 Save 되고, Restore 되어야한다. 6. Function Call을할때 Argument Passing과 Return Values A. Register를이용한 Parameter Passing i. 미리약속된 Rg를사용하여 Function Arguments를 Passing 한다. ii. Function Arguments 는좌측에서우측으로배치되어있고, r25 로 부터 r8 까지할당된다. iii. 모든 Arguments 는짝수개의 Rg 에할당된다. C Compiler 가

MOVW 명령을사용하여 Word 단위로 Data 를처리하도록하여 보다효과적으로데이터를처리할수있다. iv. 만약보다더많은 Arguments 를 Pass 하여야하는경우에는나머 지 Arguments 는 Stack 을이용하여 Pass 한다. v. Rg 를이용한 Arguments Passing 예 Void lcd_cursor_xy(uint8_t x, uint8_t y); lcd_cursor_xy(2,3); // 이함수는아래와같이 Compile 된다. eor r25, r25 ; r25 clear ldi r24, 0x02 eor r23, r23 ; r23 clear ldi r22, 0x03 call lcd_cursor_xy B. Stack을이용한 Parameter Passing i. 일부함수 (Printf, scanf, etc) 는 모든 Arguments를 Stack을이용 하여 Pass 한다. ii. 이때 char parameters는 Integer(Word) 로확장되어 Pass 된다. iii. Parameters는오른쪽에있는 parameter 부터 Stack에 Push 된다. iv. 8-bit 변수는 16-bit로확장되어 Pass 된다. v. 이때상위 8-bit는 zero로 set 된다. C. Return Values i. 8-bit 값은 r24을이용하여 Return 된다. ii. 16-bit 값은 r25:r24을이용하여 Return 된다. iii. 32-bit 값은 r25:r24:r23:r22을이용하여 Return 된다. iv. 64-bit 값은 r25:r24:r23:r22:r21:r20:r19:r18 을이용하여 Return 된다. 7. Assembly Language 로작성된 Program 에서 C 프로그램함수를 Call 하는

경우의예 GCC Assembly 언어로작성된 main 프로그램, 이프로그램에서 GCC c언어로작성된함수를 Call 한다. // Project Name : asm_call_c_func_3v_add // // Author: chowk // Lab: KHU // Date: 2011. 8. 20 // Assembly 프로그램에서 C 로작성된 Subroutine 을 Call 하는예제이다. # ifndef atmega128 #define atmega128 # endif #define FOSC 16000000// Clock Speed #include <avr/io.h> // Definition file for ATmega128 // [Add all hardware information here] // Program Constants // Program Variables Definitions #define RG_TEMP r0 // Temporary Register #define RG_ZERO r1 //

#define AC0 r16 // #define AC1 r17 // // SRAM Definitions #define SFR_OFFSET 0.section.data.ORG 0x0000 // Global 변수 sum을선언하고 0x0000 으로초기화한다. sum:.word 0x0000 // Global 변수 x1을선언하고 0x0104 으로초기화한다. x1:.word 0x0104 // Global 변수 x2을선언하고 0x0205 으로초기화한다. x2:.word 0x0205 // Global 변수 x3을선언하고 0x0306 으로초기화한다. x3:.word 0x0306.section.text.global main // Main Entry into program main: // I/O Port Init clr AC0

sts PORTF, AC0 // PORTF : Memory Mapped I/O Port out DDRD, AC0 // PORTD : I/O Maped Inputport ser AC0 out PORTD, AC0 sts DDRF, AC0 // Input Port PullUp // PORTF : Output Port // Y Pointer 에 Global 변수 x1 의시작번지를 Load 한다. ldi r29, hi8(x1) // Y : r29:r28 ldi r28, lo8(x1) // x1 값을 r25:r24 을이용하여 Subroutne에 Pass 한다. ld r24, Y+ ld r25, Y+ // 일반적으로 x2의 Pointer를다시 Load 하여야하나 // 이 Assembly 프로그램에서는 x2가다음번지에할당된것을알기때문에생략할수있다 // ldi r29, hi8(x2) // ldi r28, lo8(x2). // x2 값을 r23:r22 을이용하여 Subroutne에 Pass 한다. ld r22, Y+ ld r23, Y+ // 일반적으로 x3 의 Pointer 를다시 Load 하여야하나 // 이 Assembly 프로그램에서는 x3 가다음번지에할당된것을알기때 문에생략할수있다. 이경우 2 개의명령을생략할수있다.

// ldi r29, hi8(x3) // ldi r28, lo8(x3) // x3 값을 r21:r20 을이용하여 Subroutne에 Pass 한다. ld r20, Y+ ld r21, Y // c 언어로작성된 Subroutine을호출한다. call add // Y Pointer 에 Global 변수 sum의시작번지를 Load 한다. ldi r29, hi8(sum) ldi r28, lo8(sum) // Subroutine 으로부터 Return 된결과를 sum에저장한다. st Y+, r24 st Y, r25 loop: in AC0, PIND // SW의상태를읽는다. andi AC0, 0x01 // SW0 를테스트한다. breq NEXT1 // SW0 가 Open 된경우 sum의 LSD(8-bit) 를 LED에출력한다. sts PORTF, r24 rjmp NEXT2 // SW0 가 Closed 된경우 sum의 MSD(8-bit) 를 LED에출력한다. NEXT1: sts PORTF, r25 NEXT2: rjmp loop // Loop Indefinitly

.end C 언어로작성된 Subroutine(Fuction) 예 #include <avr/io.h> #include <stdio.h> int short add( int short, int short, int short); // function call 과정 (parameter passing, frame pointer 의저장 ) 의이해하기위함. int short add( int short x1, int short x2, int short x3) { int short z; z = x1 + x2 + x3; return(z); } 8. C 프로그램에서 Program 에서 Assembly Language 작성된함수를 Call 하는경우의예 C 언어로작성된 main 프로그램, 이프로그램에서 Assembly 언어로작성된함수를 Call 한다. // S/W Environment : AVR Studio + WINAVR Compiler // Made by chowk. # ifndef atmega128 #define atmega128 # endif

#define FOSC 16000000// Clock Speed #include <avr/io.h> #include <stdio.h> #include <avr/interrupt.h> int short asm_add( int short, int short, int short); void init_devices(void); //Initialize all peripherals void init_devices(void) { cli(); DDRF = 0xff; // Disable all interrupts // PORTF : Output PORT PORTF = 0x00; DDRD = 0x00; PORTD = 0xff; sei(); // PORTD : Input PORT // Input PORT Pull up // Re-enable interrupts } int short sum = 0 ; // global variable, bss section에할당된다. int main(void){ init_devices(); // Assembly subroutine을 call 할때 Parameter passing 과

// call 및 ret 과정을이해하기위함. // 이프로그램실험 ( Listing File에서 Parameter passing 등을 // 이해하기위함 ) 을위하여는 Compile Option Os 를사용 // 하면안된다. ( 상수만 Pass 하고그연산결과를 Return 하는 // 함수는최적화과정에서생략되기때문 ) sum = asm_add(0x0104, 0x0205, 0x0306); for( ; ; ){ // SW의상태를읽어서, // SW0가 Open 된경우 sum의 LSD(8-bit) 를 LED에출력하고, // SW0가 Closed 된경우 sum의 MSD(8-bit) 를 LED에출력한다. if((pind & 0x01)!= 0) PORTF = (char)(sum & 0x00ff); else PORTF = (char)((sum >> 8) & 0x00ff); } return 0; } Assembly 언어로작성된 c 함수 // Project Name : c_call_asm_func_3v_add // Author: chowk // Lab: KHU // c언어로작성된프로그램에서 Assembly 언어로작성된함수를 call 할때인수의전달과연산결과를 Return하는과정을이해하기위한예제임.

# ifndef atmega128 #define atmega128 # endif #define FOSC 16000000// Clock Speed #include <avr/io.h> // Definition file for ATmega128 #include <avr/interrupt.h> // [Add all hardware information here] // Program Constants // Program Variables Definitions #define RG_TEMP r0 // Temporary Register #define RG_ZERO r1 // #define AC0 r16 // #define AC1 r17 // // SRAM Definitions // Needed to subtract 0x20 from I/O addresses #define SFR_OFFSET 0.section.data.ORG 0x0100

//cbyte:.byte 0x00 // Allocata byte(s) of storage with initialized values //cword:.word 0x0000 // Allocata word(s) of storage with initialized values //clongword:.long 0x00000000 // Allocata 32-bit long word(s) of storage with initialized values.global asm_add.section.text // Function Entry asm_add: add r22, r24 // x1의 LSD(r24) 와 x2의 LSD(r22) 를더한다. adc r23, r25 // x1의 MSD(r25), x2의 MSD(r23) 와 Carry를 더한다. add r22, r20 // ((x1의 LSD(r24) + (x2의 LSD(r22))) 에 X3 의 LSD(r20) 를더한다. adc r23, r21 // ((x1의 MSD(r25) + (x2의 MSD(r23))) 에 X3의 MSD(r21) 와 Carry를더한다. movw r24, r22 // r25:r24 를이용하여결과를 Return 하기위하여계산결과를 r25:r24에복사한다. ret.end