Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Chapter 2 Assembly Language Programming KyungHee Univ. 2-0 AVR Instructions AVR has 133 different instructions Instruction Types Data Transfer Arithmetic and Logic Control Transfer (branch/jump) Bit and bit-test Processor Control KyungHee Univ. 1-1 Data Transfer Instructions (1) MOV - transfers data between two registers. MOV Rd, Rr LD - loads data from memory or immediate value (Indirect Addressing) LD dest, src (Load) dest = Rd src = X, X+, -X, Y, Y+, Y, Y+, -Y, Z, Z+, -Z LDD dest, src (Load with Displacement) • dest = Rd • src = Y+displacement, Z+displacement LDI Rd,k immediate (Load Immediate) Binary => 0b00001010, Decimal => 10, Hexadecimal => 0X0A, $0A LDS Rd, k (Load Direct from Data Space) 0 ≤ 𝑑 ≤ 31, 0 ≤ 𝑘 ≤ 65535 KyungHee Univ. 1-2 Data Transfer Instructions (2) LPM - load program memory LPM dest, src dest = Rd src = Z, Z+ LPM(Operand 가 생략 된 경우) dest = R0 (implied) src = Z (implied) ST – indirect stores data to memory ST dest, src dest = X, X+, -X, Y, Y+, -Y, Z, Z+, -Z src = Rr STD dest, src dest = Y+displacement, Z+displacement src = Rr STS k, Rr k : Direct Address KyungHee Univ. 1-3 Data Transfer Instructions (3) IN/OUT - input/output IN Rd, A OUT A, Rr PUSH/POP - stack operations PUSH Rr POP Rd KyungHee Univ. 1-4 Data Transfer Examples (1) LD Rd, Y LD R16, Y; R16 ← M(Y) Y is implied in the opcode 1000 000d dddd 1000 10000 LDI Rd, K LDI R30, 0xF0; R30 ← 0xF0 (hexadecimal) Destination register can only be R16-R31 8 bit constant K (0 ≤ K ≤ 255) 1000 kkkk 1111 KyungHee Univ. dddd kkkk 0000 1-5 Data Transfer Examples (2) LDD Rd, Y+q LDD R4, Y+2; R4 ← M(Y+2) Y is implied in the opcode 6 bit constant q (0 ≤ q≤ 63) 10q0 qq0d dddd 00100 IN Rd, A 1qqq qqqqqq=000010 IN R25, $16; R25 ← I/O($16) $16 is an I/O register connected to Port B (PIN7-PIN0) 6 bit A (0 ≤ A≤ 63) => 64 I/O registers. 1011 0AAd 01 KyungHee Univ. dddd AAAA 0110 1-6 ALU Instructions (1) Arithmetic instructions ADD/SUB ADD dest, src dest = Rd src = Rr Also ADC/SBC add/subtract with carry MUL - Multiply unsigned MUL Rd, Rr R1<-Result(high), R0<-Result(low) Also MULS -> multiply signed INC/DEC - increment/decrement register CLR/SER - clear/set register KyungHee Univ. 1-7 ALU Instructions (2) Logic instructions AND/ANDI - logical AND & /w immediate AND Rd, Rr ANDI Rd, immediate OR/ORI - logical OR & /w immediate OR Rd, Rr ORI Rd, immediate Also EOR -> exclusive OR COM/NEG - one’s/two’s complement COM RD TST - test for zero or minus TST Rd KyungHee Univ. 1-8 ALU Examples MUL Rd, Rr MUL R15, R16; R1:R0 ← R15 x R16 Both operand unsigned (signed version => MULS) Product high and low stored in R1 and R0, respectively. 1001 11rd dddd rrrr rrrrr = 10000 ddddd = 01111 KyungHee Univ. 1-9 Branch Instructions BRcond - Branch on condition BRcond address cond = EQ, NE, CS, CC, SH, LO, MI, PL, GE, LT, HS, HC, TS, TC,VS, VC, IE, ID CP – compare CP Rd, Rr CPC Rd, Rr CPI Rd, immediate COM/NEG - one’s/two’s complement COM RD TST - test for zero or minus TST Rd …many more KyungHee Univ. 1-10 Branch Example Example Branches are PC-relative: if (Z=1) then PC <-PC + address +1 0232 CP R0, R0 ; compare 0233 BREQ SKIP 0234 next inst. … … 0259 SKIP: … 0259H - 0234H = 0025H BREQ SKIP => 1111 00kk kkkk k001 Address range => -64 ≤ k ≤ +63 KyungHee Univ. 0100101 1-11 Jump Instruction JMP instructions JMP address Also, RJMP, IJMP CALL/RET - subroutine call/return CALL address RET Stack implied Also RETI -> return from interrupt …and few more KyungHee Univ. 1-12 Jump Example Example Subroutines are implemented using CALL and RET 0230 CALL SUBR 0232 next inst. After CALL 03F0 SUBR: … SP • {my subroutine} • … • RET Low 02 SP PC=03F0 32 (initially) High CALL is 32-bit instruction 10q0 qq0d dddd 1qqq 1011 0AAd dddd AAAA After RET Low 02 qqqqqq=000010 KyungHee Univ. SP (initially) PC=0232 32 High 1-13 Bit and Bit Test Instructions LSL/LSR - Logical Shift Left/Right LSL Rd ROL/ROR - Rotate Left/Right through carry ROL Rd SEflag/CLflag - Set/Clear flag flag = C, N, Z, I, S, V, T, H SEZ => set zero flag …many more KyungHee Univ. 1-14 Other Instructions NOP SLEEP WDR KyungHee Univ. ; Do nothing for 1 cycle ; Sleep until reset or interrupted ; Reset Watch Dog Timer 1-15 AVR Assembly Directives Called pseudo opcodes .ORG: Assembler에게 Instructions을 저장할 위치를 설정 하게 한다. .ORG 0x37 .EXIT: Assembler에게 Assembling file의 끝에 도달 하였음을 알린다. .EQU: Label의 값을 설정 한다. Syntax: .EQU label = expression .EQU io_offset = 0x23 .BYTE: Data memory에 필요한 memory 공간을 확보 하도록 한다. Syntax: LABEL: .BYTE expression (Memory 공간의 Byte 수) var: .BYTE 1 .DB: Code에 Byte Data를 저장 하도록 한다. Syntax: LABEL: .DB expressionlist consts: .DB 0, 255, 0b01010101, -128, 0xaa" Text: .DB “This is a text.” .DW: Code에 16-bit words Data를 저장 하도록 한다. Syntax: LABEL: .DW expressionlist Univ. varlist: .DW 0,0xffff,0b1001110001010101,-32768,65535 KyungHee 1-16 AVR Assembly Language Programming 예 Addition of 2 Numbers Program Source Code Line은 아래 4가지 형태 중 하나임. [Label] Field : Directive : [Operand] : [Comment] [Label] Field : Instruction : [Operand] : [Comment] Comment Empty line start: Done: Nums: KyungHee Univ. .include "m128def.inc" .CSEG .ORG $0000 ldi ZL,low(Nums<<1) ; Program memory는 Word(16Bit) 단위 ldi ZH,high(Nums<<1) ; Word Addressing을 Byte Addressing으로 변환 clr R0 lpm R2,Z+ add R0, R2 lpm R2,Z+ adc R0, R2 ; Accumulate the result in R0 ; Load data to R2 and post inc. pointer ; Add R2 to R0 ; Load data to R2 and post inc. pointer ; Add R2 to R0 jmp Done .DB 4, 8 ; Done. Loop forever. 1-17 Label Field Label 끝에는 colon( : ) 이 따른다. A-Z, a-z, 0-9, 특수문자( . $ _ ) 를 사용 할 수 있다. 각 Label은 프로그램내에서 한번 정의 되는 것이 원칙이다. 그러나, 다음의 경우에는 예외로 한번 이상 정의 될 수 있다. Set Directive 명령에 의하여 같은 Symbol이 재 정의 되는 경우 Label은 명령어 또는 Data의 첫 시작 번지를 지시 한다. Comments ; 다음에 Comment 문을 쓴다. Ex) ; This line is also a comment /* 와 */ 사이에 Comment 문을 쓴다. Ex) /* comment */ Comment 는 Assembler에 의하여 무시된다. KyungHee Univ. 2-18 Operation Field Label Field 다음에 최소한 한자의 White Character 다음에 시작 된다. Op Field는 Legal Opcode Mnemonic 또는 Assembler directive를 포함 하여야 한다. Opcodes 는 Machine instruction 에 직접 대응 된다. Directives or Pseudo-ops 는 Assembly process 하는 동안 Assembler에게 지시하는 명령어 이다.( 직접 Machine instruction 과 대응 되지 않는다.) KyungHee Univ. 2-19 GNU Assemler의 중요 Directives .org new-lc Location Counter의 값을 new-lc로 설정 한다. .align abs-expr Location Counter의 값을 현재 위치로 부터 첫 번째 abs-expr 의 정수배 가 되는 값으로 설정 한다. .byte Byte 단위로 데이터를 저장한다. .word Word 단위로 데이터를 저장한다. .2byte expression 2 Byte 단위로 데이터를 저장한다. .4byte expression 4 Byte 단위로 데이터를 저장한다. .8byte expression 8 Byte 단위로 데이터를 저장한다. KyungHee Univ. 2-20 GNU Assemler의 중요 Directives .section name 다음 에 오는 Code 가 name section 영역에 할당 되도록 한다. 예: .section .text .section .data .end Assembly 프로그램의 끝을 표시 한다. .include “file” 현재의 위치에 “file”에 주어진 이름의 Source Program이 오도록 한다. KyungHee Univ. 2-21 Type of Subroutine Relocatable Code는 Memory의 어느 위치에나 올 수 있다. 그러나, Code가 놓여지는 시작 번지 또는 Relocation constant 를 더 해주기 위한 Relocating Loader 가 필요 하다. Position Independent Relocating Loader 가 필요 하지 않다. 모든 프로그램내의 주소는 PC의 상대 번지로 주어 진다. Reentrant Subroutine이 실행 도중 Interrupting Program에 의하여 Interrupt 되어 Interrupt routine를 실행 하여도 언제나 올바른 실행 결과를 보장 할 수 있다. Reeentrant Subroutine은 Data 저장 장소로 Rg와 Stack(Local variable) 만을 사용 하여야 한다. Global variable를 사용 하여서는 안된다. Recursive 자기 자신을 call 할 수 있는 Subroutine 으로 , 당연히 Reentrant 한 routine이어야 한다. KyungHee Univ. 2-22 Subroutine Documentation 대부분의 프로그램은 Main 프로그램과 반복 사용이 가능한 다수의 Subroutine으로 구성 된다. Subroutine를 효과적으로 사용하기 위하여는 아래와 같은 내용을 포함하는 잘 정리된 Documentation이 필요 하다. KyungHee Univ. Subroutine의 목적 Input / Output Parameter의 List 사용 되는 Register와 Memory Location Sample calling sequence를 포함하는 사용 예 2-23 Type of Parameter Pass-by-value 실제 값이 전달 된다. 소 규모 데이터 전달에 유리 하다. Pass-by-reference Parameter List의 주소(Pointer)가 전달 된다. 대규모 배열형 데이터 전달에 유리 하다. 결과가 직접 해당 변수에 저장 될 수 있다. KyungHee Univ. 2-24 Parameter Passing Techniques uP 내부 Register 를 이용 장점 속도가 빠르다. 단점 Hardware에 종속 적이다. Passing 할 수 있는 Parameter 의 수가 작다. Stack를 이용 중간 규모의 Parameter를 전달 하는데 유리. 알고리즘이 uP에 종류에 독립적이다. Memory Block과 Pointer를 이용 Array 형태의 대규모 Data를 전달 하는데 유리 함. KyungHee Univ. 2-25 Parameter Passing Techniques uP 내부 Register 를 이용 하는 예 .section .data .ORG 0x0100 BufferLen: .word 123 ptBufferA: .word BufferA ptBufferB: .word BufferB .section .text ldi r29, hi8(BufferLen) ; Y Pointer 에 BufferLen 시작 번지를 저장 ldi r28, lo8(BufferLen) ; Y Pointer 에 BufferLen 시작 번지를 저장 ldi r24, Y+ ; Rg24 <- BufferLen의 LSD를 저장 ldi r25, Y+ ; Rg25 <- BufferLen의 MSD를 저장 ldi r26, Y+ ; X Pointer 에 BufferA 시작 번지를 저장 ldi r27, Y+ ; X Pointer 에 BufferA 시작 번지를 저장 ldi r30, Y+ ; Y Pointer 에 BufferB 시작 번지를 저장 ldi r31, Y ; Y Pointer 에 BufferB 시작 번지를 저장 Call subr Program 예 : AVR_asm_param_pass_Rg_add.zip KyungHee Univ. 2-26 Parameter Passing Techniques Stack이용 하는 예 Calling Program .section .data .ORG 0x0100 BufferLen: .word 123 ptBufferA: .word BufferA ptBufferB: .word BufferB .section .text ldi r16, 6 ldi ZH, hi8(BufferLen) ; Z Pointer 에 BufferLen 시작 번지를 저장 l야 ZL, lo8(BufferLen) ; Z Pointer 에 BufferLen 시작 번지를 저장 LOOP1: ld r24, Z+ ; Pass 할 Parameter의LSD를 Load 하여 push r24 ; Stack 에 저장 dec r16 ; 모든 Parameter를 Stack 에 저장 brne LOOP1 ; 하지 않았으면 LOOP1으로 Jmp KyungHee Univ. 2-27 Parameter Passing Techniques Stack이용 하는 예 rcall Subr in ZL, SPL in ZH, SPH adiw Z, 6 ; Parameter Pass에 사용 한 Stack 영역을 out SPL, ZL ; 되돌려 준다 out SPH, ZH LOOP2: rjmp LOOP2 KyungHee Univ. 2-28 Parameter Passing Techniques Stack을 이용 하는 예 Subroutine Subr: in ZL, SPL ; Z를 Frame pointer로 설정(Z <- SP) 한다. in ZH, SPH adiw Z, 3 ; Z 가 Stack 에 저장된 Parameter의 위치를 Pointing 한다. ld YH, Z+ ; BufferB의 번지를 Y에 Load ld YL, Z+ ld XH, Z+ ; BufferA의 번지를 X에 Load ld XL, Z+ ld r24, Z+ ; BufferLen를 r25:r24에 Load ld r25, Z --; 필요한 연산를 한다. ret Program 예 : AVR_asm_param_pass_stack_add.zip KyungHee Univ. 2-29 Parameter Passing Techniques Memory Block과 Pointer를 이용 하는 예 AVR_asm_data_pass_memory_add_long.zip KyungHee Univ. 2-30 Program Example 참고자료 : Assembly Programming by Peter Knaggs_9658.pdf KyungHee Univ. 2-31 2.2.10 Branch Operatiuon Flowchart of a while structure While 문의 Assembly coding Loop: in AC0, PINA andi AC0, #01 ; look at just PINA0 breq loop ; continue when PA0 is 1 KyungHee Univ. 2-32 2.2.10 Branch Operatiuon 대표적인 Branch 프로그램 구조 DO KyungHee Univ. while while 2-33 2.2.10 Branch Operatiuon 구조체를 이용한 대표적인 프로그램 구조 1 차원 자료 처리 2 차원 자료 처리 3 차원 자료 처리 KyungHee Univ. 2-34 2.2.12 Memory Allocation Intel x86 Segmented Memory allocation Segment Rg를 이용한 Memory allocation KyungHee Univ. 2-35 2.2.12 Memory Allocation KyungHee Univ. 2-36 Reset and Interrupt Handling AVR 은 여러 개의 다른 Interrupt sources를 갖고 있다. Interrupts 과 Reset vector 각각 분리된 Program vector를 Program memory space에 갖는다. All interrupts은 각각 Interrupt Enable Bits 를 갖는다. Interrupt Enable Status Register 에 Global Interrupt Enable Bit와 해당 Interrupt의 Enable Bits 가 Enable 되어야 한다. AVR에서는 Program memory space의 Lowest addresses에 Reset 과 Interrupt vectors Table이 위치 한다. Lower address에 위치한 Interrupt이 Higher priority 를 갖는다. RESET 이 가장 높은 Priority를 갖는다. KyungHee Univ. 2-37