HBK Tp HCMKhoa T BMT Ti liu Vi
ĐHBK Tp HCM-Khoa Đ-ĐT BMĐT Tài liệu: Vi Xử Lý - Hồ Trung Mỹ CHƯƠNG 3 HỌ VI ĐiỀU KHIỂN 8051 1
3. 4 TẬP LỆNH CỦA 8051 2
Ý nghĩa các ký hiệu viết tắt trong tập lệnh 3
Các lệnh ảnh hưởng đến thanh ghi trạng thái PSW (CY, OV, AC) 4
Các lệnh số học (giả sử 8051 với thạch anh 12 MHz) 5
Phát hiện tràn (overflow) • Không tràn khi cộng một số dương và một số âm. • Không tràn khi dấu của hai số giống nhau đối với phép toán trừ. • Tràn xuất hiện khi giá trị ảnh hưởng đến dấu: – tràn khi cộng hai số dương và cho kết quả là số âm. – hoặc, khi cộng hai số âm và cho kết quả là số dương. – hoặc, trừ số dương cho số âm nhưng nhận kết quả là số âm. – hoặc, trừ số âm cho số dương nhưng nhận kết quả là số dương. • Hãy khảo sát các phép toán A + B, and A – B – Có thể xảy ra tràn nếu B bằng 0 ? – Có thể xảy ra tràn nếu A bằng 0 ? 6
Phát hiện tràn (overflow) • Tràn: kết quả lớn hơn hoặc nhỏ hơn so với tầm của số nhị phân có dấu (dạng bù 2) – Thí dụ: - 8 < = số nhị phân 4 -bit <= 7 • Khi cộng hai toán hạng có dấu khác nhau, tràn không thể xảy ra. • Tràn xuất hiện khi cộng: – 2 số dương và kết quả là số âm. – 2 số âm và kết quả là số dương. • Hãy chứng minh rằng ta có thể phát hiện tràn bằng cách: – OV = Số nhớ từ MSB số nhớ đến MSB 0 + 1 1 0 1 1 1 0 0 1 1 7 3 1 0 – 6 + 0 1 1 0 0 1 1 – 4 – 5 0 1 1 1 7 7
Các lệnh ADD add a, byte addc a, byte ; a (a) + byte + (C) Các lệnh này ảnh hưởng 3 bit trong PSW: C = 1 nếu kết quả cộng > FF AC = 1 nếu có nhớ tại bit 3 OV = 1 nếu có nhớ từ bit 7 mà không từ bit 6 hoặc ngược lại. 8
Lệnh ADD và SUBB ADD A, Source ; A (A) + Source ADD A, #6 ; A (A) + 6 ADD A, R 6 ; A (A) + (R 6) ADD A, 6 ; A (A) + [6] or A (A) + (R 6) ADD A, 0 F 3 H ; A (A) + [0 F 3 H] SUBB A, Source ; A (A) – Source – (C) SUBB A, #6 ; A (A) – 6 – (CY) SUBB A, R 6 ; A (A) – (R 6) – (CY) 9
Phép trừ SUBB A, byte Trừ có số mượn (borrow) Thí dụ: SUBB A, #04 FH ; A (A) – 4 F – (C) Lưu ý: Không có lệnh trừ KHÔNG CÓ số mượn (WITHOUT borrow). Do vậy, nếu ta cần phép trừ không có số mượn, ta cần xóa cớ C. Thí dụ: CLR C SUBB A, #04 FH ; A A – 4 F 10
Thí dụ với ADD mov a, #3 FH add a, #0 D 3 H 0011 1101 0011 0001 0010 11 1 Cho biết các giá trị của các cờ C, AC và OV sau khi lệnh thứ hai được thực thi? C = 1 AC = 1 OV = 0 11
Cộng số có dấu và tràn (OV) Số có dấu dạng bù-2: 0000 00 0 … 0111 1111 7 F 127 1000 0000 80 -128 … 1111 FF -1 0111 1111 (+ 127) 0111 0011 (+ 115) 1111 0010 (tràn do không thể biểu diễn 242 ở dạng bù-2 8 bit) 1000 1111 1101 0011 0110 0010 (– 113) (– 45) (tràn) 0011 1111 (dương) 1101 0011 (âm) 0001 0010 (không tràn) 12
Hiệu chỉnh thập phân (decimal adjust) DA A ; hiệu chỉnh thập phân A Được sử dụng để hiệu đính phép cộng số BCD. Cộng “ 6” với nửa byte (nibble) cao hoặc nửa byte thấp đối với phép cộng số BCD để tạo ra số BCD hợp lệ. Thí dụ: MOV A, #23 h MOV B, #29 h ADD A, B DA A ; a 23 h + 29 h = 4 Ch ; (cần kết quả là 52) ; a (a) + 6 = 52 13
Thí dụ: Cộng 2 số BCD 4 -decade MOV ADD DA MOV ADDC DA MOV A, 43 H ; num 1 ở các ô nhớ 40 H, 41 H A, 41 H ; num 2 ở các ô nhớ 42 H, 43 H A ; kết quả đặt ở các ô nhớ 40 H, 41 H, A A, 42 H C A, 40 H 1234 40 H, 41 H A + 5678 42 H, 43 H ------40 H, A (AC) 112 6912 14
Tính Z = X + Y Thí dụ: Tính Z = X + Y với Z, X, Y là số 1 byte trong RAM nội. Giả sử X được cất ở 40 H, Y ở 41 H, và Z ở 42 H. Cách 1: MOV A, 40 h ADD A, 41 h MOV 42 h, A Cách 2: X Y Z EQU EQU 40 h 41 h 42 h MOV A, X ADD A, Y MOV Z, A 15
Cộng 2 số 16 bit Thí dụ: Cộng 2 số 16 bit Var. X và Var. Y (có địa chỉ ở RAM nội). Cất kết quả vào Var. X. ; Các số 16 bit cất ở Var. X và Var. X+1, Var. Y và Var. Y+1 MOV A, Var. X ; lấy byte thấp ADD A, Var. Y ; cộng các byte thấp MOV Var. X, A ; cất byte thấp MOV A, Var. X+1 ; lấy byte cao ADDC A, Var. Y+1 ; cộng có nhớ của phép cộng trước MOV Var. X+1, A ; cất kết quả 16
Lệnh tăng và giảm INC A tăng (A) INC byte tăng byte trong bộ nhớ INC DPTR tăng con trỏ dữ liệu (data pointer) DEC A giảm (A) DEC byte giảm byte trong bộ nhớ • Các lệnh tăng và giảm không ảnh hưởng đến cờ C. • Lưu ý, ta chỉ có thể tăng con trỏ dữ liệu (data pointer), không thể giảm. 17
Lệnh INC và DEC INC byte ; byte = byte - 1 ; byte = byte + 1 Thí dụ: INC DEC R 7 A 40 H ; [40 H] = [40 H] - 1 18
Lệnh DEC Chú ý với DPTR chỉ có lệnh INC còn lệnh DEC thì không có. Do đó muốn thực hiện việc giảm DPTR đi 1 thì ta phải sử dụng chuỗi lệnh sau: DEC DPL MOV R 7, DPL CJNE R 7, #0 FFH, SKIP DEC SKIP: DPH ; Giảm byte thấp của DPTR đi 1 ; chép vào R 7 ; Nếu tràn dưới thành FF thì phải ; mượn ; do đó cũng phải giảm byte cao ; đi 1 (tiếp tục) Ta phải giảm đi 1 riêng cho các byte cao và byte thấp của DPTR; tuy nhiên byte cao (DPH) chỉ bị giảm nếu byte thấp (DPL) tràn dưới từ 00 H sang FFH. 19
Tăng từ 16 -bit • Giả sử từ 16 -bit word cất trong R 3: R 2 mov a, r 2 add a, #1 mov r 2, a mov a, r 3 addc a, #0 mov r 3, a ; sử dụng add thay vì inc để ảnh hưởng cờ C ; cộng C với byte cao 20
Lệnh MUL & DIV • MUL MOV MUL AB A, #25 H B, #65 H AB ; B|A (A)*(B) • DIV MOV DIVAB AB A, #25 B, #10 ; A (A)/(B), B (A) mod (B) ; 25 H*65 H = 0 E 99 H ; (B) = 0 EH, (A) = 99 H ; (A) = 2, (B) = 5 OV - được sử dụng để chỉ ra phép chia cho 0. C – thiết lập bằng zero 21
Các lệnh logic (giả sử 8051 với thạch anh 12 MHz) 22
Các lệnh logic • • Các phép toán logic (AND, OR, XOR, NOT) Xóa Quay (rotate) Trao đổi (swap) Các lệnh logic không ảnh hưởng đến các cờ của PSW. 23
Phép toán logic ANL AND ORL OR XRL XOR CPL Lấy bù Thí dụ: 00001111 ANL 10101100 00001100 ORL 00001111 10101100 10101111 XRL 00001111 10101100 10100011 CPL 10101100 01010011 24
Định địa chỉ với lệnh logic ANL – AND ORL – OR XRL – e. Xclusive o. R a, byte direct, reg. indirect, reg, immediate byte, a direct byte, #constant CPL – Lấy bù a ex: cpl a 25
Sử dụng lệnh logic • Buộc một số bit bằng 0, không ảnh hưởng đến các bit khác. anl PSW, #0 x. E 7 ; PSW AND 11100111 • Buộc một số bit bằng 1, không ảnh hưởng đến các bit khác. orl PSW, #0 x 18 ; PSW OR 00011000 • Lấy bù một số bit xrl P 1, #0 x 40 ; P 1 XRL 01000000 26
Sử dụng lệnh logic Thí dụ: Xác định nội dung của thanh chứa A sau khi thực thi đoạn chương trình sau. MOV A, #3 CH ; A 0011 1100 MOV R 4, #66 H ; R 4 0110 ANL A, R 4 ; A (A) AND (R 4) Lời giải: (A) = 0011 1100 (R 4) = 0110 (A) = 0010 0100 = 24 H 27
Các lệnh logic khác CLR RL RLC RR RRC SWAP – – – xóa quay trao trái cùng cờ C phải cùng cờ C đổi hai nibble của A 28
CLR ( cho tất cả bit bằng 0) CLR A Lưu ý: Tương tự như MOV A, #0 ; hay ANL A, #0 29
Quay • Các lệnh quay chỉ thao tác trên A. RL a mov a, #0 x. F 0 RR a ; a 11110000 ; a 11100001 RR a mov a, #0 x. F 0 RR a ; a 11110000 ; a 01111000 30
Quay cùng cờ C C RRC a mov a, #0 A 9 h add a, #14 h rrc a RLC a mov a, #3 ch setb c rlc a ; a A 9 ; a BD (10111101), C 0 ; a 01011110, C 1 C ; a 3 ch(00111100) ; c 1 ; a 01111001, C 0 31
Quay cùng cờ C Thí dụ: Xác định nội dung của thanh chứa A sau khi thực thi đoạn chương trình MOV A, #0 C 3 H ; A 1100 0011 RLC A Lời giải: Giả sử ban đầu (C) = 0 (A) = 1100 0011 Quay trái cùng cờ C (A) = 1000 0110 , (C) = 1. 32
Nhân, chia và quay Lưu ý rằng dịch trái tương đương với nhân 2, dịch phải tương đương với chia 2. mov clr rlc rrc a, #3 C a a a ; ; ; A C A A A 00000011 0 000001100 00000110 (3) (6) (12) (6) 33
Hoán đổi SWAP a mov a, #72 h swap a ; a 27 h 34
Các lệnh chuyển dữ liệu 35
Chuyển dữ liệu • • MOV MOV MOVC A, source ; di chuyển từ nguồn A, #data ; đến đích dest, A dest, #data DPTR, #data 16 A, @A+DPTR A, @A+PC 36
Chuyển dữ liệu • • MOVX PUSH POP XCHD A, @Ri A, @DPTR @Ri, A @DPTR, A direct A, source A, @Ri ; chuyển từ ; bộ nhớ dữ liệu ; trao đổi byte ; trao đổi hai nửa ; byte thấp. 37
A và B bằng bao nhiêu? MOV MOV XCH 0 F 0 H, #12 H R 0, #0 F 0 H ; A, #34 H A, 0 F 0 H XCHD A, @R 0 ; (B) = 12 H ; (A) = 34 H ; (A) = 12 H, ; (B) = 34 H ; (A) = 14 H, ; (B) = 32 H 38
Nạp [10 F 4 H] & [10 F 5 H] vào R 6, R 7 MOVX MOV INC MOVX MOV DPTR, #10 F 4 H A, @DPTR R 6, A DPTR A, @DPTR R 7, A 39
Chuỗi lệnh trên chiếm 9 byte và thực thi trong 5 s 40
Minh họa về tác động của PUSH và POP • • • Sau khi reset hệ thống thì (SP) = 07 H. Có 3 cách để truy cập: PUSH (cất vào stack), POP (lấy ra khỏi stack) và CALL (chuyển điều khiển chương trình và quay về [RET, RETI]). Để cất thông tin vào stack, ta sử dụng lệnh PUSH. Khi đó các bước sau xảy ra 1. SP được tăng thêm 1. 2. Thông tin được đặt vào địa chỉ trỏ bởi SP. • Để lấy thông tin ra khỏi stack, ta sử dụng lệnh POP. Khi đó các bước sau xảy ra 1. Thông tin có địa chỉ trỏ bởi SP được lấy ra. 2. SP được giảm đi 1. 41
Thí dụ về PUSH và POP MOV MOV PUSH POP POP R 6, #25 h R 1, #12 h R 4, #0 F 3 h 6 1 4 3 5 2 ; R 6 ; R 1 ; R 4 ; lấy từ stack chép vào R 3 ; lấy từ stack chép vào R 5 ; lấy từ stack chép vào R 2 42
Ảnh hưởng của lệnh PUSH với stack 43
Ảnh hưởng của lệnh POP với stack SP = 0 Ah SP = 09 h SP = 08 h SP = 07 h 44
Lưu ý về stack trong 8051 • Stack trong 8051 tăng trưởng theo hướng địa chỉ tăng (08 H, 09 H, . . . ) • Stack chiếm cùng vị trí với băng thanh ghi 1 (bank 1), do đó khi sử dụng stack ta phải cẩn thận với băng thanh ghi 1 (không thể sử dụng được lúc này). Tuy nhiên, ta có thể giải quyết vấn đề này bằng cách nạp lại trị bắt đầu mới cho SP (các trị từ 30 H đến 7 FH). • Khi stack tăng trưởng có khả năng lọt vào vùng có địa chỉ bit (từ byte có địa chỉ 30 H). 45
Bảng tìm kiếm (look-up table) LOOK_UP: TABLE: MOV A, #ENTRY CALL LOOK_UP. . INC A MOVC A, @A+PC RET DB data, . . . 46
Thí dụ: Đọc một số X từ Port 1 và xuất giá trị X 2 ra Port 2 Again: LUT: ORG 0 ; Chỉ dẫn của assembler MOV DPTR, #LUT ; 300 H là địa chỉ đầu bảng MOV A, #0 FFH MOV P 1, A ; Lập trình cổng P 1 để nhập ; dữ liệu MOV A, P 1 ; Đọc X MOVC A, @A+DPTR ; Lấy X 2 bằng tra bảng MOV P 2, A ; Xuất X 2 ra P 2 SJMP Again ; Lặp lại mãi đoạn Again đến SJMP ORG 300 H ; Bảng tra bắt đầu ở 0300 H DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 47 DB 100, 121, 144, 169, 196, 225
Thí dụ Viết lệnh cho 8051 để thực hiện các thao tác sau: (a) Di chuyển nội dung của A đến thanh ghi 5. (b) Di chuyển nội dung của RAM ở vị trí nhớ 42 H ra port 1. (c) Di chuyển giá trị ở port 2 đến thanh ghi 3. (d) Truyền FFH đến port 0. (e) Truyền nội dung của RAM có địa chỉ chứa trong thanh ghi 1 đến port 3. Lời giải: (a) MOV R 5, A (b) MOV P 1, 42 H (c) MOV R 3, P 2 (d) MOV P 0, #0 FFH (e) MOV P 3, @R 1 48
Đảo ngược các bit của A Loop: MOV RLC XCH RRC XCH DJNZ XCH R 7, #8 A A, 0 F 0 H R 7, LOOP A, 0 F 0 H 49
Các lệnh với biến Boole (giả sử 8051 với thạch anh 12 MHz) 50
Các lệnh với biến Boole • • CLR SETB CPL ANL C bit C, /bit ; xóa bit ; set bit ; lấy bù bit ; AND bit với C ; AND NOT bit với C 51
Các lệnh với biến Boole • • • ORL MOV JC JNC JB JNB JBC C, bit C, /bit C, bit, C rel bit, rel ; OR bit với C ; OR NOT bit với C ; chuyển bit đến bit ; nhảy nếu (C) = 1 ; nhảy nếu (C) = 0 ; nhảy nếu bit bằng 1 ; nhảy nếu bit bằng 0 ; nhảy nếu bit bằng 1 ; rồi xóa bit. 52
Phép toán XOR với biến Boole Lưu ý là các lệnh với biến Boole bao gồm các phép toán ANL (logic AND) và ORL (logic OR), không có phép toán XRL (logic XOR). Tuy nhiên ta có thể thực hiện phép toán XOR bằng cách kết hợp các phép toán AND, OR, NOT hoặc sử dụng cách sau (thí dụ muốn thực hiện BIT 1 BIT 2) MOV C, BIT 1 JNB BIT 2, SKIP CPL C SKIP: (tiếp tục) Trước hết BIT 1 được chuyển vào cờ nhớ. Nếu BIT 2 = 0 thì C chứa kết quả đúng; nghĩa là BIT 1 BIT 2 = BIT 1 nếu BIT 2 = 0. Nếu BIT 2 = 1 thì C chứa phủ định của kết quả (vì BIT 1 BIT 2 = NOT BIT 1 nếu BIT 2 = 1). 53
Các lệnh với biến Boole Thí dụ: Sử dụng các lệnh SETB, CLR và CPL để thực hiện các thao tác sau: (a) Xóa bit 7 của A. (b) Xuất 1 ra bit 0 của port 3. (c) Lấy bù cờ chẵn lẻ (bit 0 của PSW) Lời giải: (a) CLR ACC. 7 (b) SETB P 3. 0 (c) CPL PSW. 0 54
Tính trị một hàm Boole F = WX’Y + XY’Z’ Cách 1: W EQU X EQU Y EQU Z EQU F EQU TMP EQU ORG MOV BACK: MOV ANL ORL MOV SJMP P 1. 3 P 1. 2 P 1. 1 P 1. 0 P 1. 7 00 h ; bit 0 của ô nhớ ; 20 H 8000 H A, #0 Fh P 1, A C, W C, /X C, Y TMP, C C, X C, /Y C, /Z C, TMP F, C BACK Cách 2: Dùng các lệnh điều kiện W EQU P 1. 3 X EQU P 1. 2 Y EQU P 1. 1 Z EQU P 1. 0 F EQU P 1. 7 TMP EQU 00 h ; bit 0 của ô nhớ ; 20 H ORG 8000 H MOV A, #0 Fh MOV P 1, A BACK: JNB W, CAL 2 JB X, CAL 2 JB Y, SETIT CAL 2: JNB X, CLEAR JB Y, CLEAR JB Z, CLEAR SETIT: SETB F SJMP BACK CLEAR: CLR F SJMP BACK 55
Các lệnh rẽ nhánh không điều kiện (giả sử 8051 với thạch anh 12 MHz) 56
Các lệnh rẽ nhánh có điều kiện (giả sử 8051 với thạch anh 12 MHz) 57
Rẽ nhánh chương trình • ACALL addr 11 • LCALL addr 16 • RET • • • RETI AJMP LJMP SJMP JZ ; gọi chương trìng con ; trở về từ chương trình ; con ; trở về từ ngắt ; nhảy tuyệt đối ; nhảy dài ; nhảy ngắn (tương đối) addr 11 addr 16 rel @A+DPTR rel ; nhảy nếu (A) = 0 58
Rẽ nhánh chương trình • JZ • JNZ rel • CJNE A, direct, rel A, #data, rel • • • Rn, #data, rel @Ri, #data, rel Rn, rel direct, rel CJNE DJNZ NOP ; nhảy nếu (A) = 0 ; nhảy nếu (A) khác ; 0 ; so sánh và nhảy ; đến rel nếu không ; bằng. ; giảm & nhảy đến ; rel nếu khác 0. ; không làm gì. 59
Rẽ nhánh có điều kiện Mnemonic Description JZ <rel addr> Nhảy nếu (a) = 0 JNZ <rel addr> Nhảy nếu (a) != 0 JC <rel addr> Nhảy nếu (C) = 1 JNC <rel addr> Nhảy nếu (C) != 1 JB <bit>, <rel addr> Nhảy nếu bit = 1 JNB <bit>, <rel addr> Nhảy nếu bit != 1 JBC <bir>, <rel addr> Nhảy nếu bit =1, xóa bit CJNE A, direct, <rel addr> So sánh A và ô nhớ, nhảy nếu không bằng. 60
Rẽ nhánh có điều kiện if condition is true condition goto label false else goto next instruction if a = 0 is true send a 0 to LED else send a 1 to LED true label jz led_off setb C mov P 1. 6, C sjmp skipover led_off: clr C mov P 1. 6, C skipover: mov A, P 0 61
Rẽ nhánh có điều kiện Thí dụ: Viết đoạn chương trình đọc liêu tục byte từ port 1 và ghi byte này đến port 0 cho đến khi byte đọc được có giá trị là zero. Lời giải: READ: MOV A, P 1 ; A ← (P 1) MOV P 0, A ; P 0 ← (A) JNZ READ ; Lặp lại cho đến khi ; (A) = 0 NOP ; Phần còn lại của chương trình etc. 62
Rẽ nhánh có điều kiện Mã gợi nhớ CJNE A, #data <rel addr> CJNE Rn, #data <rel addr> CJNE @Rn, #data <rel addr> Mô tả So sánh (A) và data, nhảy nếu không bằng. So sánh (Rn) và data, nhảy nếu không bằng. So sánh nội dung ô nhớ trỏ bởi Rn, nhảy nếu không bằng. DJNZ Rn, <rel addr> Giảm (Rn) rồi nhảy nếu (Rn) khác 0. DJNZ direct, <rel addr> Giảm nội dung ô nhớ rồi nhảy nếu khác 0. 63
Rẽ nhánh có điều kiện Thí dụ: Lặp lại thí dụ trước, chỉ khác là vòng lặp sẽ dừng khi byte đọc được có giá trị bằng 77 H. Lời giải: READ: MOV A, P 1 ; A ← (P 1) MOV P 0, A ; P 0 ← (A) CJNE A, #77, READ ; Lặp lại cho đến khi ; (A) = 77 H. NOP ; Phần còn lại của chương trình. etc. 64
Rẽ nhánh có điều kiện Thí dụ: Lặp lại thí dụ trước, chỉ khác là vòng lặp sẽ dừng khi bit 3 của port 2 là 1. Lời giải: READ: MOV A, P 1 ; A ← (P 1) MOV P 0, A ; P 0← (A) JNB P 2. 3, READ ; lặp lại cho đến khi ; P 2. 3 = 1 NOP ; Phần còn lại của chương trình. etc. 65
Vòng lặp For A = 0 to 4 do {…} For A = 4 to 0 do {…} clr a loop: . . . inc a cjne a, #5, loop mov R 0, #4 loop: . . . djnz R 0, loop ; Thiếu trường hợp R 0 = 0? 66
Thực thi vòng lặp N lần MOV R 7, #10 (SAY N=10) LOOP: (begin loop). . . (end loop) DJNZ R 7, LOOP (continue) 67
Thực thi vòng lặp N lần Thí dụ: Viết đoạn chương trình xuất ra tại port 0 số đếm giảm dần từ 80 H xuống 00 H. Lời giải: MOV R 0, #80 H ; R 0 ← 80 H COUNT: MOV P 0, R 0 ; P 0 ← (R 0) DJNZ R 0, COUNT ; Tăng (R 0), nhảy đến ; COUNT nếu khác 0. NOP ; Phần còn lại của ; chương trình etc. 68
Bảng nhảy MOV RL JMP. . JUMP_TABLE: DPTR, #JUMP_TABLE A, #INDEX_NUMBER A @A+DPTR AJMP CASE 0 AJMP CASE 1 AJMP CASE 2 69
So sánh và nhảy • So sánh hai byte không dấu: CJNE A, B, LE JNC BIG LE: . ; nhỏ hơn. BIG: . ; lớn hơn hay . ; bằng 70
Biểu diễn số theo mã ASCII Chương trình lấy một số trong ACC và cất biểu diễn ASCII của nó vào RAM nội ở địa chỉ trong R 1. Thí dụ để chuyển 239 thành các ký tự ASCII ‘ 2’, ‘ 3’, ‘ 9’; trước hết lấy ký số đầu bằng cách chia cho 100 (được 2 và đổi thành ‘ 2’); lấy phần dư từ phép chia để có 39; lấy 39 chia 10 được 3 (và đổi thành ‘ 3’), và phần dư của phép chia này cho 9 (và đổi thành ‘ 9’). 71
Biểu diễn số theo mã ASCII Bài giải: ORG 00 h MOV A, #239 MOV R 1, #040 h LCALL TODEC MOV A, #17 MOV R 1, #050 h LCALL TODEC NOP ; Nạp giá trị mẫu vào ACC ; và địa chỉ đích vào R 1 ; TODEC (239, 040 h); ; Bây giờ thí dụ với 2 ký số ; và địa chỉ đích ở R 1 ; thêm lệnh NOP này khi chạy ; mô phỏng 72
Chương trình con TODEC ; Đổi 1 byte thành 3 ký tự ASCII có thể in được từ 000– 255. ; Lấy số trong ACC và mã ASCII của số trong RAM nội bắt đầu ; ở địa chỉ trong R 1. TODEC: MOV B, #100 DIV AB LCALL TOASCII MOV A, B MOV B, #10 DIV AB LCALL TOASCII MOV A, B LCALL TOASCII RET ; Lấy số chia để vào B ; (ACC) = 2 , (B) = 39 ; Đổi sang ASCII và cất vào ; bộ nhớ ; Lấy phần dư vào A (39) ; ; (ACC) = 3, (B) = 9 ; Đổi và cất vào bộ nhớ ; Lấy 9 đưa vào A ; Đổi và cất vào bộ nhớ ; Thực hiện xong 73
Chương trình con TOASCII ; ====================== ; Đổi 1 số trong ACC thành một ký tự ASCII ; Cất kết quả vào ô nhớ có địa chỉ cho bởi R 1 TOASCII: ADD A, #'0' ; đổi từ nhị phân sang ASCII ; cũng có thể sử dụng ; "ADD A, #030 h” MOV @R 1, A ; Cất vào bộ nhớ nội INC R 1 ; Tăng con trỏ địa chỉ RET END 74
Thí dụ: Viết chương trình điền vào các ô nhớ từ 048 H đến 057 H với các giá trị 0, 2, 4. . . 30 (0– 1 EH), đặt 0 vào ô nhớ 48 H, 2 vào 49 H, . . . Bài giải: ORG 0 MOV R 0, #048 H ; Đặt địa chỉ của byte thứ nhất vào R 0 MOV A, #0 ; Điền giá trị vào ACC LOOP: MOV @R 0, A ; Lưu trữ byte CJNE A, #30, NEXT ; Lưu trữ giá trị sau cùng SJMP DONE NEXT: ADD A, #2 ; Tăng ACC thàh giá trị kế INC R 0 ; R 0 chỉ đến byte kế SJMP LOOP ; Ghi giá trị kế DONE: NOP ; END 75
- Slides: 75