Download Document

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
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
Related documents