1 / 38

Chapter 2 Assembly Language Programming

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).

Faraday
Download Presentation

Chapter 2 Assembly Language Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 2Assembly Language Programming

  2. AVRInstructions • AVR has 133 different instructions • Instruction Types • Data Transfer • Arithmetic and Logic • Control Transfer (branch/jump) • Bit and bit-test • Processor Control

  3. 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

  4. 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

  5. Data Transfer Instructions (3) • IN/OUT - input/output • IN Rd, A • OUT A, Rr • PUSH/POP - stack operations • PUSH Rr • POP Rd

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. Other Instructions • NOP ; Do nothing for 1 cycle • SLEEP ; Sleep until reset or interrupted • WDR ; Reset Watch Dog Timer

  17. 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

  18. 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

  19. 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에 의하여 무시된다.

  20. 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 과 대응 되지 않는다.)

  21. 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 단위로 데이터를 저장한다.

  22. GNU Assemler의 중요 Directives • .section name 다음에 오는 Code 가 name section 영역에 할당 되도록 한다. • .end Assembly 프로그램의 끝을 표시 한다. • .include “file” 현재의 위치에 “file”에 주어진 이름의 Source Program이 오도록 한다.

  23. 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이어야 한다.

  24. Subroutine Documentation • 대부분의프로그램은 Main 프로그램과 반복사용이 가능한 다수의 Subroutine으로 구성 된다. • Subroutine를 효과적으로 사용하기 위하여는 아래와 같은 내용을 포함하는 잘 정리된 Documentation이 필요 하다. • Subroutine의 목적 • Input / Output Parameter의 List • 사용되는 Register와 Memory Location • Sample calling sequence를 포함하는 사용 예

  25. Type of Parameter • Pass-by-value • 실제값이 전달 된다. • 소 규모 데이터 전달에 유리 하다. • Pass-by-reference • ParameterList의 주소(Pointer)가 전달 된다. • 대규모 배열형 데이터 전달에 유리 하다. • 결과가 직접 해당 변수에 저장 될 수 있다. • Pass-by-name • Parameter의 이름이 전달 된다. • Very High Lever language 나 Scripting 언어 에서 이용 된다. • 융통성이 크지만 비효율적 이다.

  26. ParameterPassing Techniques • uP내부 Register 를 이용 • 장점 • 속도가 빠르다. • 단점 • Hardware에 종속 적이다. • Passing 할수 있는 Parameter 의 수가 작다. • Stack를 이용 • 중간 규모의 Parameter를 전달 하는데 유리. • 알고리즘이 uP에 종류에 독립적이다. • Memory Block과 Pointer를 이용 • Array 형태의 대규모 Data를 전달 하는데 유리 함.

  27. 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

  28. 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

  29. 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

  30. 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

  31. ParameterPassing Techniques • Memory Block과 Pointer를 이용 하는 예 • AVR_asm_data_pass_memory_add_long.zip

  32. ProgramExample 참고자료 : Assembly Programming by Peter Knaggs_9658.pdf

  33. 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

  34. 2.2.10 Branch Operatiuon • 대표적인 Branch 프로그램 구조 while DO while

  35. 2.2.10 Branch Operatiuon • 구조체를 이용한 대표적인 프로그램 구조 1 차원 자료 처리 2 차원 자료 처리 3 차원 자료 처리

  36. 2.2.12 Memory Allocation • Intel x86 Segmented Memory allocation Segment Rg를 이용한 Memory allocation

  37. 2.2.12 Memory Allocation

  38. 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를 갖는다.

More Related