You are on page 1of 14

NHÓM LỆNH DI CHUYỂN DATA

;****************************************************************************************
;DI CHUYỂN DATA TRONG VÙNG GPRs(Ri:i=0-31)
;****************************************************************************************
;LDI Rd,K{d=16-31; K=0-255(FF)}: sử dụng PP định địa chỉ thanh ghi đơn{T.ghi-tức thời}
;MOV Rd,Rr{d,r:i=0-31}: sử dụng PP định địa chỉ thanh ghi
;MOVW Rd,Rr{d,r:i=0,2,.28,30}: sử dụng PP định địa chỉ thanh ghi

LDI R16,$AB ;R16=ABH


LDI R17,$CD ;R17=CDH
LDI R18,$EE ;R18=EEH
LDI R19,$FF ;R19=FFH
MOV R0,R16 ;R0=R16=$AB
MOVW R2,R18 ;R2=R18=$EE, R3=R19=$FF
MOVW R5:R4,R19:R18 ;R4=R18=$EE,R5=R19=$FF

;****************************************************************************************
;DI CHUYỂN DATA TRONG VÙNG I/O CƠ BẢN
;phải sử dụng các GPRs làm toán hạng trung gian
;****************************************************************************************
;IN Rd,P {d:0-31}: sử dụng PP định địa chỉ trực tiếp IO{hoặc T.ghi-IO}
;OUT P,Rr{r:0-31}: sử dụng PP định địa chỉ trực tiếp IO{hoặc T.ghi-IO}
;P:0-63(3FH: địa chỉ IO)
;toán hạng P có thể là tên của SFRs thuộc vùng IO cơ bản hoặc địa chỉ I/O tương ứng
;****************************************************************************************
LDI R16,0
OUT DDRB,R16 ;thiết lập PORTB-> nhập
LDI R16,$FF
OUT DDRB,R16 ; PORTB có điện trở kéo lên
OUT DDRA,R16 ;thiết lập PORTA-> xuất,dùng lệnh OUT 0x01,R16 cũng có KQ tương tự
LDI R17,$AA
OUT PORTA,R17 ;PORTA=$AA, {OUT 0X02,R17}
IN R18,PINA ;đọc dữ liệu từ PORTB vào R18 {IN R18,O}
;****************************************************************************************
;DI CHUYỂN DATA TRONG VÙNG DATA_SRAM
;phải sử dụng các GPRs làm toán hạng trung gian
;VÙNG DATA_SRAM:$100-$8FF
;****************************************************************************************
;LỆNH STS,LDS: sử dụng PP định địa chỉ trực tiếp vùng DATA_SRAM{Trực tiếp DATA}
;LỆNH ST,LD:
;- sử dụng PP định địa chỉ gián tiếp khi các toán hạng là(X,Y,Z) & Ri{Gián tiếp DATA}
;- sử dụng PP định địa chỉ gián tiếp với tiền tố trừ khi các toán hạng là (-X,-Y,-Z) & Ri
;  tác vụ thực thi giống PP tự động giảm đã học ở chương 1. .{ Gián tiếp,con trỏ -1}
;- sử dụng PP định địa chỉ gián tiếp với hậu tố + khi các toán hạng là (X+,Y+,Z+) & Ri
;  tác vụ thực thi giống PP tự động tăng đã học ở chương 1.{ Gián tiếp,con trỏ +1}
;LỆNH STD,LDD: sử dụng PP định địa chỉ gián tiếp với 1 độ dời với các toán hạng là
;(Y/Z+q,Y/Z+q) & Ri  tác vụ thực thi giống PP chỉ số đã học ở chương 1.
;{ Gián tiếp tại địa chỉ con trỏ +q, con trỏ giữ nguyên}
;****************************************************************************************

STS $100,R16 ;($100) <-- R16


LDS R21,$100 ;R21 <-- ($100)

LDI XH,HIGH($100) ;LDI XH,$1 LDI XH,1 LDI XH,0b1


LDI XL,LOW($100) ;LDI XL,0 --> X=$100
ST X,R17 ;X=$100, ($100) <-- R17

LDI YH,HIGH($101) ;Y=$101

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 1
LDI YL,LOW($101) ;
ST Y+,R17 ;($101)<-- R17, Y=$102
ST -Y,R18 ;Y=$101, ($101)<-- R18
STD Y+3,R19 ;($104)<-- R19, Y=$101

LD R22,Y ;R22 <--($101), Y=$101


LDI ZH,HIGH($102) ;Z=$102
LDI ZL,LOW($102) ;

LD R23,Z+ ;R23<--($102),Z=$103
LD R24,-Z ;Z=$102, R24<--($102)
LDD R25,Z+5 ;R25<--($107) ,Z=$102
;****************************************************************************************
;Các SFRs thuộc vùng IO mở rộng được xem là 1 ô nhớ trong SRAM
;phải sử dụng các lệnh di chuyển của DATA_SRAM để thao tác
;có thể dùng với toán hạng là tên t.ghi SFRs hoặc địa chỉ MEM tương ứng
;các SFRs mở rộng không thể sử dụng các lệnh IN,OUT vì không có địa chỉ IO tương ứng.
;các SFRs cơ bản có thể sử dụng các lệnh của vùng DATA_SRAM để thao tác nhưng toán hạng
;trong lệnh phải là địa chỉ MEM tương ứng không được dùng theo tên SFRs.
;****************************************************************************************
LDI R16,$FF
LDI R17,$CC

STS ADCL,R16 ; t.ghi ADCL <--R16


STS $78,R17 ;lệnh tương đương vì ADCL có địa chỉ:$78(MEM)

STS $24,R16 ;DDRB:$24(MEM_ADDR),$4(I/O_ADDR)


STS $25,R17 ;PORTB:$25(MEM_ADDR),$5(I/O_ADDR)
LDS R18,$23 ;PINB:$23(MEM_ADDR),$3(I/O_ADDR)

;****************************************************************************************
;VÙNG STACK hoạt động theo nguyên tắc LIFO-Last In First Out.
;thường phải khởi động cho SP chứa địa chỉ cao nhất(RAMEND) của vùng STACK tương ứng với
;loại chip sử dụng. Riêng MCU324P có giá trị ban đầu SP=RAMEND(8FFH).
;LỆNH PUSH Rr{r:0-31}: sử dụng pp định địa chỉ t.ghi đơn. Cất dữ liệu từ Rr vào stack.
;LỆNH POP Rd{d:0-31}: sử dụng pp định địa chỉ t.ghi đơn. Lấy dữ liệu từ stack vào Rr.
;****************************************************************************************

LDI R18,$18
LDI R19,$19
LDI R20,$20
LDI R21,$21

LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16

PUSH R18 ;cất nội dung R18 vào (SP){(8FFH)<--R18}, SP-1 -->SP=8FEH
PUSH R19 ;cất nội dung R19 vào (SP){(8FEH)<--R19}, SP-1 -->SP=8FDH
PUSH R20 ;cất nội dung R20 vào (SP){(8FDH) <--R20}, SP-1 -->SP=8FCH
PUSH R21 ;cất nội dung R21 vào (SP){(8FCH) <--R21}, SP-1 -->SP=8FBH
POP R18 ;SP+1 -->SP=8FCH, lấy lại nội dung từ (SP) cất vào R18 {R18<--(FCH)}
POP R19 ;SP+1 -->SP=8FDH, lấy lại nội dung từ (SP) cất vào R19 {R19<-- (FDH)}
POP R20 ;SP+1 -->SP=8FEH, lấy lại nội dung từ (SP) cất vào R20 {R20<-- (FEH)}
POP R21 ;SP+1 -->SP=8FFH, lấy lại nội dung từ (SP) cất vào R21 {R21<-- (FFH)}

;****************************************************************************************

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 2
;Cách tạo mảng data trong vùng FLASH bắt đầu từ địa chỉ $20
;****************************************************************************************
.org $20
DATA1: .DB 1,2,"AB",'C','D'
DATA2: .DW 'a',$ABCDEF
DATA3: .DD 'b'
DATA4: .DQ $FF
;Cách tạo mảng data trong vùng FLASH bắt đầu từ địa chỉ đặt tại nhãn là MYDATA
;****************************************************************************************
MYDATA: .DB 1,2,"AB",'C','D'

;****************************************************************************************
;C\C LỆNH LẤY DATA trong vùng FLASH
;LPM: lệnh không có toán hạng, sử dụng pp định địa chỉ gián tiếp vùng FLASH {Gián tiếp,
;truy xuất data trong vùng FLASH}
;mặc định DATA lấy được sẽ lưu vào R0, địa chỉ của ô nhớ phải đặt vào t.ghi Z
;LPM Rd,Z {Rd  (Z)}
;LPM Rd,Z+{Rd  (Z), Z<--Z+1}
;****************************************************************************************

;****************************************************************************************
;VD: Lấy nội dung byte thấp có địa chỉ $20(Z=$40) trong vùng Flash
;****************************************************************************************
LDI ZH,HIGH($20<<1)
LDI ZL,LOW($20<<1)
LPM ;R0=nội dung byte thấp

;****************************************************************************************
;VD: Lấy nội dung byte cao có địa chỉ $20(Z=$41) trong vùng Flash
;****************************************************************************************
LDI ZH,HIGH(($20<<1)|1)
LDI ZL,LOW(($20<<1)|1)
LPM ;R0=nội dung byte cao

;****************************************************************************************
;VD: đọc byte thấp có địa chỉ $22($44) trong vùng Flash cất vào R17
;****************************************************************************************
LDI ZH,HIGH($22<<1)
LDI ZL,LOW($22<<1)
LPM R17,Z ;R17=4DH='M',Z=44H

;****************************************************************************************
;VD: đọc byte cao có địa chỉ $22($45) trong vùng Flash cất vào R17
;sử dụng pp định địa chỉ gián tiếp với hậu tố +
;****************************************************************************************
LDI ZH,HIGH(($22<<1)|1)
LDI ZL,LOW(($22<<1)|1) ;Z=45H
LPM R17,Z+ ;R17=4EH='N',Z=46H

NHÓM LỆNH SỐ HỌC


;****************************************************************************************
;PHÉP CỘNG:ADD, ADC, ADIW
;ADD Rd,Rr {Rd <--Rd+Rr,(d,r:0-31)}: sử dụng pp định địa chỉ thanh ghi
;ADC Rd,Rr {Rd <--Rd+Rr+C,(d,r:0-31)}: sử dụng pp định địa chỉ thanh ghi
;Cờ bị tác động: H,S,V,N,Z,C
;****************************************************************************************
LDI R16,$9C ;R16=1001 1100B(-100)
LDI R17,$64 ;R17=0110 0100B(100)
ADD R16,R17 ;R16 <--R16+R17

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 3
;KQ:R16=0000 0000B(0) --> H=Z=C=1,S=V=N=0
;có carry từ bit3--> H=1,có carry từ bit7--> C=1
;số dương là kết quả đúng --> S=N=0
;phép toán không bị tràn--> V=0
;kết quả bằng 0--> Z=1

LDI R16,$9E ;R16=1001 1110B(-98)


LDI R17,$9F ;R17=1001 1111B(-99)
ADC R16,R17 ;R16 <-- R16+R17+C
;KQ:R16=0110 1110B(+62)--> H=S=V=C=1,N=Z=0
;có carry từ bit3 --> H=1,có carry từ bit7--> C=1
;số âm là KQ đúng  S=1,N=0 --> sai dấu
;KQ sai do vượt quá phạm vi biểu diễn--> V=1(tràn)
;KQ khác 0 --> Z=0

;****************************************************************************************
;ADIW Rd+1:Rd,K {Rd+1:Rd <-- (Rd+1:Rd) +K,(d:24,26,28,30),(K=0-63)}
;hoặc sử dụng cú pháp ADIW Rdl,K
;sử dụng pp định địa chỉ thanh ghi đơn{T.ghi-tức thời}
;Cờ bị tác động: S,V,N,Z,C
;****************************************************************************************

LDI ZH,HIGH($100) ;
LDI ZL,LOW($100) ; --> Z=$100

;****************************************************************************************
;Xóa các cờ trong SREG
;****************************************************************************************
LDI R20,0
OUT SREG,R20
ADIW R31:R30,50 ; ADIW R30,50, ADIW Z,50, ADIW ZL,50
; Z <-- Z+50
;KQ: Z=0000 0001 0011 0010B($132)--> S=V=C=N=Z=0

;****************************************************************************************
; CLC: xóa cờ C, SEC: đặt cờ C
;****************************************************************************************

;****************************************************************************************
;PHÉP TRỪ:SUB, SUBI, SBC, SBCI, SBIW
;SUB Rd,Rr {Rd=Rd-Rr, (d,r:0-31)}
;SUBI Rd,K {Rd=Rd-K,(d:16-31),(K:0-255)}
;SBC Rd,Rr {Rd=Rd-Rr-C,(d,r:0-31)}
;SBCI Rd,K {Rd=Rd-K-C,(d:16-31),(K:0-255)}
;Cờ bị tác động: H,S,V,N,Z,C
;****************************************************************************************
LDI R16,$3F ;R16=0011 1111B(+63)
LDI R17,$23 ;R17=0010 0011B(+35)
MOV R1,R17
SUB R16,R1 ;R16= 0011 1111B
; + 1101 1101B(bù 2 của $23)
; =1 0001 1100B(+98)
;sau phép trừ CPU tự lấy bù cờ C & H
;KQ=R16=0001 1100 --> H=S=V=N=Z=C=0
;có carry từ bit 3 và bit 7 --> H=C=1
;do CPU tự lấy bù sau phép trừ --> H=C=0
;số dương là KQ đúng --> S=N=0
;phép toán không bị tràn --> V=0
; KQ khác 0 --> Z=0

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 4
SUBI R17,$81 ;R17=0010 0011B(+35),$81=1000 0001B=-127
;R17 <-- R17- 1000 0001B
; 0010 0011B
; + 0111 1111B(bù 2 của $81)
; =0 1010 0010B(-94)
;KQ=R17= 1010 0010B --> S=Z=0, C=V=N=1
;có carry từ bit 3 --> H=1, không có carry từ bit 7 --> C=0
;CPU tự lấy bù --> H=0, C=1
;số dương mới là KQ đúng --> S=0, N=1 --> sai dấu
;phép toán bị tràn --> V=1
;KQ khác 0 --> Z=0

SBC R16,R1 ;R16=1CH(+28),R1=23H(+35)


;R16 <-- R16–R1–C
;KQ=R16= 1111 1000B(-8) --> C=S=N=1, H=V=Z=0
SBCI R16,10 ;R16 <--R16-K-C
;KQ=R16=1110 1101B(-19) --> H=S=N=1, C=V=Z=0

;****************************************************************************************
;SBIW Rd+1:Rd,K {Rd+1:Rd <-- (Rd+1:Rd)-K,(d:24,26,28,30),(K=0-63)}
;hoặc sử dụng cú pháp SBIW Rdl,K
;Cờ bị tác động: S,V,N,Z,C
;****************************************************************************************

LDI R24,50
SBIW R24,25 ;R25:R24 <-- R25:R24 -25
;KQ=R25:R24 =0000 0000 0001 1001B(25) --> S=N=C=V=Z=0

SBIW Z,63 ;ZR31:R30 <-- R31:R30 -63


;KQ=Z=1111 1111 1100 0001B(-63) --> C=S=N=1, V=Z=0
;****************************************************************************************
;Xóa các cờ trong SREG
;****************************************************************************************
LDI R20,0
OUT SREG,R20

;****************************************************************************************
;PHÉP TĂNG,GIẢM:INC, DEC
;INC Rd {Rd <--Rd+1, (d,r:0-31)}
;DEC Rd {Rd <--Rd-1,(d:16-31) }
;Cờ bị tác động: S,V,N,Z
;****************************************************************************************
LDI R16,$80 ;(-128)
DEC R16 ;R16 <-- R16-1
;KQ=R16=0111 1111B(+127) --> S=V=1, N=Z=0
INC R1 ;R1 <-- R1+1
DEC R1
DEC R1 ;Lưu ý cả 2 lệnh này đều không ảnh hưởng đến cờ C
;kiểm tra với giá trị của R16 ban đầu là FFH(lệnh INC)
;hoặc 0 (lệnh DEC)

;****************************************************************************************
;PHÉP NHÂN:MUL,MULS,MULSU - FMUL,FMULS,FMULSU
;****************************************************************************************
; Rd*Rr --> KQ= R1(BYTE_CAO):R0(BYTE_THẤP)
;MUL Rd,Rr {Rd=Rd*Rr, (d,r:0-31)} – Rd,Rr:UNSIGNED
;MULS Rd,Rr {Rd=Rd*Rr,(d,r:16-31) } – Rd,Rr:SIGNED
;MULSU Rd,Rr {Rd=Rd*Rr,(d,r:16-31) } – Rd:SIGNED,Rr:UNSIGNED
;FMUL Rd,Rr {Rd=Rd*Rr, (d,r:16-23)} – Rd,Rr:UNSIGNED

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 5
;FMULS Rd,Rr {Rd=Rd*Rr,(d,r:16-23) } – Rd,Rr:SIGNED
;FMULSU Rd,Rr {Rd=Rd*Rr,(d,r:16-23) } – Rd:SIGNED,Rr:UNSIGNED
;Cờ bị tác động: Z,C=bit D7 của byte cao kết quả
;****************************************************************************************
LDI R16,$8F ;R16=143
LDI R17,$0F ;R17=15
MUL R16,R17 ;KQ=R1:R0=0861H(2145), R16=8FH(15),R17=0FH(143)
MOVW R20,R0 ;R21:R20=0861(2145)

MULSU R16,R17 ;R16=-113, R17=+15 --> R1:R0=F961H(-1695)


MOVW R22,R0 ;R23:R22=F961(-1695)

LDI R17,$F1 ;R17=-15


MULS R16,R17 ;R16=-113--> R1:R0=069FH(+1695)
MOVW R24,R0 ;R25:R24=069F(+1695)

LDI R16,$60 ;R16=0.110 0000B (0.75)


LDI R17,$20 ;R17=0.010 0000B (0.25)
FMUL R16,R17 ;R1:R0=1800H
MOVW R20,R0 ;R21:R20=0.001 1000 0000 0000(0.1875)

LDI R16,$E0 ;R16=1.110 0000(-0.25),R17=0.010 0000B (0.25)


FMULSU R16,R17 ;R1:R0=F800H
MOVW R22,R0 ;R23:R22=1.111 1000 0000 0000(-0.0625)

LDI R17,$E0 ;R16=R17=-0.25


FMULS R16,R17 ;KG=R1:R0=0800H
MOVW R24,R0 ;R25:R24=0.000 1000 0000 0000(+0.0625)

NHÓM LỆNH LOGIC


;****************************************************************************************
;THỰC HIỆN CÁC PHÉP TOÁN AND,OR, XOR,BÙ 1, BÙ 2, ĐẶT/XÓA, K.TRA TRÊN NHÓM CÁC T.GHI GPRs
;****************************************************************************************
;AND Rd,Rr {Rd<--Rd & Rr, (d,r:0-31) }
;ANDI Rd,K {Rd<--Rd & K, (d:16-31), (K:0-255)}
;OR Rd,Rr {Rd<--Rd|Rr, (d,r:0-31) }
;ORI Rd,K {Rd=Rd | K, (d:16-31), (K:0-255)}
;EOR Rd,Rr {Rd=Rd  Rr, (d:16-31)}
;Cờ bị tác động: S,N,Z,V=0
;****************************************************************************************

LDI R16,$0F ;
LDI R17,$0 ;
LDI R18,$AA ;
LDI R19,$CC ;
AND R16,R18 ;R16 <-- R16 & R18 , S,N,Z,V?
ANDI R16,$FF ;R16 <-- R16 & FFH
OR R17,R18 ;R17 <-- R17 | R18
ORI R17,$EE ;R17 <-- R17 | EE
EOR R18,R17 ;R18 <-- R18  R17

;****************************************************************************************
;LẤY BÙ 1
;COM Rd {Rd<-- $FF- Rd }
;Cờ bị tác động: S,N,Z,V=0,C=1
;****************************************************************************************

LDI R18,$AA ;
COM R18

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 6
;****************************************************************************************
;LẤY BÙ 2
;NEG Rd {Rd=$00-Rd}
;Cờ bị tác động:H,S,V,N,Z,C
;****************************************************************************************

LDI R18,$BB ;
NEG R18
;****************************************************************************************
;XÓA TO[N BỘ THANH GHI
;CLR Rd {Rd=RdRd, (d:0-31)}
;Cờ bị tác động:S=N=V=0,Z=1
;****************************************************************************************

CLR R19

;****************************************************************************************
;ĐẶT TO[N BỘ CÁC BIT TRONG THANH GHI LÊN 1
;SER Rd {Rd=$FF, (d:16-31)}
;Cờ bị tác động:không có
;****************************************************************************************

SER R19

;****************************************************************************************
;ĐẶT/XÓA 1 SỐ BIT TRONG THANH GHI
;SBR Rd,K {Rd=Rd|K,(d:16-31, K:0-255)}
;CBR Rd,K {Rd=Rd&($FF-K),(d:16-31, K:0-255)}
;TST Rd {Rd=Rd&Rd, (d:0-31)}
;Cờ bị tác động:S,Z,N,V=0
;****************************************************************************************
LDI R16,$0F ;
LDI R17,$0 ;
LDI R18,$AA ;
LDI R19,$CC ;
SBR R16,0B11000000 ;đặt 2 bit ở các vị trí 7,6 lên 1
CBR R18,0B10101000 ;xóa 3 bit ở các vị trí 7,5 và 3
TST R17 ;kiểm tra nội dung R17
TST R19 ;xem trạng thái của các cờ N,Z để biết giá trị
;của R17,R19 là số dương, âm hay bằng 0

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 7
NHÓM LỆNH RẼ NH\NH
;****************************************************************************************
;C\C LỆNH NHẢY KHÔNG ĐIỀU KIỆN
;JMP k {PC  k (k: 03FFFH)} ,PP TRỰC TIẾP VÙNG FLASH(ADDR) – TUYỆT ĐỐI
; {Trực tiếp, truy xuất địa chỉ FLASH}
;RJMP k {PC  k (k: -20482047)} ,TRỰC TIẾP FLASH - ĐỊNH VỊ TƯƠNG ĐỐI VỚI ĐỘ DỜI k
; {Định vị tương đối}
;IJMP {PC  Z (Z: 03FFFH)},GI\N TIẾP – TUYỆT ĐỐI{Gián tiếp, truy xuất địa chỉ FLASH}
;Cờ bị tác động:không có
;****************************************************************************************
.ORG $1000
;CT bắt đầu tại 1000H -->PCHH=1002H
;SUB1=$800(OFFSET=SUB1-PCHH=-2049), SUB2=$801(-2048),
;SUB3=$1800(+2047),SUB4=1801(+2048), SUB5=$3FFF

;JMP SUB1 ;PCHH=1002H


;JMP SUB2
;JMP SUB3
;JMP SUB4
;JMP SUB5
;JMP 0

;RJMP SUB2 ;PCHH=1001H


;RJMP SUB3
;RJMP SUB1 ;error
;RJMP SUB4 ;error

;LDI ZH,HIGH(SUB1)
;LDI ZL,LOW(SUB1)
;IJMP ;PCHH=1001H

;LDI ZH,HIGH(SUB5)
;LDI ZL,LOW(SUB5)
;IJMP

;LDI ZH,0
;LDI ZL,0
;IJMP

;CALL SUB1
;CALL SUB2
;CALL SUB3
;CALL SUB4
;CALL SUB5
;CALL 0

;RCALL SUB2
;RCALL SUB3
;RCALL SUB1 ;error
;RCALL SUB4 ;error

;LDI ZH,HIGH(SUB1)
;LDI ZL,LOW(SUB1)
;ICALL

;LDI ZH,HIGH(SUB5)
;LDI ZL,LOW(SUB5)
;ICALL

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 8
;LDI ZH,0
;LDI ZL,0
;ICALL
.ORG $800
SUB1: NOP
SUB2:NOP

.ORG $1800
SUB3:NOP
SUB4:NOP

.ORG $3FFF
SUB5:NOP
;SUB6:NOP ;dòng này sẽ bị báo lỗi vì vượt quá 16KW trong vùng FLASH

;****************************************************************************************
;C\C LỆNH NHẢY CÓ ĐIỀU KIỆN
;ĐK XÉT: nội dung các t.ghi GPRs hoặc giá trị của 1 bit trong t.ghi GPRs
;CPSE Rd,Rr {nếu Rd=Rr(ĐK ĐÚNG) bỏ qua lệnh tiếp theo
;  PC <-- PC+2 nếu lệnh theo sau là lệnh 1W(2byte)
; Hoặc PC <-- PC+3 nếu lệnh tiếp theo là 2W}
; ngược lại RdRr(ĐK SAI)--> PC <-- PC+1(thực hiện lệnh tiếp theo)
; (r,d:031)
;SBRC Rr,b {nếu Rr(b)=0 (ĐK ĐÚNG) bỏ qua lệnh tiếp theo
;  PC <-- PC+2 nếu lệnh theo sau là lệnh 1W(2byte)
; Hoặc PC <-- PC+3 nếu lệnh tiếp theo là 2W}
; ngược lại Rr(b)=1 (ĐK SAI)--> PC <-- PC+1(thực hiện lệnh tiếp theo)
; (r:031, b:07)
;SBRS Rr,b {nếu Rr(b)=1 (ĐK ĐÚNG) bỏ qua lệnh tiếp theo
;  PC <-- PC+2 nếu lệnh theo sau là lệnh 1W(2byte)
; Hoặc PC <-- PC+3 nếu lệnh tiếp theo là 2W}
; ngược lại Rr(b)=0 (ĐK SAI)--> PC <-- PC+1(thực hiện lệnh tiếp theo)
; (r:031, b:07)
;Cờ bị tác động:không có
;****************************************************************************************
LDI R16,$AB
LDI R17,$AB
LDI R18,$CD

LDI R19,$F0
LDI R20,$0F

CPSE R16,R17 ;ĐK ĐÚNG: bỏ qua lệnh ADD--> PC=PC+2


ADD R19,R20 ;(LỆNH 1W)
SUB R19,R20 ;(LỆNH 1W) lệnh này được thực hiện R19=$E1

CPSE R16,R17 ;ĐK ĐÚNG


STS $100,R20 ;(LỆNH 2W)bỏ qua lệnh này--> PC=PC+3
SUB R19,R20 ;R19=$D2

CPSE R16,R18 ;ĐK SAI --> PC=PC+1(thực hiện lệnh kế)


ADD R19,R20 ;R19=$E1
SUB R19,R20 ;R19=$D2

SBRC R20,0 ;R20=$0F->R20(0)=1:ĐK SAI --> PC=PC+1(thực hiện lệnh kế)


STS $101,R19 ;($101)=$D2
STS $100,R20 ;($100)=$0F

SBRS R20,1 ;R20(1)=1 -> ĐK ĐÚNG


MOV R1,R19 ;(LỆNH 1W)bỏ qua lệnh này--> PC=PC+2

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 9
MOV R0,R20 ;R0=$0F
;****************************************************************************************
;C\C LỆNH SO S\NH T\C ĐỘNG ĐẾN T.GHI SREG
;CP Rd,Rr {Rd-Rr (d,r:031)}
;CPC Rd,Rr {Rd-Rr-C (d,r:031)}
;CPI Rd,K {Rd-K (d,r:031, K: 0255)}
;Cờ bị tác động:H,S,V,N,Z,C
;****************************************************************************************
LDI R16,50
LDI R17,100
CP R16,R17 ;R16,R17? , H,S,V,N,Z,C?
;thử lý giải cho các KQ nhận được?

;****************************************************************************************
;Xóa các cờ trong SREG
;****************************************************************************************
LDI R20,0
OUT SREG,R20

CPC R16,R17 ;quan sát R16,R17? , H,S,V,N,Z,C?


;giải thích?

LDI R20,0
OUT SREG,R20

CPI R17,50

;****************************************************************************************
;C\C LỆNH NHẢY CÓ ĐIỀU KIỆN
;ĐK XÉT: bit(b) trong t.ghi SFRs có địa chỉ IO: 031
;SBIC P,b {nếu BITb=0 (ĐK ĐÚNG) bỏ qua lệnh tiếp theo
;  PC <-- PC+2 nếu lệnh theo sau là lệnh 1W(2byte)
; Hoặc PC <-- PC+3 nếu lệnh tiếp theo là 2W}
; ngược lại BITb=1 (ĐK SAI)--> PC <-- PC+1(thực hiện lệnh tiếp theo)
; (r,d:031)
;SBIS P,b {nếu BITb=1 (ĐK ĐÚNG) bỏ qua lệnh tiếp theo
;  PC <-- PC+2 nếu lệnh theo sau là lệnh 1W(2byte)
; Hoặc PC <-- PC+3 nếu lệnh tiếp theo là 2W}
; ngược lại BITb=0 (ĐK SAI)--> PC <-- PC+1(thực hiện lệnh tiếp theo)
; (r,d:031)
;Cờ bị tác động:không có
;****************************************************************************************
LDI R16,$AB
OUT PORTA,R16

SBIC PORTA,2 ;ĐK ĐÚNG/SAI?


STS $100,R17 ;LỆNH BAO NHIÊU WORD?
MOV R0,R17 ;LỆNH BAO NHIÊU WORD?
;QUAN SÁT VÀ GIẢI THÍCH KQ NHẬN ĐƯỢC?

SBIS PORTA,2 ;MÔ PHỎNG TƯƠNG TỰ


STS $100,R17
MOV R0,R17

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 10
;****************************************************************************************
;C\C LỆNH NHẢY CÓ ĐIỀU KIỆN
;ĐK XÉT: các bit cờ (s) trong t.ghi SREG
;BRBS s,k {nếu s=1(ĐK ĐÚNG) : PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại: s=0 (ĐK SAI) : PC <-- PC+1(thực hiện lệnh tiếp theo)}
; (s:07, k:-6463)
;BRBC s,k {nếu s=0(ĐK ĐÚNG) : PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại: s=1 (ĐK SAI) : PC <-- PC+1(thực hiện lệnh tiếp theo)}
; (s:07, k:-6463)
;CÁC LỆNH TƯƠNG ĐƯƠNG VỚI 2 LỆNH TRÊN (khi xem các cờ là toán hạng s)
;BRCS k {nếu CỜ C=1(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ C=0 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRCC k {nếu CỜ C=0(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ C=1 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRVS k {nếu CỜ V=1(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ V=0 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRVC k {nếu CỜ V=0(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ V=1 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRHS k {nếu CỜ H=1(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ H=0 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRHC k {nếu CỜ H=0(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ H=1 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BREQ k {nếu CỜ Z=1(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ Z=0 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRNE k {nếu CỜ Z=0(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ Z=1 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;EQ/NEBẰNG/KHÔNG BẰNG ZERO
;BRMI k {nếu CỜ N=1(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ N=0 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRPL k {nếu CỜ N=0(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ N=1 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;MI/PLSỐ ]M/SỐ DƯƠNG, thường sử dụng sau các lệnh so sánh
;BRTS k {nếu CỜ T=1(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ T=0 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRTC k {nếu CỜ T=0(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ T=1 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRIE k {nếu CỜ I=1(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ I=0 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;BRID k {nếu CỜ I=0(ĐK ĐÚNG): PC <-- PC+k+1 nhảy đến thực hiện lệnh tại địa chỉ k
; ngược lại:CỜ I=1 (ĐK SAI): PC <-- PC+1(thực hiện lệnh tiếp theo)}
;****************************************************************************************

;****************************************************************************************
;Quan sát và thay đổi 1 số giá trị khác nhau cho các ô nhớ $200 và $201 trong SRAM
;mô phỏng và giải thích kết quả thực hiện của đoạn chương trình sau
;****************************************************************************************
LDI R16,$FF
OUT DDRA,R16
OUT DDRB,R16
START:
LDS R1,$200
LDS R2,$201
ADD R1,R2
BRBS 2,ACT
OUT PORTA,R1
JMP START
ACT:
OUT PORTB,R1
JMP START

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 11
;****************************************************************************************
;CTC DELAY
;****************************************************************************************

DELAY:
LDI R20,3 ;1MC, X=3

AGAIN: NOP ;1MC


NOP ;1MC
DEC R20 ;1MC
BRNE AGAIN ;2/1MC
RET ;4MC

;****************************************************************************************
;TÍNH CHÍNH XÁC:T= 1+ (1+1+1)*3 + 2*2 + 1 + 4 =19MC
;TÍNH GẦN ĐÚNG (khi X rất lớn): T=1+ (1+1+1)*3 + 2*2 + 1 + 4 =(1+1+1+2)*X
;****************************************************************************************

;****************************************************************************************
;C\C THANH GHI TRUY XUẤT DATA TỪ EEPROM
;EECR: T.GHI ĐIỀU KHIỂN TRUY XUẤT EEPROM(GHI/ĐỌC)
;EEARH_EEARL: T.GHI LƯU ĐỊA CHỈ CẦN TRUY XUẤT
;EEDR: T.GHI LƯU DATA CHO VIỆC GHI/ĐỌC
;****************************************************************************************

;****************************************************************************************
;CTC GHI EEPROM
;INPUT: ADDR --> R18:R17
; DATA --> R16
;****************************************************************************************
EEPROM_WRITE:
SBIC EECR,EEPE
RJMP EEPROM_WRITE
OUT EEARH, R18
OUT EEARL, R17
OUT EEDR,R16
SBI EECR,EEMPE
SBI EECR,EEPE
CALL DELAY
RET

;****************************************************************************************
;CTC ĐỌC EEPROM
;INPUT: ADDR --> R18:R17
;OUTPUT: R16 <-- DATA
;****************************************************************************************

EEPROM_read:
SBIC EECR,EEPE
RJMP EEPROM_READ
OUT EEARH, R18
OUT EEARL, R17
SBI EECR,EERE
IN R16,EEDR
RET

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 12
;****************************************************************************************
;VD GHI 3 KÝ TỰ A,B,C VÀO EPROM BẮT ĐẦU TỪ ĐỊA CHỈ 0
;ĐỌC LẠI VÀ GHI VÀO VÙNG DATA_SRAM BẮT ĐẦU TỪ KÝ TỰ ĐẦU TIÊN TẠI ĐỊA CHỈ $100
;****************************************************************************************

LDI R18,0
LDI R17,0
LDI R16,'A'
CALL EEPROM_WRITE
LDI R17,1
LDI R16,'B'
CALL EEPROM_WRITE

LDI R17,2
LDI R16,'C'
CALL EEPROM_WRITE

LDI R17,0
CALL EEPROM_READ
STS $100,R16

LDI R17,1
CALL EEPROM_READ
STS $101,R16

LDI R17,2
CALL EEPROM_READ
STS $102,R16

HERE:
JMP HERE

;****************************************************************************************
;CTC DELAY 5ms
;F=1MHz, T4mn
;****************************************************************************************

DELAY:
LDI R21,5 ;1MC, m=5
L1: LDI R20,250 ;1MC, n=250
L2: DEC R20 ;1MC
NOP ;1MC
BRNE L2 ;2/1MC
DEC R21 ;1MC
BRNE L1 ;2/1MC
RET ;4MC

;****************************************************************************************
;THỬ THAY ĐỔI GIẢI THUẬT ĐỂ CHƯƠNG TRÌNH TRÊN TỐN ÍT BỘ NHỚ HƠN
;****************************************************************************************

Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 13
NHÓM LỆNH XỬ LÝ BIT
;****************************************************************************************
;ĐẶT/XÓA BIT TRONG IO REGs
;SBI P,b {IO REGs(P,b)  1}
;CBI P,b {IO REGs(P,b)  0}
; b: 07, P: 031
;Cờ bị tác động:không có
;****************************************************************************************

SBI PORTA,2 ;mô phỏng và quan sát KQ?


CBI PORTC,7

;****************************************************************************************
;DỊCH TR\I/PHẢI T.GHI GPRs
;LSL Rd {C  b7  ……  b0  0}
;Cờ bị tác động:S,V,C,N

;LSR Rd {0  b7  ……  b0  C}
; P: 031
;Cờ bị tác động:S,V,C,N=0
;****************************************************************************************

;****************************************************************************************
;XOAY TR\I/PHẢI T.GHI GPRs
;ROL Rd {C  b7  ……  b0  C}
;ROR Rd {C  b7  ……  b0  C}
;DỊCH PHẢI SỐ HỌC T.GHI GPRs
;ASR Rd {b7  b7  ……  b0  C}
; P: 031
;Cờ bị tác động:S,V,N,Z,C
;HO\N ĐỔI 2 NỮA BYTE CỦA T.GHI GPRs
;SWAP Rd {Rd(74)Rd(30) }
; P: 031
;Cờ bị tác động:không có

;****************************************************************************************

;****************************************************************************************
;ĐẶT/XÓA CỜ TRONG SREG
;BSET s {SREG(s)  1}
;BCLR s {SREG(s)  0}
; s: 07
;Cờ bị tác động:I,T,H,S,V,N,Z,C
;các lệnh ĐẶT/XÓA cờ trong SREG mà không có toán hạng hoạt động tương tự các lệnh trên
;****************************************************************************************

;****************************************************************************************
;SAO CHÉP GIỮA BIT T(SREG) & BIT b TRONG GPRs
;BST b {T  Rr(b)}
;Cờ bị tác động:T
;BLD b {Rr(b)  T}
; d,r: 031 b: 07
;Cờ bị tác động:không có
;****************************************************************************************

Thử nạp vào các t.ghi GPRs một số giá trị khác nhau, thực hiện các phép toán theo đúng cú
pháp và quan sát KQ với các lệnh xử lý BIT? Thực hiện tương tự với các lệnh xử lý bit
trong t.ghi SREG.
Một số ví dụ giải thích tập lệnh Atmega324P- GV:Lê Thị Kim Anh Trang 14

You might also like