Chi tiết về không gian nhớ của 8051 các bạn có thể xem ở đây:
http://dientuvietnam.net/forums/show...t=1163&page=24
Các bài viết của mình dưới đây có thể chưa tối ưu, mong sự góp ý của các bạn vê thuật giải cũng như cách viết để cho mình thi tốt trong kì thi tới
.
1/Bài 1: Cộng hai số 5 byte, yêu cầu và cách làm mình đều viết trong chương trình:
Code:
;========================================================
; Ten chuong trinh : Cong 2 so 5 bytes
; Nguoi thuc hien : Ngo Hai Bac
; Ngay thuc hien : 29/12/06
; Phien ban : 1.0
; Mo ta phan cung : Dung AT89S52 - thach anh 11.0592 MHZ
;----------------------------------------------------------------
; Ngay hoan thanh : 29/12/06
; Ngay kiem tra :
; Nguoi kiem tra : Ngo Hai Bac
;----------------------------------------------------------------
; Chu thich : Chuong trinh don gian dung cho thi cu
; Hai so hang deu trong bo nho, ket qua cat vao so hang dau
; Chu y: MSB duoc cat vao o co dia chi nho
; So I: 49 50 51 52 53 54
; So II: 60 61 62 63 64
; O nho 49 dung luu so nho tu phep cong truoc neu co tran
;========================================================
ORG 00h ; Reset
NOP
LJMP Start
ORG 003h ; Int EX0
NOP
RETI
ORG 0bh ; Int Timer0
NOP
RETI
ORG 13h ; Int EX1
NOP
RETI
ORG 1bh ; Int Timer1
NOP
RETI
ORG 23h ; Int Communication
NOP
RETI
;====================================================================
stack equ 2fh
;====================================================================
; Main Program
;====================================================================
ORG 4bh
Start: PUSH 00h
PUSH 01h
PUSH 02h ; Cat R0, R1, R2 vao Stack
MOV R0, #54h
MOV R1, #64h
MOV R2, #5
CLR C ;Xua co nho C
Loop: CLR A ; Xoa thanh ghi Accumulator
MOV A, @R0 ; A = du lieu co dia chi = R0
ADDC A, @R1 ; A = A + @R1 + C
MOV @R0,A ; Cat ket qua vao byte so thu nhat
DEC R0 ; R0 = R0 - 1
DEC R1 ; R1 = R1 - 1
DJNZ R2, Loop ; Giam R2 va kiem tra neu R2 #0 thi nhay ve Loop,
; = 0 thi chay tiep
RLC A ; Quay trai A voi bit C => A = C
MOV @R0,A ; O nho 49h co gia tri = C
POP 02h
POP 01h
POP 00h
END.
Mình xin giải thích cách làm:
2 số 5 byte là:
Code:
b5 b4 b3 b2 b1 b0
a4 a3 a2 a1 a0
(mõi số là số 1 byte)
với mỗi cặp tương ứng (bi, ai) thì chúng ta cộng như sau:
tổng = ai + bi + nhớ từ phép cộng của hàng trước;
nếu tổng >0xFF thì nhớ sang hàng tiếp theo và bi = tổng - 0xFF
nếu tổng <0xFF thì gán bi = tổng
Điều này thực hiện dễ dàng bằng lệnh ADDC, khi có nhớ từ bit 7 thì sẽ set cờ nhớ C, không nhớ thì nó sẽ tự xóa cờ nhớ này. Do đó C như là số nhớ từ phép tính trước.Vì nó tự động xóa hoặc set nên không cần xóa Nên chỉ cần dùng như sau:
Code:
; R0 là địa chỉ của bi
; R1 là địa chỉ của ai
MOV A, @R0
ADDC A, @R1
MOV @R0, A
Như vậy cần thực hiện 5 vòng lặp. Có nhiều cách lặp, mình sử dụng kiểu Do.. While; (trong C);
Code:
index = m; // m = const
Do{
// Làm việc gì đó
index -- ;
} while (index>0)
Tướng ứng trong ASM:
Code:
MOV R2,#5 ; gán R2 = 5
LOOP:
; do something
DJNZ R2,LOOP ; Giảm R2, nếu chưa = 0 thì nhảy đến Loop
DJNZ: Decrease and Jump if Not Equal
Chi tiết hơn về các lệnh anh em xem trong tệp lệnh nhé. Rảnh thì mình sẽ viết luôn cả code C cho anh em so sánh nhé :d.
Chúc anh em thành công.
Bookmarks