Chương 3 Tập lệnh họ MSC-51

Similar documents
Các kiểu định địa chỉ họ MSC-51

3.4 Tập lệnh

LẬP TRÌNH 8051 SỐ HỌC VÀ LÔ GIC

Kiến trúc 8051 và giới thiệu về ngôn ngữ lập trình Assembly

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

SIEMENS INDUSTRIAL NETWORKS

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

STACK và QUEUE. Lấy STACK

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

Chương 5. Network Layer 19/09/2016 1

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

Hướng dẫn cài đặt FPT

CẤU TRÚC DỮ LIỆU NÂNG CAO

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

Tạo Project với MPLAB

Microprocessors 1. The 8051 Instruction Set. Microprocessors 1 1. Msc. Ivan A. Escobar Broitman

Tài liệu hướng dẫn: Stored Procedure

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

SIMULATE AND CONTROL ROBOT

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

NHÚNG. Vi ñiều khiển BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

Nhấn nút New để tạo 1 biến mới Trang 17

LÂ P TRI NH WEB ASP.NET

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

Tình huống 1: PPPoE với Username và Password

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

Microcontroller Intel [Instruction Set]

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

Mô hình dữ liệu quan hệ (Relational data model)

I. Hướng Dẫn Đăng Nhập:

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

BELGIUM ONLINE APPOINTMENT

Entity Framework (EF)

LAB IP SLA Bài 1. Bùi Quốc Kỳ ***

Bài tập lớn số 1. Giả lập bộ định thời

Tìm hiểu Group Policy Object và các ví dụ

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

MỤC LỤC. Giáo trình Thiết kế web Trang 1

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

GV: Phạm Đình Sắc or

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

Bài 7: Các cấu trúc điều khiển

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

BÀI LAB ĐỔI TÊN DOMAIN

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

Exceptions. Outline 7/31/2012. Exceptions. Exception handling is an important aspect of objectoriented. Chapter 10 focuses on:

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

Bài 10: Cấu trúc dữ liệu

Dọn "rác" Windows 7 vào dịp cuối năm

HƯỚNG DẪN SỬ DỤNG NHANH MINDJET MIND MANAGER

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

PHÁT TRIỂN ỨNG DỤNG WEB

SN8F5000 Family Instruction Set

BÀI 6a LẬP TRÌNH ĐA TUYẾN (MULTI THREAD)

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

Qu n ả tr h ố g t p ậ tin

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

BẢO MẬT TRONG SQL SERVER

Programming of 8085 microprocessor and 8051 micro controller Study material

TỔNG QUAN VỀ.NET VÀ C#

1 Bước 1: Test thử kit LaunchPad.

Hệ điều hành Bài tập tuần 7_ Chúng ta làm quen một số lệnh thao tác với hệ thống file trong Linux :

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

JAVASCRIPT. Giảng viên : Ths. PHẠM ĐÀO MINH VŨ

Parallels Cloud Server 6.0

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

Bài thực hành 1: Chỉ mục trong SQL Server

B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con:

CHAPTER 6: DANH SÁCH LIÊN KẾT (LINKED LISTS)

Dodatak. Skup instrukcija

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

Tính kế thừa-2. Bởi: Thanh Hiền Vũ. Định nghĩa lại các thành viên lớp cơ sở trong một lớp dẫn xuất:

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Google Search Engine. 12/24/2014 Google Search Engine 1

Bài thực hành số 2 QUYỀN và ROLE

Transcription:

Ký hiệu viết tắt trong tập lệnh Chương 3 Tập lệnh họ MSC-51 Hiệu đính từ bài giảng của Thầy Hồ Trung Mỹ Ký hiệu Rn hay Rr direct @Ri #data8 #data16 bit byte rel addr11 addr16 Ý nghĩa Định địa chỉ thanh ghi bằng các thanh ghi R0 đến R7 Địa chỉ nội 8 bits (00H - FFH) Định địa chỉ gián tiếp dùng thanh ghi R0 hoặc R1 Hằng số 8 bits ở ngay trong lệnh Hằng số 16 bits ở ngay trong lệnh Địa chỉ trực tiếp (8 bits) của bit Một trong các kiểu: direct, @Ri, Rn hoặc #data8 Offset 8 bits có dấu trong định địa chỉ tương đối Địa chỉ tuyệt đối 11 bits trong trang 2K hiện hành Địa chỉ 16 bits 2 Ký hiệu viết tắt trong tập lệnh Ký hiệu Ý nghĩa src Toán hạng nguồn (source) (có thể là Rn, direct hoặc @Ri) dest Toán hạng đích (destination) (có thể là Rn, direct hoặc @Ri) (X) Nội dung của X (vd: (A) nghĩa là nội dung thanh ghi A) ((X)) Nội dung ô nhớ có địa chỉ là nội dung của X DIR Cách định địa chỉ trực tiếp (direct) IN Cách định địa chỉ gián tiếp (indirect) REG Cách định địa chỉ thanh ghi (register) Các lệnh ảnh hưởng thanh ghi trạng thái PSW Instruction Flag Instruction Flag C OV AC C OV AC ADD X X X CLR C O ADDC X X X CPL C X SUBB X X X ANL C,bit X MUL O X ANL C,/bit X DIV O X ORL C,bit X DA X ORL C,/bit X RRC X MOV C,bit X RLC X CJNE X SETB C 1 Note that operations on SFR byte address 206 or bit addresses 209-215 (i.e. the PSW or bits IMM Cách định địa chỉ tức thời (immediate) 3 4

Mnemonic (từ gợi nhớ) Các lệnh số học Operation (tác vụ) 5 Addressing modes (cách định địa chỉ) DIR IND REG IMM Execution time (µs) (thời gian thực thi) ADD A, byte (A) = (A) + (byte) x x x x 1 ADDC A, byte (A) = (A) + (byte) +(C) x x x x 1 SUBB A, byte (A) = (A) - (byte) - (C) x x x x 1 INC A (A) = (A) + 1 Chỉ với ACC 1 INC byte (byte) = (byte) + 1 x x x 1 INC DPTR (DPTR) = (DPTR) + 1 Chỉ với DPTR 2 DEC A (A) = (A) - 1 Chỉ với ACC 1 DEC byte (byte) = (byte) - 1 x x x 1 MUL AB (B:A) = (B) x (A) Chỉ với ACC và B 4 DIV AB (A) = Int[(A)/(B)] (B) = Mod[(A)/(B)] Chỉ với ACC và B 4 DA A Điều chỉnh thập phân Chỉ với ACC 1 Lệnh cộng (ADD, ADDC) Ví dụ : add a, byte ; a a + byte addc a, byte ; a a + byte + C Các lệnh này ảnh hưởng đến 3 bits 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. 6 Lệnh cộng (ADD, ADDC) Ví dụ : hãy xác định giá trị của các cờ C, AC, OV sau khi thực hiện các lệnh sau. mov a, #3Fh add a, #D3h 0011 1111 1101 0011 0001 0010 C = 1 AC = 1 OV = 0 Cộng trừ có dấu và tràn Trường hợp không tràn: cộng một số âm và một số dương. trừ hai số cùng dấu. Trường hợp tràn: cộng hai số dương cho kết quả là số âm. cộng hai số âm cho kết quả là số dương. trừ một số âm từ một số dương và nhận kết quả là số âm. trừ một số dương từ một số âm và nhận kết quả là số dương. 7 8

Cộng trừ có dấu và tràn Số bù 2: 0000 0000 00 0 0111 1111 7F 127 1000 0000 80-128 1111 1111 FF -1 0111 1111 (+127) 0111 0011 (+115) 1111 0010 (+242 : tràn) 1000 1111 (-113) 1101 0011 (-45) 0110 0010 (tràn) 0011 1111 (dương) 1101 0011 (âm) 0001 0010 (không tràn) Lệnh cộng Tính Z = X + Y với Z, X, Y là số 1 byte trong RAM nội. Giả sử X được cất ở 78h, Y ở 79h và Z ở 7Ah. ;------------------------------------------------------------------ X equ 78h Y equ 79h Z equ 7Ah ;----------------------------------------------------------------- org 00h ljmp Main ;----------------------------------------------------------------- org 100h Main: mov a, X add a, Y mov Z, a end 9 10 Lệnh cộng Tính Z = X + Y với Z, X, Y là số 2 bytes (16 bits) trong RAM nội. Giả sử X được cất ở 78h, Y ở 7Ah và Z ở 7Ch. ;------------------------------------------------------------------ X equ 78h Y equ 7Ah Z equ 7Ch ;----------------------------------------------------------------- org 00h ljmp Main ;----------------------------------------------------------------- org 100h Main: mov a, X add a, Y mov Z, a mov a, X+1 adc addc a, a,y+1 mov Z+1, a end 11 Lệnh trừ (SUBB) SUBB A, byte : phép trừ có mượn. Ví dụ: SUBB A, #04Fh ; A A - 4F - C Chú ý: Không có phép trừ không mượn. Nếu muốn thực hiện phép trừ không mượn, cần phải xóa cờ C. Ví dụ: CLR C SUBB A, #04Fh ; A A - 4F 12

Lệnh tăng (INC) và giảm (DEC) INC A INC byte INC DPTR DEC A DEC byte increment A increment byte in memory increment data pointer decrement accumulator decrement byte Ghi chú: Lệnh tăng 1 và giảm 1 không ảnh hưởng đến cờ C. Đối với con trỏ dữ liệu DPTR, chỉ có lệnh tăng (INC), không có lệnh giảm (DEC). Lệnh nhân (MUL) MUL AB ; BA A * B Ví dụ: MOV A, #25H MOV B, #65H MUL AB Chú ý: B giữ giá trị byte cao A giữ giá trị byte thấp ; 25H * 65H = 0E99 ; B = 0EH, A = 99H 13 14 DIV AB Ví dụ: Lệnh chia (DIV) MOV A, #25 MOV B, #10 ; A = A/B, B = A mod B DIV AB ; A = 2, B = 5 Chú ý: Trường hợp chia cho 0 (thanh ghi B chứa 00H), giá trị trả về trong thanh ghi A và B không xác định. Cờ tràn (OV) được dùng để báo hiệu phép chia cho 0 (phép chia cho 0, OV được set lên bằng 1). Cờ nhớ C luôn được xóa về 0 trong mọi trường hợp. Hiệu chỉnh thập phân (DA) Lệnh hiệu chỉnh thập phân (Decimal Adjust) DA a được dùng để hiệu chỉnh giá trị 8-bit trong thanh ghi a. Được dùng để hiệu chỉnh kết quả phép cộng BCD. MOV a, #23h MOV b, #29h ADD a, b ; a 23h + 29h = 4Ch (giá trị đúng = 52) DA a ; a a + 6 = 52 15 16

Các lệnh logic Mnemonic Addressing modes (cách định địa chỉ) Execution time (µs) Operation (tác vụ) (từ gợi nhớ) DIR IND REG IMM (thời gian thực thi) ANL A, byte (A) = (A) AND (byte) x x x x 1 ANL byte, A (byte) = (byte) AND (A) x 1 ANL byte, #data8 (byte) = (byte) AND #data8 x 2 ORL A, byte (A) = (A) OR (byte) x x x x 1 ORL byte, A (byte) = (byte) OR (A) x 1 ORL byte, #data8 (byte) = (byte) OR #data8 x 2 XRL A, byte (A) = (A) XOR (byte) x x x x 1 XRL byte, A (byte) = (byte) XOR (A) x 1 XRL byte, #data8 (byte) = (byte) XOR #data8 x 2 CLR A (A) = 00H Chỉ với ACC 1 CPL A (A) = NOT(A) Chỉ với ACC 1 RL A Xoay ACC qua trái 1 bit Chỉ với ACC 1 RLC A Xoay trái qua cờ nhớ Chỉ với ACC 1 RR A Xoay ACC qua phải 1 bit Chỉ với ACC 1 RRC A Xoay phải qua cờ nhớ Chỉ với ACC 1 SWAP A Hoán đổi 2 nửa byte trong A Chỉ với ACC 1 17 anl PSW, #0xE7!! Các lệnh logic orl PSW, #0x18!! xrl P1, #0x40!!! 18 Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! xrl P1, #0x40!!! Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! ;PSW OR 00011000 xrl P1, #0x40!!! 19 20

Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! ;PSW OR 00011000 xrl P1, #0x40!!! ;P1 XRL 01000000 Các lệnh logic anl PSW, #0xE7!! ;PSW AND 11100111 orl PSW, #0x18!! ;PSW OR 00011000 xrl P1, #0x40!!! ;P1 XRL 01000000 Một số lệnh logic có thể được dùng với các toán hạng 1 bit. Ví dụ: ANL C, bit ORL C, bit CLR C CLR bit CPL C CPL bit SETB C SETB bit bit có thể là một vị trí được định địa chỉ trong RAM hoặc SFRs. 21 22 Các lệnh logic Hãy xác định nội dung của thanh ghi A sau khi thực hiện đoạn chương trình sau: MOV A, #3CH MOV R4, #66H ANL A, R4 A = 0011 1100 R4 = 0110 0110 A AND R4 = 0010 0100 = 24H Lệnh xoay (rotate) Các lệnh xoay chỉ được dùng với thanh ghi A. RL a Mov a,#0xf0 ; a% 11110000 RR a ; a% 11100001 RR a Mov a,#0xf0 ; a% 11110000 RR a ; a% 01111000 23 24

Lệnh xoay qua cờ nhớ RRC a mov a, #0A9h ; a % A9 add a, #14h ; a % BD (10111101), C%0 rrc a ; a % 01011110, C%1 RLC a C C Lệnh xoay và phép nhân/chia Quay trái 1 bit = nhân 2. Quay phải 1 bit = chia 2. mov a, #3 ; A% 00000011 (3) clr C ; C% 0 rlc a ; A% 00000110 (6) rlc a ; A% 00001100 (12) rrc a ; A% 00000110 (6) mov a, #3ch ; a % 3ch(00111100) setb c ; c % 1 rlc a ; a % 01111001, C%1 25 26 Lệnh xoay Hãy xác định giá trị của thanh ghi A sau khi thực hiện đoạn chương trình sau: CLR C MOV A, #0C3H RLC A C = 0 A = 1100 0011 Xoay trái thông qua cờ nhớ C A = 1000 0110, C = 1 Lệnh SWAP SWAP A : trao đổi nội dung hai nửa thấp và cao của thanh ghi A. mov a, #72h!! ; a 72h swap a!!!! ; a 27h 27 28

truy cập vùng nhớ dữ liệu nội: Mnemonic (từ gợi nhớ) Operation (tác vụ) 29 Addressing modes (cách định địa chỉ) Executio n time DIR IND REG IMM (µs) MOV A, (src) (A) = (src) x x x x 1 MOV dest, A (dest) = (A) x x x 1 MOV dest, src (dest) = (src) x x x x 2 MOV DPTR, #data16 (DPTR) = hằng số 16 bits x 2 PUSH direct POP direct INC SP MOV @SP, direct MOV direct, @SP DEC SP x 2 x 2 XCH A, byte Hoán đổi (A) và (byte) x x x 1 XCHD A, @Ri Hoán đổi 2 nửa byte thấp của (A) và ((Ri)) x 1 truy cập vùng nhớ dữ liệu ngoài: Address width (độ rộng địa chỉ) Các lệnh tra bảng: Mnemonic (từ gợi nhớ) 30 Operation (tác vụ) Execution time (µs) 8 bits MOVX A, @Ri Đọc RAM ngoài gián tiếp qua Ri 2 8 bits MOVX @Ri, A Ghi RAM ngoài gián tiếp qua Ri 2 16 bits MOVX A, @DPTR Đọc RAM ngoài qua DPTR 2 16 bits MOVX @DPTR, A Ghi RAM ngoài qua DPTR 2 Mnemonic (từ gợi nhớ) Operation (tác vụ) Execution time (µs) MOVC A, @A + DPTR Đọc bộ nhớ tại ((A) + (DPTR)) 2 MOVC A, @A+PC Đọc bộ nhớ tại ((A) + (PC)) 2 Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: MOV 0F0H, #12H MOV R0, #0F0H MOV A, #34H XCH A, 0F0H XCHD A, @R0 MOV 0F0H, #12H MOV R0, #0F0H MOV A, #34H XCH A, 0F0H XCHD A, @R0 ; B=12H 31 32

Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: MOV 0F0H, #12H ; B=12H MOV 0F0H, #12H ; B=12H MOV R0, #0F0H ; R0 = F0H MOV R0, #0F0H ; R0 = F0H MOV A, #34H MOV A, #34H ; A = 34H XCH A, 0F0H XCH A, 0F0H XCHD A, @R0 XCHD A, @R0 33 34 Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: Xác định giá trị của thanh ghi A và B sau đoạn chương trình sau: MOV 0F0H, #12H ; B=12H MOV 0F0H, #12H ; B=12H MOV R0, #0F0H ; R0 = F0H MOV R0, #0F0H ; R0 = F0H MOV A, #34H ; A = 34H MOV A, #34H ; A = 34H XCH A, 0F0H ; A = 12H, B = 34H XCH A, 0F0H ; A = 12H, B = 34H XCHD A, @R0 XCHD A, @R0 ; A = 14H, B = 32H a[7..4] a[3..0] R0[7..4] R0[3..0] Only 4 bits exchanged 35 36

Hãy viết đoạn chương trình chuyển nội dung chứa tại các địa chỉ 10F4H và 10F5H vào hai thanh ghi R6 và R7. MOV MOVX MOV INC MOVX MOV DPTR,#10F4H A,@DPTR R6,A DPTR A,@DPTR R7,A PUSH và POP Sau khi reset hệ thống thì SP=07H. Có 3 cách để truy cập: PUSH (cất vào ngăn xếp), POP (lấy ra khỏi ngăn xếp) và CALL (chuyển điều khiển chương trình và quay về [RET, RETI]). Để cất thông tin vào ngăn xếp, ta sử dụng lệnh PUSH. Khi đó các bước sau xảy ra: SP được tăng thêm 1. Thông tin được đặt vào địa chỉ được trỏ bởi SP. Để lấy thông tin ra khỏi ngăn xếp, ta sử dụng lệnh POP. Khi đó các bước sau xảy ra SP được giảm đi 1. Thông tin có địa chỉ được trỏ bởi SP được lấy ra. 37 38 PUSH và POP PUSH và POP MOV R6,#25h MOV R1,#12h MOV R4,#0F3h PUSH 6 PUSH 1 PUSH 4 POP 3 POP 5 POP 2 39 40

PUSH và POP Chú ý: Ngăn xếp trong 8051 tăng theo hướng địa chỉ tăng (08H, 09H,...) Ngăn xếp chiếm cùng vị trí với băng thanh ghi 1, do đó khi sử dụng ngăn xếp phải cẩn thận khi sử dụng băng thanh ghi 1 (không thể sử dụng được lúc này). Có thể giải quyết vấn đề này bằng cách ghi lại trị bắt đầu mới cho SP (các trị từ 30H đến 7FH). Ví dụ: mov sp, #0x40 ; khởi tạo SP push 0x55 ; SP SP+1, M[SP] M[55] ; M[41] M[55] pop b ; b M[55] Khi ngăn xếp tăng trưởng có khả năng lọt vào vùng có địa chỉ bit (từ byte có địa chỉ 30H). PUSH và POP Push a Push r0 Push r1 Push acc Push psw Push b Push 13h Push 0 Push 1 Pop 7 Pop 8 Push 0e0h Pop 0f0h ; không hợp lệ ; không hợp lệ ; không hợp lệ ; acc ; b 41 42 Hãy viết một đoạn chương trình liên tục lấy giá trị x từ P1 và đưa giá trị x 2 ra P2. Các lệnh rẽ nhánh không điều kiện ORG 0 MOV DPTR, #LUT ; 300H là địa chỉ đầu bảng MOV A, #0FFH MOV P1, A ; Lập trình cổng P1 để nhập dữ liệu Again: MOV A, P1 ; Đọc X MOVC A, @A+DPTR ; Lấy X 2 bằng tra bảng MOV P2, A ; Xuất X 2 ra P2 SJMP Again ; Lặp lại mãi mãi đoạn Again đến SJMP ORG 300H ; Bảng tra bắt đầu ở 0300H LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 DB 100, 121, 144, 169, 196, 225 ; LUT=Look-Up Table=Bảng tra cứu 43 44

Các lệnh rẽ nhánh có điều kiện Mnemonic JZ <rel addr> Jump if a = 0 Description JNZ <rel addr> Jump if a!= 0 JC <rel addr> Jump if C = 1 JNC <rel addr> Jump if C!= 1 JB <bit>, <rel addr> Jump if bit = 1 JNB <bit>,<rel addr> Jump if bit!= 1 JBC <bir>, <rel addr> CJNE A, direct, <rel addr> Jump if bit =1, clear bit Compare A and memory, jump if not equal Các lệnh rẽ nhánh có điều kiện More Conditional Jumps Mnemonic CJNE A, #data <rel addr> CJNE Rn, #data <rel addr> CJNE @Rn, #data <rel addr> DJNZ Rn, <rel addr> DJNZ direct, <rel addr> Description Compare A and data, jump if not equal Compare Rn and data, jump if not equal Compare Rn and memory, jump if not equal Decrement Rn and then jump if not zero Decrement memory and then jump if not zero 45 46 Các lệnh rẽ nhánh có điều kiện if condition is true goto label else goto next instruction condition false true label if a = 0 is true send a 0 to LED else send a 1 to LED led_off: skipover: jz led_off setb C mov P1.6, C sjmp skipover clr C mov P1.6, C mov A, P0 47