390 likes | 965 Views
Chapter 2 Assembly Language Programming. AVR Instructions. AVR has 133 different instructions Instruction Types Data Transfer Arithmetic and Logic Control Transfer (branch/jump) Bit and bit-test Processor Control. Data Transfer Instructions (1).
E N D
AVRInstructions • AVR has 133 different instructions • Instruction Types • Data Transfer • Arithmetic and Logic • Control Transfer (branch/jump) • Bit and bit-test • Processor Control
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 65535
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
Data Transfer Instructions (3) • IN/OUT - input/output • IN Rd, A • OUT A, Rr • PUSH/POP - stack operations • PUSH Rr • POP Rd
Data Transfer Examples (1) • LD Rd, Y • LD R16, Y; R16 ← M(Y) • Y is implied in the opcode • LDI Rd, K • LDI R30, 0xF0; R30 ← 0xF0 (hexadecimal) • Destination register can only be R16-R31 • 8 bit constant K (0 ≤ K ≤ 255) 10000 0000 1111
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) • IN Rd, A • 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. qqqqqq=000010 00100 0110 01
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
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
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. rrrrr = 10000 ddddd = 01111
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
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 => Address range => -64 ≤ k ≤ +63 0100101
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
Jump Example • Example • Subroutines are implemented using CALL and RET • 0230 CALL SUBR • 0232 next inst. • 03F0 SUBR: … • {my subroutine} • … • RET • CALL is 32-bit instruction qqqqqq=000010
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
Other Instructions • NOP ; Do nothing for 1 cycle • SLEEP ; Sleep until reset or interrupted • WDR ; Reset Watch Dog Timer
AVR Assembly DirectivesCalled pseudo opcodes • ORG: tells the assembler where to put the instructions that follow it. • .ORG 0x37 • EXIT: tells the assembler to stop assembling the file • .EQU: Assigns a value to a label. • Syntax: .EQU label = expression • .EQU io_offset = 0x23 • BYTE: reserves memory in data memory • Syntax: LABEL: .BYTE expression • var: .BYTE 1 • DB: Allows arbitrary bytes to be placed in the code. • Syntax: LABEL: .DB expressionlist • consts: .DB 0, 255, 0b01010101, -128, 0xaa" • Text: .DB “This is a text.” • DW: Allows 16-bit words to be placed into the code • Syntax: LABEL: .DW expressionlist • varlist: .DW 0,0xffff,0b1001110001010101,-32768,65535
AVR Assembly Language Programming 예Addition of 2 Numbers • ProgramSourceCode Line은 아래 4가지 형태 중 하나임. [Label] Field : Directive : [Operand] : [Comment] [Label] Field : Instruction : [Operand] : [Comment] Comment Empty line .include "m128def.inc" .CSEG .ORG $0000 start: ldi ZL,low(Nums<<1) ; Program memory는 Word(16Bit) 단위 ldi ZH,high(Nums<<1) ; Word Addressing을 Byte Addressing으로 변환 clr R0 ; Accumulate the result in R0 lpm R2,Z+ ; Load data to R2 and post inc. pointer add R0, R2 ; Add R2 to R0 lpm R2,Z+ ; Load data to R2 and post inc. pointer adc R0, R2 ; Add R2 to R0 Done: jmp Done ; Done. Loop forever. Nums: .DB 4, 8
Label Field • Label 끝에는 colon( : ) 이 따른다. • A-Z, a-z, 0-9, 특수문자( . $ _ ) 를 사용 할 수 있다. • 각 Label은 프로그램내에서 한번 정의 되는 것이 원칙이다. • 그러나, 다음의 경우에는 예외로 한번 이상 정의 될 수 있다. • Set pseudo 명령에 의하여 같은 Symbol이 재 정의 되는 경우 • Label은 명령어 또는 Data의 첫 시작 번지를 지시 한다. Comments • ; 다음에 Comment 문을 쓴다. • Ex) ; This line is also a comment • /* 와 */ 사이에 Comment 문을 쓴다. • Ex) /* comment */ • Comment 는 Assembler에 의하여 무시된다.
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 과 대응 되지 않는다.)
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 단위로 데이터를 저장한다.
GNU Assemler의 중요 Directives • .section name 다음에 오는 Code 가 name section 영역에 할당 되도록 한다. • .end Assembly 프로그램의 끝을 표시 한다. • .include “file” 현재의 위치에 “file”에 주어진 이름의 Source Program이 오도록 한다.
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이어야 한다.
Subroutine Documentation • 대부분의프로그램은 Main 프로그램과 반복사용이 가능한 다수의 Subroutine으로 구성 된다. • Subroutine를 효과적으로 사용하기 위하여는 아래와 같은 내용을 포함하는 잘 정리된 Documentation이 필요 하다. • Subroutine의 목적 • Input / Output Parameter의 List • 사용되는 Register와 Memory Location • Sample calling sequence를 포함하는 사용 예
Type of Parameter • Pass-by-value • 실제값이 전달 된다. • 소 규모 데이터 전달에 유리 하다. • Pass-by-reference • ParameterList의 주소(Pointer)가 전달 된다. • 대규모 배열형 데이터 전달에 유리 하다. • 결과가 직접 해당 변수에 저장 될 수 있다. • Pass-by-name • Parameter의 이름이 전달 된다. • Very High Lever language 나 Scripting 언어 에서 이용 된다. • 융통성이 크지만 비효율적 이다.
ParameterPassing Techniques • uP내부 Register 를 이용 • 장점 • 속도가 빠르다. • 단점 • Hardware에 종속 적이다. • Passing 할수 있는 Parameter 의 수가 작다. • Stack를 이용 • 중간 규모의 Parameter를 전달 하는데 유리. • 알고리즘이 uP에 종류에 독립적이다. • Memory Block과 Pointer를 이용 • Array 형태의 대규모 Data를 전달 하는데 유리 함.
ParameterPassing Techniques • uP내부 Register 를 이용 하는 예 .section .data .ORG 0x0100 BufferLen: .word 123 ptBufferA: .word BufferA ptBufferB: .word BufferB .section .text ldir29, hi8(BufferLen) ; Y Pointer 에 BufferLen시작 번지를 저장 ldir28, lo8(BufferLen) ; Y Pointer 에 BufferLen시작 번지를 저장 ldir24, Y+ ; Rg24 <- BufferLen의 LSD를 저장 ldi r25, Y+ ; Rg25 <- BufferLen의 MSD를 저장 ldi r26, Y+ ; XPointer 에 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
ParameterPassing 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) ; Y Pointer 에 BufferLen시작 번지를 저장 ldi ZL, lo8(BufferLen) ; Y Pointer 에 BufferLen시작 번지를 저장 LOOP1: ldr24, Z+ ; Pass 할 Parameter의LSD를 Load 하여 push r24 ; Stack 에 저장 dec r16 ; 모든 Parameter를 Stack 에 저장 brne LOOP1 ; 하지않았으면 LOOP1으로 Jmp
ParameterPassing Techniques • Stack이용 하는 예 rcallSubr in ZL, SPL in ZH, SPH adiw Z, 6 ; Parameter Pass에 사용 한 Stack 영역을 out SPL, ZL ; 되돌려 준다 out SPH, ZH LOOP2: rjmp LOOP2
ParameterPassing 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+ ; BufferB의번지를 Y에 Load ld XL, Z+ ld r24, Z+ ; BufferLen를 r25:r24에 Load ld r25, Z --- ; 필요한 연산를 한다. ret • Program 예 : AVR_asm_param_pass_stack_add.zip
ParameterPassing Techniques • Memory Block과 Pointer를 이용 하는 예 • AVR_asm_data_pass_memory_add_long.zip
ProgramExample 참고자료 : Assembly Programming by Peter Knaggs_9658.pdf
2.2.10 Branch Operatiuon • Flowchart of a while structure • While 문의 Assembly coding • Loop: in AC0, PINA • andi AC0, #01 ; look at just PINA0 • brneloop ; continue when PA0 is 1
2.2.10 Branch Operatiuon • 대표적인 Branch 프로그램 구조 while DO while
2.2.10 Branch Operatiuon • 구조체를 이용한 대표적인 프로그램 구조 1 차원 자료 처리 2 차원 자료 처리 3 차원 자료 처리
2.2.12 Memory Allocation • Intel x86 Segmented Memory allocation Segment Rg를 이용한 Memory allocation
Reset and Interrupt Handling • AVR 은여러 개의 다른 Interrupt sources를갖고 있다. • Interrupts 과 Reset vector 각각 분리된 Program vector를 Program memory space에 갖는다. • All interrupts은 각각 Interrupt Enable Bits 를 갖는다. • InterruptEnable • 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를 갖는다.