Giáo trình Mô phỏng vi điều khiển

LỆNH OR Dùng để OR 2 giá trị nhị phân. Ví dụ : OR AL, 12 ; OR 12 với AL, kết quả đưa vào AL OR BL, CL ; OR CL với BL, kết quả đưa vào BL

pdf141 trang | Chia sẻ: chaien | Lượt xem: 1611 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Giáo trình Mô phỏng vi điều khiển, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
, kết quả sẽ ra một số (-), trường hợp này cờ sign sẽ được đặt vào. - Có thể sử dụng lệnh JS, JS để kiểm tra lại kết quả khi sử dụng lệnh CMP. Lệnh so sánh hai thanh ghi : sử dụng hai thanh ghi để so sánh . Ví dụ : Lệnh CMP Al, BL Mã máy DA 00, 01 Trong đó : DA : mã của lệnh so sánh hai thanh ghi. 00 : thanh ghi AL 75/139 01 : thanh ghi BL . Nếu hai thanh ghi có giá trị bằng nhau, thì đặt cờ Z . Nếu thanh ghi thứ nhất AL có giá trị lớn hơn thanh ghi thứ hai, thì đặt S . Các trường hợp còn lại thì sẽ không đặt cờ vào. Lệnh so sánh tức thời : so sánh giữa thanh ghi với một số bất kỳ. Ví dụ : Lệnh CMP AL, 0D Mã máy DB 00, 0D Trong đó : DB : chỉ mã của lệnh CMP 00 : thanh ghi AL 0D : con số cần so sánh . Nếu giá trị của thanh ghi bằng với số cần so sánh, thì đặt cờ Z. . Nếu thanh ghi có giá trị lớn hơn số thì đặt cờ S. . Không đặt cờ cho các trường hợp còn lại. + Lệnh so sánh gián tiếp : so sánh thanh ghi với một dữ liệu có địa chỉ chứa trong RAM Ví dụ : Lệnh CMP CL, [20] Mã máy DC 02, 20 Trong đó : DC : mã lệnh. 02 : thanh ghi CL. 76/139 20 : dữ liệu có địa chỉ trong RAM cần so sánh với thanh ghi. - Nếu thanh ghi có giá trị bằng giá trị của con số, thì đặt cờ Z - Nếu thanh ghi CL có giá trị lớn hơn giá trị của số cần so sánh thì đặt cờ. - Các trường hợp còn lại thì không đặt cờ. Các lệnh này không sử dụng việc đặt cờ Z, S hoặc O Sau khi đưa các dữ liệu vào ngăn xếp, phải đặt đúng theo thứ tự đã bị đa ngược vì ngăn xếp làm việc theo quy tắc xử lý ngõ ra cuối cùng trước sau đó mới đến ngõ ra đầu tiên ( quy luật LIFO : last in first out ). Ngăn xếp được sử dụng để : + Lưu nội dung của thanh ghi để sau đó khôi phục lại . + Ðưa các tham số vào thủ tục sau đó quay về kết quả Nội dung của thanh ghi được lưu trữ trong ngăn xếp sau đó sẽ được khôi phục lại, ngăn xếp làm việc theo nguyên tắc LIFO ( vào sau cùng ra trước hết) . Lệnh PUSH : được sử dụng để đặt dữ liệu vào ngăn xếp. . Lệnh POP : được sử dụng để lấy dữ liệu ra khỏi ngăn xếp. Ví dụ : 1) Lệnh PUSH BL Mã máy E0 01 Trong đó : E0 : mã máy của lệnh PUSH 77/139 01 : thanh ghi BL 2) Lệnh POP BL Mã máy E1 01 Trong đó : E1 : mã lệnh POP 01 : thanh ghi BL Ngăn xếp có thể lưu trữ và khôi phục lại các cờ của thanh ghi. Ví dụ : 1) Lệnh PUSHF Mã máy EA Trong đó : EA : mã máy của lệnh PUSHF 2) Lệnh POPF Mã máy EB Trong đó : EB mã của lệnh POPF - Sử dụng các thanh ghi sẵn có. 78/139 - Không đặt cờ Z, O, S Các cờ và thanh ghi được lưu bởi các thủ tục hay ngắt và được khôi phục lại sau khi thủ tục hay ngắt hoàn thành công việc của nó. . Sử dụng lệnh PUSH và PUSHF để lưu . Sử dụng lệnh POP và POPF để phục hồi. Cách gọi một thủ tục: Xem ví dụ sau : Lệnh CALL 30 Mã máy CA 30 CA : mã lệnh CALL 30 : địa chỉ bắt đầu của thủ tục được gọi Quay trở lại từ một thủ tục : Lệnh RET Mã máy CB Kết thúc một thủ tục thì sử dụng lệnh RET và quay trở về chương trình tới lệnh sau lệnh CALL. Mã máy của lệnh RET là CB. Cách gọi lệnh Interrup thông thường : Lệnh INT 03 Mã máy CC 03 CC : mã lệnh của INT, 03 : địa chỉ của vectơ ngắt sử dụng bởi lệnh INT 03 : vectơ ngắt thuộc vùng lưu trữ RAM, đây là địa chỉ bắt đầu của mã ngắt. Chương trình nhảy về địa chỉ của mã ngắt và thực hiện việc ngắt. Quay trở lại từ một lệnh ngắt : Lệnh IRET 79/139 Mã máy CD Mã ngắt sau cùng là lệnh IRET, quay trở lại chương trình sử dụng lệnh A. Mã máy của lệnh IRET là CD. Quay trở lại địa chỉ mà chương trình chuyển đến sau khi thực hiện việc ngắt và lưu trong ngăn xếp. Không đặt các cờ Z, S, O Các port được nối đến bộ mô phỏng và đưa ra ngoài. IN 00 : đọc từ bàn phím, nhập từ bàn phím OUT 01 : xuất dữ liệu ra điều khiển đèn giao thông Ví dụ : Lệnh IN 00 Mã máy F0 00 FO : mã máy của lệnh IN, dữ liệu được đưa vào từ 1 port 00 : chỉ số port mã dữ liệu xuất ra. Bộ mô phỏng gồm có các port : 0HEX đến 0FHEX Lệnh OUT 01 Mã máy F1 01 F0 : mã máy của lệnh OUT, dữ liệu được đưa ra các port 80/139 01 : chỉ vị trí của port Bao gồm : HALT, MOP, CLO, ORG, DB, CLI, STI Các lệnh này không đặt các cờ Z, S, O Chú ý : CLI : lệnh xóa cờ I SET : lệnh đặt cờ I ? Lệnh HALT : lệnh dừng chương trình Lệnh HALT Mã máy 00 00: mã lệnh của HALT Chương trình sẽ ngừng nếu gặp lệnh HALT, chương trình sẽ chạy lại nếu hủy bỏ lệnh này. Bạn có thể sử dụng một vài lệnh HALT trong một chương trình và chỉ sử dụng đúng một lệnh END. ? Lệnh NOP : không làm gì trong một chu kỳ xung Lệnh NOP Mã máy FF FF : chỉ mã của lệnh NOP. Chương trình sẽ không làm gì cho một chu kỳ xung clock, sau đó chương trình sẽ hoạt động trở lại. NOP được sử dụng như một thủ tục delay cho phép giữa các mạch điện với CPU và khi đó gọi là "trạng thái chờ ". 81/139 ? Lệnh CLO : đóng tất cả cửa sổ của các chương trình khác. Lệnh CLO Mã máy FE FE : mã lệnh CLO Chỉ được sử dụng mã này trong bộ mô phỏng, và dùng để đóng các cửa sổ của chương trình khác. Việc này rất cần thiết vì màn hình lúc đó sẽ không có chương trình khác, không tạo ra sự lẫn lộn. ? Lệnh ORG : Mã gốc Mã được phát sinh từ một địa chỉ bắt đầu lớn hơn 0, việc này thì hữu dụng để đặt các thủ tục , các ngắt hay bảng dữ liệu tại địa chỉ trong vùng nhớ. ORG 30 Không có mã máy nào được phát ra nhưng địa chỉ thường đặt ở dữ liệu bắt đầu là 30 ? Lệnh DB : định nghĩa biến kiểu byte hay chuỗi Là một cách tiện lợi khi đưa chuỗi mã ASCII vào vùng nhớ RAM DB " HELLO" Mã ASCII của "H,E,L,L,O" được chuyển vào RAM DB FF Ðây cũng là một cách để chuyển giá trị Hex vào RAM. Có thể sử dụng để nhận biết sự kết thúc của chuỗi với mã ZERO, các vectơ ngắt có thể được chuyển vào cùng với DB. Bảng dữ liệu của mã Hex cũng được tải vào, mã của CPU có thể chuyển mô?t cách trực tiếp, nó làm việc tương tự như cách làm việc mà người biên dịch mong muốn. ? Lệnh CLI : xóa cờ I (xóa cờ cho phép ngắt) Nếu cờ I bị xóa thì phần cứng bị ngắt. Ðây là trạng thái mặc định trong chương trình mô phỏng. Khởi động lại CPU thì cờ I vẫn bị xóa, trong thời gian bị ngắt thì phần cứng không làm việc. 82/139 ? Lệnh STI : thiết lập cờ I (lập cờ cho phép ngắt) Nếu như cờ I được thiết lập thì bộ mô phỏng sẽ tạo ra lệnh INT 02 tại khoảng thời gian bình thường,việc này rất cần thiết khi có vector ngắt được lưu tại địa chỉ 02 mà chỉ đến mã điều khiển ngắt ở nơi khác. Nếu việc ngắt xuất hiện nhanh hơn việc xử lý thì việc phá huỷ hệ thống mô phỏng sẽ xảy ra. Ðiều chỉnh tốc độ xung clock CPU và khoảng thời gian để ngăn ngừa trường hợp này. Dec Hex Dec Hex Dec Hex Dec Hex -128 80 -127 81 -126 82 -125 83 -124 84 -123 85 -122 86 -121 87 -120 88 -119 89 -118 8A -117 8B -116 8C -115 8D -114 8E -113 8F -112 90 -111 91 -110 92 -109 93 -108 94 -107 95 -106 96 -105 97 -104 98 -103 99 -102 9A -101 9B -100 9C -099 9D -098 9E -097 9F -096 A0 -095 A1 -094 A2 -093 A3 -092 A4 -091 A5 -090 A6 -089 A7 -088 A8 -087 A9 -086 AA -085 AB -084 AC -083 AD -082 AE -081 AF 83/139 -080 B0 -079 B1 -078 B2 -077 B3 -076 B4 -075 B5 -074 B6 -073 B7 -072 B8 -071 B9 -070 BA -069 BB -068 BC -067 BD -066 BE -065 BF -064 C0 -063 C1 -062 C2 -061 C3 -060 C4 -059 C5 -058 C6 -057 C7 -056 C8 -055 C9 -054 CA -053 CB -052 CC -051 CD -050 CE -049 CF -048 D0 -047 D1 -046 D2 -045 C3 -044 D4 -043 D5 -042 D6 -041 D7 -040 D8 -039 D9 -038 DA -037 DB -036 DC -035 DD -034 DE -033 DF -032 E0 -031 E1 -030 E2 -029 E3 -028 E4 -027 E5 -026 E6 -025 E7 -024 E8 -023 E9 -022 EA -021 EB -020 EC -019 ED -018 EE -017 EF -016 F0 -015 F1 -014 F2 -013 F3 -012 F4 -011 F5 -010 F6 -009 F7 -008 F8 -007 F9 -006 FA -005 FB -004 FC -003 FD -002 FE -001 FF 84/139 Dec Hex Dec Hex Dec Hex Dec Hex +000 00 +001 01 +002 02 +003 03 +004 04 +005 05 +006 06 +007 07 +008 08 +009 09 +010 0A +011 0B +012 0C +013 0D +014 0E +015 0F +016 10 +017 11 +018 12 +019 13 +020 14 +021 15 +022 16 +023 17 +024 18 +025 19 +026 1A +027 1B +028 1C +029 1D +030 1E +031 1F +032 20 +033 21 +034 22 +035 23 +036 24 +037 25 +038 26 +039 27 +040 28 +041 29 +042 2A +043 2B +044 2C +045 2D +046 2E +047 2F +048 30 +049 31 +050 32 +051 33 +052 34 +053 35 +054 36 +055 37 +056 38 +057 39 +058 3A +059 3B +060 3C +061 3D +062 3E +063 3F +064 40 +065 41 +066 42 +067 43 85/139 +068 44 +069 45 +070 46 +071 47 +072 48 +073 49 +074 4A +075 4B +076 4C +077 4D +078 4E +079 4F +080 50 +081 51 +082 52 +083 53 +084 54 +085 55 +086 56 +087 57 +088 58 +089 59 +090 5A +091 5B +092 5C +093 5D +094 5E +095 5F +096 60 +097 61 +098 62 +099 63 +100 64 +101 65 +102 66 +103 67 +104 68 +105 69 +106 6A +107 6B +108 6C +109 6D +110 6E +111 6F +112 70 +113 71 +114 72 +115 73 +116 74 +117 75 +118 76 +119 77 +120 78 +121 79 +122 7A +123 7B +124 7C +125 7D +126 7E +127 7F 86/139 Phụ lục B Giải các bài tập củng cố BÀI TẬP SỐ 1: 1.1/ Viết chương trình sử dụng lệnh SUB Tương tự chương trình trên nhưng ta sử dụng lệnh SUB thay cho lệnh ADD để trừ 2 số và kết quả được lưu vào thanh ghi AL. ; chương trình trừ 2 số Hex CLO MOV AL,2 MOV BL,2 SUB AL, BL END ; kết thúc chương trình . 1.2/ Viết chương trình sử dụng lệnh MUL Tương tự chương trình trên nhưng ta sử dụng lệnh MUL để nhân 2 số và kết quả được lưu vào thanh ghi AL ; chương trình nhân 2 số Hex CLO MOV AL,2 MOV BL,2 MUL AL, BL END ; kết thúc chương trình . 87/139 1.3/ Viết chương trình chia 2 số sử dụng lệnh DIV ; chương trình chia 2 số Hex CLO MOV AL,2 MOV BL,2 DIV AL, BL END ; kết thúc chương trình . 1.4/ Viết chương trình chia cho 0 ; chương trình chia cho 0 MOV AL,10 MOV BL,0 DIV AL,BL BÀI TẬP SỐ 2: Sử dụng help page trong số Hex và số nhị phân. Tìm ra những số Hex sẽ làm hoạt động của đèn thay đổi. Từ đó hãy sửa đổi chương trình của đèn giao thông để hoạt động theo trình tự trong thực tế. Giảng giải: Ðể thực hiện chương trình . ta phải xem các bit nào làm cho đèn sáng theo trình tự thực tế thì cho lên 1, các bit còn lại bằng 0, 2 bit LSB không sử dụng thì cho bằng 0. Từ đó tìm ra số Hex tương ứng để viết chương trình . 88/139 ; chương trình điều khiển đèn giao thông thực tế CLO ; đóng tất cả các cửa sổ không cần thiết Start : MOV AL, 84 ; chuyển 84h vào thanh ghi AL OUT 01 ; xuất ra port 1 MOV AL, 88 ; chuyển 88h vào thanh ghi AL OUT 01 ; xuất ra port 1 MOV AL,30 ; chuyển 30h vào thanh ghi AL OUT 01 ; xuất ra port 1 MOV AL,50 ; chuyển 50h vào thanh ghi AL OUT 01 ; xuất ra port1 JMP Start ; nhảy về nhãn Start để thực hiện lại END ; kết thúc chương trình BÀI TẬP SỐ 3: Viết chương trình hiển thị chữ HELLO. Hãy tra bảng mã ASCII của các mẫu tự H,E,L,L,O và copy những giá trị này vào bộ nhớ C0, C1,C2,C3,C4. Ðây là việc đơn giản và có phần thô trong việc hiển thị văn bản, trong việc sắp xếp bộ nhớ để hiển thị. Giảng giải: Ðể viết chương trình trên, đầu tiên ta phải tra cứu mã ASCII của các mẫu tự H,E,L,L,O và đưa các mã ASCII đến địa chỉ RAM [C0],[C1],[C2],[C3], [C4]. Chạy chương trình và xem văn bản xuất hiện như thế nào trong việc mô phỏng trên màn hình hiển thị VDU. Ðiều này là những gì xãy ra trong PC của IBM khi đang chạy trong hệ điều hành MS DOS. 89/139 Bạn nên làm bài tập này và nếu bạn đang học lập trình ngôn ngữ thấp thì bạn sẽ học có hiệu quả hơn và có nhiều cách linh động hơn để giải quyết vấn đề. Chương trình : CLO ; đóng các cửa sổ không cần thiết Start: MOV AL,48 ; đưa 48 vào thanh ghi AL MOV [C0], AL ; đưa dữ liệu trong AL ra màn hình MOV AL,45 MOV [C1],AL MOV AL,4C MOV [C2],Al MOV AL,4C MOV [C3],AL MOV AL,4F MOV [C4],AL END. ; kết thúc chương trình BÀI TẬP SỐ 4: 4.1/ Viết chương trình đếm lùi lại sử dụng DEC BL. ; chương trình đếm lùi MOV BL, 40 Rep : DEC BL ; giảm BL xuống 1 90/139 JMP Rep END 4.2/ Viết chương trình đếm lên 3 sử dụng lệnh Add BL,3 ; chương trình đếm lên 3 MOV BL, 40 Rep : Add BL,3 ; cộng thêm 3 vào BL JMP Rep END 4.3/ Viết chương trình đếm 1,2,4,8,16 sử dụng lệnh MUL BL,2 ; chương trình đếm 1, 2, 4, 8, 16 MOV BL,01 Rep : MUL BL,2 ; nhân 2 vào BL JMP Rep END 4.4/Viết chương trình đếm theo dãy số sau 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, tràn bộ nhớ . ; Ðếm theo dãy số trên kết quả hiển thị trên ô nhớ [40] và [70] trên RAM MOV AL,0 ; Giá trị khởi điểm thứ nhất lưu trong AL MOV BL,1 ; Giá trị khởi điểm thứ hai lưu trong BLRep: MOV [70],AL MOV [40],BL ADD AL,BL 91/139 ADD BL,AL JMP Rep ; Lặp lại phép cộngEND ; _____ Kết thúc chương trình________________________________________ BÀI TẬP SỐ 5 5.1/ Viết chương trình hiển thị mỗi ký tự tại vị trí đầu bên trái của màn hình VDU bằng việc copy tất cả chúng tới địa chỉ [C0] Thí dụ ta muốn đưa chữ H ra vị trí đầu bên trái màn hình VDU thì ta phải tra mã ASCII của chữ H và mov vào thanh ghi AL, rồi từ đó copy vào [CO] Chương trình: CLO START : MOV AL, 48 MOV [C0], AL END 5.2/ Viết chương trình sử dụng thanh ghi BL để chỉ tới địa[C0] và tăng BL sau mỗi lần phím nhấn theo thứ tự để thấy được văn bản bạn gõ. Chương trình: ;Chương trình hiện chữ khi nhấn, nhấn Enter kết thúc chương trình MOV BL,C0 Start: IN 00 CMP AL,0D JZ Stop 92/139 MOV [BL],AL INC BL JMP Start Stop: END 5.3/ Viết chương trình nhập mã số để mở máy với yêu cầu cụ thể như sau: khi chương trình đã khởi động muốn thoát khỏi chương trình phải tuần tự gỏ đúng thứ tự ba chữ cái A,N,H (đúng cã thứ tự); nếu gỏ sai chương cứ chạy lẩn quẩn không thoát ra được. ; Nhập phím nhấn từ bàn phím cho đến khi phím enter được nhấn ------------ CLO Rep : IN 00 ;Kiểm tra có phải chữ A không? CMP AL,0D JNZ Rep IN 00 ; Có phải chữ N không? CMP AL,0D JNZ Rep IN 00 ; Có phải chữ H không? CMP AL,0D JNZ Rep 93/139 ; Nếu đúng là ba chữ A,N,H nhập theo thứ tự thì thoát khỏi chương trình END BÀI TẬP SỐ 6: Viết chương trình đèn giao thông và sử dụng thủ tục này để thiết lập thời gian trì hoãn giống thực tế. Ðể hiển thị đèn giao thông đúng thực tế ta cho Ðỏ: 10s, Xanh: 8s, Vàng 2s. ;chương trình hiển thị đèn giao thông theo thực tế CLO Start: MOV AL,84 ;đỏ 1 + xanh 2 OUT 01 ;xuất ra port 1 MOV AL,8 ;trì hoãn 8s CALL 30 ;gọi thủ tục tại địa chỉ [30] MOV AL,88 ;đỏ 1 + vàng 2 OUT 01 MOV AL,2 ;trì hoãn 2s CALL 30 MOV AL,30 ;xanh 1 + đỏ 2 OUT 01 94/139 MOV AL,8 ;trì hoãn 8s CALL 30 MOV AL,50 ;vàng 1 + đỏ 2 OUT 01 MOV AL,2 ;trì hoãn 2s CALL 30 JMP Start ;nhảy về nhãn Start ;thủ tục trì hoãn được lưu ở địa chỉ [30] ORG 30 PUSH AL PUSHF Rep: DEC AL JNZ REP POPF POP AL RET END BÀI TẬP SỐ 7:7.1/ Viết một chương trình sử dụng 3 thủ tục. Bao gồm thủ tục đọc văn bản từ bàn phím và cất vào RAM, thủ tục thứ 2 nên chuyển đổi trường hợp các ký tự chữ hoa trong văn bản thành chữ thường. Thủ tục 3 nên hiển thị văn bản trên màn hình VDU. 95/139 ; --------------------------------------------------------------; Chương trình chính MOV BL,70 ; [70]là địa chỉ mã ASCII của ký tự đầu tiên trên VDU.CALL 10 ; goi? thủ tục nhập chuỗi ký tựCALL 90 ; goi? thủ tục chuyển chữ thường thành chữ hoa CALL 40 ; goi? thủ tục hiển thị chuỗi ký tự trên VDUHALT ; không được dùng END tại đây; -------------------------------------------- ------------------; goi thủ tục nhập chuỗi ký tựORG 10 ; khởi đầu thủ tục tại địa chỉ [10]PUSH AL ; lưu trữ trạng thái thanh ghiPUSH BL PUSHF Rep:IN 00 ; nhập ký tự từ bàn phímCMP AL,0D ; có phải phím Enter không?JZ Stop ; nếu phải nhảy đến StopMOV [BL],AL ; Nhập phím nhấn vào RAM tại ô nhớ được chỉ ra bởi BLINC BL ; BL chỉ ra vị trí kế tiếp mà ký tự sẽ nhập vàoJMP Rep ; Nhảy về Rep ( chuẩn bị nhập phím kế tiếp)Stop:MOV AL,0 ; Nhập khoảng trắngMOV [BL],AL POPF ; phục hồi trạng thái thanh ghiPOP BL POP AL RET ; kết thúc thủ tục; ------------------------ --------------------------------------; CHUYỂN CHỮ THƯỜNG THÀNH CHỮ HOAORG 90 PUSH AL PUSH BL PUSHFCHUYEN:MOV AL,[BL] ; Có ký tự nào nhập và tại ô nhớ [BL]? CMP AL,0 ; nếu không thoát ra NGUNGJZ NGUNGSUB AL,20 ;nếu có, chuyển sang chữ hoaMOV [BL],ALINC BLJMP CHUYENNGUNG: POPF ; khôi phục trạng thái thanh ghi POP BL POP ALRET;---------------------------------------------------------------; THỦ TỤC HIỂN THỊ KÝ TỰ TRÊN MÀN HÌNHORG 40 ; HERE:MOV CL,C0 ; XEM CHÚ GIẢI Ở BÀI TẬP 7 MOV BL,70 START: MOV AL,[BL] CMP AL,0 JZ END1 MOV [CL],AL INC CL INC BL JMP START END1: ; --------------------------------------------- -----------------END BÀI TẬP SỐ :8.1/ Sử dụng bảng dữ liệu viết chương trình điều khiển đèn giao thông theo thực tế. Ta phải tìm số nhị phân nào làm cho đèn sáng tương ứng và sau đó đổi qua số hex Ta có thể quy ước : Ðỏ 1 - Xanh 2 sáng : 1000 0100 Ðỏ 1 - Vàng 2 sáng : 1000 1000 Xanh 1 - Ðỏ 2 sáng : 0011 0000 Vàng 1 - Ðỏ 2 sáng : 0101 0000 96/139 Chương trình: ;đèn giao thông sáng theo thực tế JMP Start DB 84 DB 88 DB 30 DB 50 Start: MOV BL,02 Rep: MOV AL,[BL] OUT 01 CMP AL,50 JZ Start INC BL JMB Rep END 8.2/ Viết chương trình điều khiển động cơ bước chạy bước ;động cơ bước chay bước JMP START 97/139 DB 1 DB 3 DB 2 DB 6 DB 4 DB 0C DB 8 DB 9 START: MOV BL,02 REP: MOV AL,[BL] OUT 05 CMP AL,9 JZ STOP INC BL JMP REP STOP: END BÀI TẬP SỐ 9: 9.1/Viết thủ tục nhân đôi một số, cứ một tham số trong thủ tục thì sử dụng 1 thanh ghi. Sử dụng cùng thanh ghi để quay trở về lại kết quả. 98/139 ; Nhảy qua bảng thông số ---------------------------------------------------- JMP Start DB 00 DB 00 Start: MOV AL,5 ;giữ 1 byte của RAM tại địa chỉ 02 MOV BL,2 ;giữ 1 byte của RAM tại địa chỉ 03 CALL 30 ;gọi thủ tục nhân đôi ;Thủ tục nhân đôi một số ------------------------------------------------------ ;Các tham số thông qua trong thủ tục sử dụng AL và BL ;Kết quả đưa vào AL ORG 30 ;bắt đầu tại địa chỉ 30 MUL AL,BL ;nhân AL với 2, kết quả lưu trong AL RET ;kết thúc chương trình con, quay trở về từ thủ tục END ;kết thúc chương trình ;----------------------------------------------------------------------------------- 9.2/ Viết thủ tục đảo tất cả các bit trong byte (tất cả số 0 thành 1, số 1 thành 0). Chuyển giá trị được xử lý vào thủ tục bằng cách sử dụng vị trí RAM. Quay trở về kết quả trong cùng vị trí RAM. ; Nhảy qua bảng thông số ---------------------------------------------------- JMP Start DB 00 99/139 Start: ;sử dụng vị trí RAM để đưa các tham số vào trong 1 thủ tục MOV AL,3 MOV [02],AL CALL 40 ;gọi thủ tục đảo dấu ;Thủ tục đảo tất cã các bit --------------------------------------------------- ;Các tham số thông qua trong thủ tục sử dụng vị trí RAM ;Kết quả lưu vào vị trí RAM ORG 40 ;bắt đầu tại địa chỉ 40 PUSH CL ;lưu các thanh ghi và các cờ vào ngăn xếp PUSHF MOV CL,[02] ;tìm nạp tham số từ RAM NOT CL POPF ;khôi phục lại thanh ghi ban đầu và giá trị cờ POP CL RET ;kết thúc chương trình con END ;kết thúc chương trình ;----------------------------------------------------------------------------------- BÀI TẬP SỐ 10: Viết một chương trình ngắt nạp phím nhấn và lưu vào RAM. ; --------------------------------------------------------------; Ngắt mềm 100/139 ;---------------------------------------------------------------Jmp Start ; nhảy qua bảng dữ liệu của ảng vector ngắtDB 51 ; vector tại ô nhớ 02 chỉ tới địa chỉ 51Start:INT 02 ; ngắt 02; --------------------------------------------------------------ORG 50DB 70; ----------------------------------------------------------------; Nhập văn bảng vào từ bàn phím, việc nhập kết thúc khi nhấn ENTER.; ---------------------------------------------------------- ------MOV BL,C0 ; định địa chỉ sẽ hiển thị trên VDU (góc trái màn hình)Start1:IN 00 ; Nhập từ bàn phím vào thanh ghi AL.CMP AL,0D ; Có phải phím ENTER ? JZ Stop ; Nếu phải thì nhảy về Stop.MOV [BL],AL ; Chuyển ký tự vừa nhập trong AL vào VDU ở ; địa chỉ mà BL chỉ đếnINC BL ; BL chỉ ra vị trí kế tiếp trên VDU.JMP Start ; Trở về lại nhãn start.Stop:IRETEND BÀI TẬP 11 1/ Viết chương trình kiểm tra bộ định thời tạo xung ngắt trong chương trình mô phỏng. ; --------------------------------------------------------------; Chương trình minh hoạ sự tác động của bộ định thời tạo tín hiệu ngắt cứng ; Trong Configuration Tab, khoảng thời gian là 5 ; nghĩa là sau mỗi 5 giây sẽ có một lệnh INT02 được gọi từ bộ định thời phần ; cứng tác động lên chương trình Jmp StartDB 40Start:STIRep:NOPNOPNOPNOPNOPNOPJMP RepORG 40NOPNOPNOPNOPNOPNOPIRETEND 2/Dùng lệnh CLI và STI để kiểm tra sự tác động của ngắt cứng lên CPu trong chương trình mô phỏng. ; --------------------------------------------------------------; Sử dụng lệnh CLI và STI để xoá và đặt cờ I ; Chương trình kiểm tra chức năng của ngắt cứng 02; --------------------------------- -----------------------------JMP StartDB 40 ; Vector ngắt tại địa chỉ 02Start:nopnopnopclinopnopnopstijmp Start; -------------------------------------------------- ------------org 40NOPNOPNOPNOPNOPIRET; ----------------------------------------------- ---------------end ;--------------------------------------------------------------- 3/Viết chương trình điều khiển đồng thời đèn giao thông khi về khuya (chỉ có đèn vàng ở mỗi cột nhấp nháy) cùng mạch đếm từ 0 đến 9 lập đi lập lại nhiều lần, hiển thị kết quả 101/139 trên một led 7 đoạn. Nếu bạn muốn phần cứng đếm từ 00 đến 99 thì sử dụng cả 2 led hiển thị cùng một lúc. ; --------------------------------------------------------------Jmp Start ; nhảy qua bảng dữ liệuDB 50 ; vec tơ ngắt cứngDB FA ; Bảng dữ liệu bắt đầu ở địa chỉ [03]DB 0ADB B6DB 9EDB 4EDB DCDB FCDB 8ADB FEDB CE ; dữ liệu cuối cùng trong bảng.DB 03 ; Ðịa chỉ bắt đầu của bảng dữ liệu; ----------------------------------------------------------- ---Start:STI ; Cho phép ngắt cứng tác động Mov BL,03 ; BL chứa địa chỉ khởi đầu của bảng dữ liệuRep:MOV AL,[BL] ; chuyển dữ liệu từ bảng vào ALOUT 02 ; hiển thị LED CMP AL,CE ; Có phải cuối bảng chưaJZ Start ; Nếu cuối, nhảy đến StartINC BL ; vị trí kế tiếp của bảngJMP Rep ; Nhảy trở về và thực hiện với con số kế tiếpJMP Start; --------------------------------------------------------------ORG 50push al ;lưu trữ trạng thái thanh ghipush bl ;pushf ; Jmp PastDataDB 40 ; vàng trái sángDB 08 ; vàng phải sángDB 57 ; qua bảngPastData:MOV BL,[59] ; BL chỉ đến bảng dữ liệuMOV AL,[BL] ; chuyển dữ liệu từ bảng vào ALOUT 01 ; hiển thị đèn giao thôngCMP AL,08 ; Có phải dữ liệu cuối cùng của bảngJZ Reset ; Nếu cuối, đến ResetINC BL ; BL chỉ đến vị trí kế tiếpMOV [59],BL ; Lưu giá trị con trỏ lệnh vào RAMJMP StopReset:MOV BL,57 ; Ðến địa ch3 khởi điểm của bản dữ liệuMOV [59],BL ; Lưu con trỏ lệnh vào ô nhớ 54 trên RAM Stop:popf ; phục nguyên trang thái thanh ghipop bl pop al IRET; --------------------------------------------------------------END; ------- ------------------------------------------------------- Lời giải phần bài tập tổng hợp BÀI TẬP 1.1 Ứng dụng vòng lập. CLO ; -------------------------------------------------------- Start: MOV AL,84 OUT 01 LOOP1: INC AL CMP AL,8a JNZ LOOP1 MOV AL,88 OUT 01LOOP2: 102/139 INC AL CMP AL,8a JNZ LOOP2 MOV AL,30 OUT 01LOOP3: INC AL CMP AL,39 JNZ LOOP3 MOV AL,50 OUT 01LOOP4: INC AL CMP AL,53 JNZ LOOP4 JMP StartEND ;----------------------------------------------------------------------------------- BÀI TẬP 1.2: Sử dụng thủ tục định thời. ;chương trình hiển thị đèn giao thông CLO Start: MOV AL,84 ;đỏ 1 + xanh 2 OUT 01 ;xuất ra port 1 MOV AL,8 ;trì hoãn 8s CALL 30 ;gọi thủ tục tại địa chỉ [30] MOV AL,88 ;đỏ 1 + vàng 2 OUT 01 MOV AL,2 ;trì hoãn 2s CALL 30 MOV AL,30 ;xanh 1 + đỏ 2 OUT 01 MOV AL,8 ;trì hoãn 8s 103/139 CALL 30 MOV AL,50 ;vàng 1 + đỏ 2 OUT 01 MOV AL,2 ;trì hoãn 2s CALL 30 JMP Start ;nhảy về nhãn Start ;thủ tục trì hoãn được lưu ở địa chỉ [30] ORG 30 PUSH AL PUSHF Rep: DEC AL JNZ REP POPF POP AL RET END ;------------------------------------------------------------------------------ BÀI TẬP 1.3: Sử dụng bảng dữ liệu. Ta có thể quy ước : 104/139 Ðỏ 1 - Xanh 2 sáng : 1000 0100 Ðỏ 1 - Vàng 2 sáng : 1000 1000 Xanh 1 - Ðỏ 2 sáng : 0011 0000 Vàng 1 - Ðỏ 2 sáng : 0101 0000 Chương trình: JMP Start DB 84 DB 88 DB 30 DB 50 Start: MOV BL,02 Rep: MOV AL,[BL] OUT 01 CMP AL,50 JZ Start INC BL JMP Rep END BÀI TẬP 2.2: 105/139 ;GHI VÀO MÀN HÌNH VDU--------------------------------------------- CLO ;đóng các cửa sổ khác lại JMP HERE ;nhảy qua bảng dữ liệu DB "HELLO WORLD" ;nạp chuỗi ký tự vào RAM DB 0 ;kết thúc chuỗi ký tự hiển thị đoạn văn bản HERE: MOV CL,C0 ;định ra địa chỉ đầu tiên trên màn hình MOV BL,03 ;địa chỉ bắt đầu của đoạn văn bản START: MOV AL,[BL] ;đưa ký tự trong chuỗi vào AL CMP AL,0 ;kết thúc chuỗi ký tự chưa? JZ END ;nếu đã kết thúc nhảy ra khỏi vòng lặp đến END MOV CL,[AL] ;nếu chưa kết thúc lưu ký tự vừa hiển thị vào VDU INC CL ;định ra vị trí kế cận ký tự vừa hiển thị xong INC BL ;đưa ký tự kế tiếp trong chuỗi vào BL JMP START ;trở về start END1: ; ----- XOÁ MÀN HÌNH VDU ----------------------------------- MOV CL,C0 ;định ra địa chỉ đầu tiên trên màn hình VDU MOV BL,0C ; địa chỉ bắt đầu xoá MOV AL,20 ; chèn khoảng trốngREP: MOV [CL],AL ; Xoá từng chữ INC CL DEC BL ; Giảm dần BL JNZ REP ; thoát khi xoá hoàn tất JMP HERE ; trở về lại từ đầu; ---------------------------------- ---------------------------- END; -------------------------------------------------------------- 106/139 BÀI TẬP 3.1: Viết chương trình điều khiển động cơ bước quay thuận với mỗi bươc quay là 5 độ (quay 1/2 bước). Start : MOV AL,1 OUT 05 MOV AL,3 OUT 05 MOV AL,2 OUT 05 MOV AL,06 OUT 05 MOV AL,04 OUT 05 MOV AL,0C OUT 05 MOV 08 OUT 05 MOV AL,09 OUT 05 JMP Start END? 107/139 Chương trình sẽ ngắn hơn khi sử dụng bảng dữ liệu. BÀI TẬP 3.2: Viết chương trình điều khiển động cơ bước quay thuận 90 độ; nghịch 35 độ sau đó dừng lại. Giải tương tự như bài 3.1 nhưng dừng ở 1/2 bước cuối lúc quay nghịch 35 độ. BÀI TẬP 4.1: Ở đây ta sử dụng port 04, gửi giá trị FF đến thanh ghi AL để xác lập lại rắn. Lên, xuống bên trái và bên phải được điều khiển bởi 4 bit trái. Bốn bit phải điều khiển quãng đường di chuyển. Chương trình: ORG 30 ;bảng dữ liệu để rắn chạy trong ma trận: thiết bị lái DB 4F ;xuống 0B DB 1D ;phải 3 DB 8B ;lên 8 DB 1D ;phải 3 DB 4E ;xuống 6 DB 1E ;phải 3 DB 8E ;lên 9 DB 2F ;trái 5 DB 8C ;lên 3 DB 1F ;phải 8 DB 4E ;xuống 0C 108/139 ORG 40 ;bảng dữ liệu để rắn chạy trong ;ma trận: khoảng cách DB 0B ;xuống 0B DB 3 ;phải 3 DB 8 ;lên 8 DB 3 ;phải 3 DB 6 ;xuống 6 DB 3 ;phải 3 DB 9 ;lên 9 DB 5 ;trái 5 DB 3 ;lên 3 DB 8 ;phải 8 DB 0C ;xuống 0C START: MOV AL,FF OUT 04 MOV CL,30 MOV DL,40 MORE: MOV AL,[CL] MOV BL,[DL] CMP AL,0 JZ START 109/139 REP: OUT 04 DEC BL JNZ REP INC CL INC DL JMP MORE END BÀI TẬP 4.2 Gợi ý lập trình tương tự bài tập 11.3, thay thế hai chương trình thành phần bằng chương trình điều khiển rắn trong mê cung và đóng điên lò sấy. BÀI TẬP 5 Hãy viết chương trình đều khển thang máy theo các nút nhấn lên xuống có trong giao diện phần cứng ở port 06. ;Chương trình điều khiển thang máy MOV AL,0 OUT 06 LOOP: IN 06 ;kiểm tra thang máy tại đỉnh hầm thang máy PUSH AL 110/139 POP BL AND BL,5 ;kiểm tra động cơ và nút nhấn đi lên CMP BL,5 JZ StopTop IN 06 ;kiểm tra vị trí dưới hầm thang máy PUSH AL POP BL AND BL,A ;kiểm tra động cơ và công tắc nhấn đi xuống CMP BL,A JZ StopBot PUSH AL POP BL AND BL,10 ; kiểm tra nút gọi xuống JNZ CallDown PUSH AL POP BL AND BL,20 ; kiểm tra nút gọi lên JNZ CallUp JMP LOOP 111/139 StopTop: AND AL,DE ; ngừng môtơ và nút gọi OUT 06 JMP LOOP StopBot: AND AL,ED ;ngừng môtơ và nút gọi OUT 06 JMP LOOP CallDown: IN 06 ;thang máy đã sẵn sàng đi xuống chưa? AND AL,8 CMP AL,8 JZ errDown ;không khởi động môtơ MOV AL,12 OUT 06 JMP LOOP errDown: MOV AL,0 OUT 06 JMP LOOP CallUp: IN 06 ; thang máy đã sẵn sàng đi lên chưa? 112/139 AND AL,4 CMP AL,4 JZ errUp ; không khởi động môtơ MOV AL,21 OUT 06 JMP LOOP errUp: MOV AL,0 OUT 06 JMP LOOP END BÀI TẬP 6 Hãy viết chương trình không chế nhiệt độ lò sấy theo nguyên lý so sánh cửa sổ để nhiệt độ lò được không chế ở 20 độ C. ;Chương trình bật tắt lò sấy MOV BL,80 PUSH BL Main: POP AL XOR AL,80 PUSH AL OUT 03 ; gởi dữ liệu đến lò sấy 113/139 MOV AL,30 ; trì hoãn 30 lần CALL 90 ; gọi thủ tục trì hoãn ;---------------------------------------------------------------------------------------- ;chạy vòng lập này 20 lần MOV CL,20 ;coi thanh ghi CL như một bộ đếm Bang: DEC CL JZ Main IN 03 CMP AL,80 JZ turnOn CMP AL,81 JZ turnOff CMP AL,0 JZ turnOn turnOff: MOV AL,0 OUT 03 JMP Bang turnOn: MOV AL,80 OUT 03 114/139 JMP Bang ;------------------------------------------------------------------------------------- ORG 90 ; thời gian trì hoãn được định bởi giá trị trong AL PUSH AL delay: DEC AL JNZ delay POP AL RET ;-------------------------------------------------------------------------------------- END BÀI TẬP 7.1: Thiết kế chương trình đếm tuần tự liên tục từ 0 đến 9 hiển thị trên LED 7 đoạn bên phải. BÀI TẬP 7.2 Thiết kế hai chương trình đếm độc lập nhau : • LED trái hiển thị theo số xung Clock của CPU. • LED phải hiển thị theo số xung phát ra bởi bộ định thời ngắt phần cứng. ; Chương trình hiển thị Led 7 đoạn Jmp Start ; Nhay qua bang du lieu. DB 30 ; Vector dinh thoi ngat phan cung 115/139 ; chi toi ma tai [30] DB FA ; Bang du lieu bat dau tai dia chi[03] DB 0A DB B6 DB 9E DB 4E DB DC DB FC DB 8A DB FE DB CE ; nhap du lieu cuoi vao. DB 03 ; vi tri RAM nay chi toi bang du lieu Location points to the data ; ma ngat su dung dia chi nay de kiem tra viec no thuc hien suot ; bang du lieu . ; -------------------------------------------------------------- ; CHUONG TRINH CHINH Start: STI ; Cho phep cac ngat dinh thoi phan cung MOV BL,03 ; BL chua dia chi bat dau cua bang du lieu 116/139 Rep: MOV AL,[BL] ; chuyen du lieu tu bang vao AL OUT 02 ; chuyen du lieu ra hien thi CMP AL,CE ; kiem tra gia tri cuoi trong bang JZ Start ; neu gia tri den cuoi thi nhay ve Start INC BL ; chi den vi tri ke tiep JMP Rep ; nhay ve va thuc thi tri so ke ; -------------------------------------------------------------- ; INTERRUPT HANDLER. ORG 30 ; ma bat dau tai dia chi [30] PUSH AL ; luu AL vao ngan xep PUSH BL ; luu BL vao ngan xep PUSHF ; luu co CPU vao ngan xep MOV BL,[0D] ; vi tri RAM 0D chua con tro chi den bang du lieu MOV AL,[BL] ; tim du lieu tu bang OR AL,1 ; thiet lap LSB len 1. OUT 02 ; chuyen du lieu ra hien thi CMP AL,CF ; kiem tra gia tri cuoi cung JZ Reset ; nhay ve reset 117/139 INC BL ; vi tri ke tiep trong bang MOV [0D],BL ; luu vi tri nay vao RAM JMP Done ; nhay ra khoi vong lap Reset: MOV BL,03 ; 03 la dia chi bat dau cua bang MOV [0D],BL ; luu con tro nay vao RAM Done: POPF ; khoi phuc cac co CPU tu ngan xep POP BL ; khoi phuc BL tu ngan xep POP AL ; khoi phuc AL tu ngan xep IRET ; ngat ; -------------------------------------------------------------- END Sau khi xem qua các bài giải ? CPU: CPU là nơi thực hiện tất cả các phép toán số học và logic. CPU là nơi có thể lưu trữ các vùng gọi là các thanh ghi ; CPU chứa các cờ, các cờ này dùng để xác định kết qủa là số (-), số 0 hoặc số bị tràn, sẽ thu nhận được nhiều tin tức hơn nếu có sự mô tả cấu trúc của hệ thống. Thanh ghi bao gồm các tên : AL, BL, CD và DL, lần lượt có mã? là 00, 01, 02 và 03. Các thanh ghi được sử dụng để lưu trữ số nhị phân. 118/139 Các con số được lưu trữ trong thanh ghi có thể được tạo ra từ phép toán số học và logic học, từ đó chuyển các mã nhị phân ra các thiết bị ngoại vi như điều khiển đèn giao thông. Chú thích: Chương trình khi bắt đầu thường có lời chú thích . Những lời chú thích được sử dụng như là tài liệu trong một chương trình. Nó tiện ích trong các chương trình mới tạo ra vì người viết có thể quên các bước của chương trình. Lời chú thích hay là lời chú thích giải thích tại sao các việc sắp xảy ra, xảy ra như thế nào, lời chú thích không hay khi lặp lại qúa nhiều lần một việc vừa đơn giản lại vừa dễ hiểu. Ðịa chỉ RAM: Eg [ 7F ] [ 22 ] [ AL ] [ CL ] [ 7F ] : có nghĩa là chứa nội dung ô nhớ 7F thuộc RAM . [ CL ]: có nghĩa lànội dung được chuyển đến từ thanh ghi CL . AND: nhân hai giá trị nhị phân Ví dụ: AND AL,12 ; thực hiện phép AND giữa AL và số 12,kết quả lưu vào AL AND BL,CL ; thực hiện phép AND giữa CL và BL ,kết quả lưu vào BL Mã máy tương ứng : BA 00 12 ;AND 12 vcà Al , kết quả lưu vào AL AA 00 02 ;AND CL và BL , kết quả lưu vào BL Qui luật của phép AND : Chỉ duy nhất trạng thái 1 AND 1 sẽ ra kết quả là 1, các trường hợp còn lại đều ra kết quả là 0. Ví du? : 119/139 10101010 AND 00001111 Kết quả: 00001010 Lưu ý : 1 AND 1=1,4 bit bên trái sẽ có kết quả là 0 LỆNH CALL VÀ RET: được sử dụng với các thủ tục Không sử dụng các loại cờ trong CPU . Ví dụ : CALL 50 ; gọi thủ tục ở địa chỉ 50 Mã máy tương ứng CA 50 ; gọi thủ tục ở địa chỉ 50 CPU chuyển lệnh con trỏ có giá trị IP+2 vào ngăn xếp ,sau đó CPU sẽ quay lại địa chỉ này . Lệnh con trỏ trong CPU sẽ được đặt ở địa chỉ 50, CPU tiếp tục thi hành các lệnh từ 50 đến khi gặp lệnh RET, sau đó giá trị được chuyển ra khỏi ngăn xếp bởi lệnh IP rồi chuyển đến địa chỉ 50 để tổng kết các công việc đã thực hiện. LỆNH CLI VÀ STI: được sử dụng với các ngắt CLI : Xoá cờ "I" trong thanh ghi trạng thái STI : Ðặt cờ "I" của lệnh ngắt trong thanh ghi trạng thái Mã máy của CLI là FP ,mã máy của STI là FC Nếu đặt cờ I thì CPU sẽ thực hiện việc ngắt Sau đó bộ mô phỏng sẽ thực hiện việc ngắt phần cứng trong khoảng thời gian người viết chương trình mong muốn 120/139 Nếu đặt cờ "I" vào ,tại địa chỉ [02] thực hiện 1 vector ngắt thì CPU sẽ nhảy đến mã - nơi cần thực hiện việc ngắt đó. LỆNH CLO: đóng các cửa sổ không cần thiết CLO không sử dụng các cờ trong CPU ,mã máy của CLO là FE CLO không thực hiện được trong chip 86. Khi sử dụng lệnh CLO thì cửa sổ các chuơng trình không sử dụng đến sẽ được đóng lại thay vì phải dùng chuột để đóng từng cửa sổ một. LỆNH CMP : so sánh Lệnh CMP sử dụng các cờ trong CPU Ví dụ: CMP AL ,OD ; so sánh AL với OD Mã máy tương ứng DB OO OD ; so sánh AL với OD Nếu các gía trị so sánh có : • Bằng nhau thì đặt cờ "Z" • AL nhỏ hơn BL thì đặt cờ"S" • AL lớn hơn BL thì không có cờ nào Ví dụ : CMP CL,[20] ; so sánh CL với 20 Mã máy tương ứng DC 02 20 Nếu các gía trị so sánh có : Bằng nhau thì đặt cờ "Z" 121/139 CL có nội dung nhỏ hơn nội dung có trong địa chỉ 20 thì đặt cờ S . CL có nội dung lớn hơn nội dung có trong địa chỉ 20 thì không đặt cờ. LỆNH DB: định nghĩa byte Lệnh DB không sử dụng các cỡ trong CPU. DB là một cách gởi trực tiếp các giá trị vào RAM, lệnh DB không có mã máy . Những con số và dòng chữ sau DB điều được chuyển vào RAM. DB 22 ; Ðây là một bảng dữ liệu được chuyể tủ vào RAM DB 33 DB 44 DB 0 DB "Hello world"; Mã ASCII của dòng chữ được chuyển vào RAM DB 0 ; Kết thúc dòng chữ thì sử dụng lên NULL. Lệnh DEC và INC : Tăng lên 1 và giảm đi 1 Lệnh DEC và INC thiết lập cờ trong CPU LỆNH DIV VÀ MOD: Có các lệnh DIV từ chip x86, nhưng lệnh MOD thì không có trong chip x86. Chip x86 : Lệnh DIV thực hiện cả hai công việc là: Div và MOD, kết qủa x2 lưu vào các thanh ghi khác nhau. Việc tách và đơn giản đối với 8 bit trong bộ mô phỏng khi sử dụng Mod và Div thì không thể thực hiện được . 8 DIV 3 bằng 3 (nhớ 2 ) 122/139 8 MOD 3 bằng 2. Ví dụ: DIV AL,5 ; chiaAL cho 5; kết qủa lưu vào AL DIV AL,BL ; chia AL cho BL, kết qủa lưu vào AL MOD AL,5 ; Mod AL cho 5, kết qủa: phần dư đưa vào AL MOD AL,BL ; Mod AL cho BL, phần dư chuyển vào AL Mã máy : B3 00 05 ; chia AL cho 5, kết quả lưu vào AL A5 00 01 ; chia AL cho BC, kết quả lưu vào AL B6 00 05 ; Mod AL cho 5, kết quả lưu vào AL ( phần dư ) A6 00 01 ; Mod AL cho BL, kết quả : phần dư đưa vào AL LỆNH END : không thiết lập các cờ trong CPU END : dừng chương trình đang thực hiện. Mã máy của END và HALT là 00. bộ mô phỏng thực hiện được việc này do việc sử dụng đến hoạt động ngừng dao động trong CPU. Trình biên dịch sẽ không thực hiện việc biên dịch sau khi gặp lệnh END . Trong 1 chương trình chỉ sử dụng 1 lệnh END duy nhất. LỆNH HALT: không thiết lập các cờ trong CPU HALT : dừng chương trình đang thực hiện, mã máy lệnh HALT là 00. Bộ mô phỏng thực hiện được điều này khi CPU ngừng hoạt động. Có thể sử dụng vào lệnh HALT trong 1 chương trình. 123/139 LỆNH IN VÀ OUT : xuất - nhập Giao tiếp với thiết bị ngoại vi , không thiết lập các cờ trong CPU Lệnh xuất - nhập được sử dụng bởi các port Ví dụ : MOV AL,55 ; chuyển gia trị 0101 0101 vào AL IN 01 ; gởi gía trị trên ra port 1 IN 03 ; được đọc từ port 3 chuyển qua AL IN 00 ; 00 là bàn phím Mã máy tương ứng : DO 00 55 ; chuyển 0101 0101 vào AL F1 01 ; gởi 0101 0101 đến port 1 ( điều khiển đèn giao thông) FO 03 ; được đọc từ port 3 vào AL FO 00 ; 00 nhập từ bàn phím Lệnh INT và IRET : Sử dụng với các ngắt Lệnh INT và IRET không thiết lập cờ tràn. Ví dụ: INT 02 ;gọi lệnh ngắt ;bắt đầu bằng địa chỉ đã được lưu trữ ;tại địa chỉ 02, các địa chỉ 00 đến OF có thể sử ;dụng như vector ngắt IRET ;quay trở lại vị trí ngắt Mã máy tương ứng 124/139 CC 02 ; gọi việc ngắt. CD ; quay trở lại việc ngắt. CPU đẩy gía trị IP + 2 bởi con trỏ lệnh vào ngăn xếp. Sau đó CPU sẽ quay trở lại địa chỉ này. Lệnh con trỏ được đặt vào địa chỉ này đến khi gặp lệnh IRET. CPU sẽ chuyển dữ liệu ra khỏi ngăn xếp nhờ lệnh từ địa chỉ này đến khi gặp lệnh IRET. CPU sẽ chuyển dữ liệu ra khỏi ngăn xếp nhờ lệnh IP và chuyển đến địa chỉ nơi mà nó đang thực hiện. Lệnh JMP Ðặt một giá trị mới vào IP, không thiết lập các cờ trong CPU. Ví dụ : JMP FOO ; nhảy đến địa chỉ nhãn FOO. Mã máy tương ứng CO 12 ; nhảy 12 vị trí . CO FE ; quay lại 12 vị trí . Lệnh JMP thực hiện được nhờ việc cộng thêm 1 số vào lệnh IP. Số này có thể nằm trong khoảng - 128 đến 127, việc này xác định độ dài nhất có thể. Lệnh JMP : nhảy không điều kiện, JMP không sử dụng trong CPU. Lệnh JNO: Jmp Not Overflow JNO không thiết lập cờ CPU. Ví dụ: JNO FOO ; nhảy đến địa chỉ có nhản FOO Mã máy tương ứng C6 12 ; nhảy 12 khoảng cách C6 FE ; quay lại 2 khoảng cách 125/139 JNO làm việc bằng cách cộng 1 số vào CPU nhờ con trỏ lệnh IP , số này có thể đi từ -128. - . +127. Ðây là khoảng cách lớn nhất mà lệnh nhảy có thể thực hiện JNO sẽ thực hiện nếu cờ " O" trong CPU không đặt vào. Lệnh JNS : Jump Not Sign JNS không thiết lập cờ CPU. Ví dụ : JNS FOO ; nhảy về địa chỉ có nhãn FOO Mã máy tương ứng C4 12 ; nhảy 12 khoảng cách C4 FE ; quay lại 2 khoảng cách JNS làm việc bằng cách cộng thêm 1 số vào CPU nhờ con trỏ lệnh, số này có thể chuyển đổi từ -128 đến -127 , đây là khoảng cách lớn nhất có thể nhảy . Lệnh JNZ : Jump Not Zero JNZ không thiết lập cờ CPU. Ví dụ : JNZ FOO ; nhảy về nhãn FOO Mã máy tương ứng C2 12 ; nhảy 12 khoảng cách C2 FE ; quay lại 2 khoảng cách JNZ làm việc dựa trên nguyên tắc tăng thêm 1 vào CPU nhờ con trỏ lệnh IP. Con số này thay đổi từ -128 đến +127, đây là khoảng cách lớn nhất có thể của lệnh nhảy. JNZ sẽ thực hiện việc nhảy nếu cờ"Z" trong CPU không đặt vào Lệnh JO : 126/139 Nhảy khi gặp sự tràn. JO không thiết lập cờ CPU. Ví dụ: JO FOO ; nhảy đến địa chỉ nhãn FOO. Mã máy tương ứng : C5 12 ; nhảy 12 khoảng cách C5 FE ; quay lại hai khoảng cách. JO làm việc dự trên nguyên tắc tăng thêm một vào CPU nhờ con trỏ lệnh IP. Con số này thay đổi từ -128 đến +127 , đây là khoảng cách có thể nhảy lớn nhất. JO sẽ thực hiện việc nhảy nếu trong CPU có đặt cờ "O". Lệnh JS: Jump Sign JS không thiết lập cờ CPU. Ví dụ : JS FOO ; nhảy đến địa chỉ nhãn FOO Mã máy tương ứng C3 12 ; nhảy 12 khoảng cách C3 FE ; quay về lại hai khoảng cách. JS làm việc dựa trên nguyên tắc tăng thêm một vào CPU nhờ IP. Con số này thay đổi từ -128 đến +127, đây là khoảng cách lớn nhất có thể nhảy. Lệnh JZ ( Jump Zero ) JZ không thiết lập cờ CPU. 127/139 Ví dụ : JZ FOO ; nhảy về địa chỉ nhãn FOO Mã máy tương ứng C1 12 ; nhảy 12 khoảng cách C1 FE ; quay lại hai khoảng cách JZ làm việc dựa trên nguyên tắc tăng thêm một vào CPU, nhờ con trỏ lệnh. Con số này thay đổi từ -128 đến +127, đây là khoảng cách lớn nhất mà lệnh nhảy có thể thực hiện. Lệnh JZ sẽ thực hiện việc nhảy nếu cờ Z" được đặt vào CPU. Lệnh MOV Chuyển dữ liệu từ nơi này đến nơi khác. Ví dụ : MOV AL, 12 ; chuyển 12 hex vào AL MOV BL, [2F] ; chuyển nội dung trong ô nhớ [2F] vào BL MOV [33], CL ; chuyển dữ liệu từ thanh ghi CL vào ô nhớ [33] MOV AL, [DL]; chuyển nội dung trong thanh ghi DL vào một ;vùng nhớ, từ vùng nhớ đó chuyển vào AL. MOV [BL], CL ; chuyển nội dung trong thanh ghi BL vào ô nhớ ;có địa chỉ trong thanh ghi CL. Mã máy tương ứng DU 00 12 ; chuyển 12 hex vào AL D1 01 2F ; chuyển nội dung ô nhớ 2F vào BL D2 33 02; chuyển dữ liệu từ CL đến ô nhớ [33] D3 00 03; chuyển dữ liệu từ DL đến ô nhớ, chuyển ô nhớ ; đến AL. 128/139 D4 02 03; chuyển dữ liệu từ BL đến ô nhớ, sau đó chuyển ; ô nhớ đến CL. LỆNH MUL ( NHÂN - MULTIPLY ) Các lệnh MUL khác được thực hiện tại chip X86. Lệnh X86 Mul đưa kết quả vào nhiều thanh ghi. Bộ mô phỏng không thể thực hiện lệnh MUL 8 bit một cách đơn giản được. Lệnh này bất lợi khi việc xuất hiện cờ tràn quá nhiều lần. Ví dụ : MUL AL, 5 ; thực hiện nhân AL cho 5, kết qủa chuyển vào thanh ghi AL Mã máy tương ứng B2 00 05 ; nhân AL với 5 ,kết quả chuyển vào AL A2 00 01 ; nhân AL với B2, kết qủa chuyển vào AL. LỆNH NOP: (No Operation) - Không làm gì. Khi gặp lệnh này , CPU sẽ ngưng làm việc trong 1 chu kỳ xung. Việc này rất cần thiết vi cần có khoảng thời gian để tạo sự đồng bộ giữa CPU và các mạch điện tử . CPU ngưng làm việc trước khi các mạch điện tử hiểu được câu lệnh . Mã máy của lệnh NOP là FF . LỆNH NOT Ðảo ngược tất cả các bit . Ví dụ: NOT CL ; đảo ngược các bit trong thanh ghi CL Mã máy tương ứng AD 02 ; đảo ngược các bit trong CL 129/139 Nếu CL chứa dữ liệu 01010101 trước khi sử dụng lệnh NOT thì không có gì thay đổi nhưng khi gặp lệnh NOT nó sẽ trở thành 10101010 LỆNH OR Dùng để OR 2 giá trị nhị phân. Ví dụ : OR AL, 12 ; OR 12 với AL, kết quả đưa vào AL OR BL, CL ; OR CL với BL, kết quả đưa vào BL Mã máy tương ứng BB 00 12 ; OR 12 với AL, kết quả đưa vào AL AB 01 02 ; OR CL với BL, kết quả đưa vào AL Quy luật của lệnh OR : hai ngõ vào bằng 0 sẽ đưa ra kết quả là 0, các ngõ vào còn lại đều cho kết quả bằng 1. Ví dụ : 10101010 or 00001111 kết quả 10101111 0 hoặc 0 = 0 4 bit phải ra kết quả là 1 LỆNH ORG Ðặt mã gốc ORG 50 ; mã được phát sinh từ địa chỉ 50 130/139 ORG không là một lệnh thuôc CPU. Nó là loại lệnh được đưa ra từ trình biên dịch có mã được phát sinh từ một địa chỉ đặc biệt, được sử dụng trong thủ tục và ngắt ORG được sử dụng trong các bộ nhớ đặc biệt như bảng dữ liệu, ở bảng dữ liệu thì không có mã máy tương ứng. LỆNH PUSH VÀ POP Lệnh ngăn xếp. PUSH dùng lưu trữ một byte vào ngăn xếp, POP lấy ra khỏi ngăn xếp. Ngăn xếp là một vùng nhớ tuân theo quy luật LIFO. Nhăn xếp dùng để : + Tạo sự quay trở lại của lệnh gọi thủ tục + Tạo sự quay trở lại địa chỉ của lệnh ngắt + Gởi các tham số vào trong các thủ tục + Nhận kết quả được lấy từ các thủ tục + Lưu, phục hồi các thanh ghi và các cờ. + Ðảo ngược thứ tự của dữ liệu Ví dụ : PUSH AL ; lưu AL và đưa vào ngăn xếp POP AL ; phục hồi AL được đưa ra từ ngăn xếp Mã máy tương ứng EO 00 ; lưu AL vào ngăn xếp E1 00 ; phục hồi AL từ ngăn xếp LỆNH PUSHF, POPF PUSHF : không thiết lập cờ CPU. 131/139 POPF : thiết lập cờ CPU Ngăn xếp là vùng nhớ đặc biệt làm việc theo quy luật LIFO. Ngăn xếp có các công dụng : + Tạo sự quay lại địa chỉ của lệnh gọi thủ tục. + Tạo sự quay lại địa chỉ của lệnh ngắt. + Gởi các tham số vào thủ tục. + Lưu, phục hồi các thanh ghi và các cờ. + Ðảo ngược thứ tự của dữ liệu. Ví dụ : PUSHF ; lưu cờ trong CPU đưa vào ngăn xếp POPF ; phục hồi cờ trong CPU đưa vào ngăn xếp Mã máy tương ứng EA ; lưu cờ trong CPU chuyển ra ngăn xếp EB ; phục hồi cờ trong CPU chuyển ra ngăn xếp. LỆNH ROL và ROR : Rotate all bits to the Right và Left. Xoay bit sang trái, phải. Ví dụ : ROL AL ; xoay trái các bit một vị trí ROL DL ; xoay phải các bit một vị trí Mã máy tương ứng 9A 00 ; xoay trái các bit một vị trí 9B 03 ; xoay phải các bit một vị trí Sau khi xoay xong một bit thì chuyển đến xoay các bit còn lại cho đến hết. 132/139 - Trước khi xoay : 10000110 - Sau khi xoay trái : 00001101 - Trước khi xoay : 10000110 - Sau khi xoay phải : 01000011 LỆNH SHL VÀ SHR : Shift (Logically) Right và Left. Chuyển dịch các bit sang phải, trái . SHL và SHR thiết lập cờ CPU. Ví dụ : SHL AL ; dịch các bit sang trái một vị trí SHR DL ; dịch các bit sang phải một vị trí - Trước khi xoay : 10000110 - Sau khi xoay trái : 00001100 - Trước khi xoay : 10000110 - Sau khi xoay : 01000011 LỆNH SUB (Substract) Trừ 2 toán hạng. SUB không thiết lập cờ CPU Ví dụ : SUB AL, 12 ; trừ 12 trong thanh ghi AL, kết quả lưu vào AL. 133/139 Phụ lục C Giới thiệu các phần mềm mô phỏng vi điểu khiển Hiện nay trên thị trường phần mềm có rất nhiều phần mềm mô phỏng vi điều khiển rất hay như UMPS Simulator ... nhưng đa số vẫn là shareware hay trial (các phần mềm quảng cáo hay cho dùng thử), do đó bạn phải đăng ký mới có thể sử dụng lâu dài và hưởng được đầy đủ các tính năng của chúng. Trong khuông khổ giáo trình này, các phần mềm được chọn dạng full retail nên bạn có thể sử dụng đầy đủ các tính năng của chúng. TS CONTROLS EMILATOR 8051 Ðây là phần mềm thiết kế theo chuẩn của các chương trình ứng dụng chạy trên hệ điều hành Windows, do đó nó một số ưu điểm khá đặc trưng như: thao tác dễ dàng, thuận lợi, hướng dẫn tương đối đầy đủ.. .Phần mềm này mô phỏng một họ vi điều thực tế 8051 nên rất thuận tiện cho sinh viên mô phỏng chương trình chình vi điều khiển trước khi quyết định ráp mạch. Tuy nhiên so với SIM51, TS Controls Emulator còn khiếm khuyết hơn ở khâu nạp tập tin nguồn vào phần mềm mô phỏng. Với phần mềm này, giáo trình sẽ giới thiệu các phần sau: • Cài đặt chương trình. • Màn hình giao diện chính. • Sử dụng chương trình mô phỏng. SIM51 Ðây là phần mềm mô phỏng vi điều khiển họ 8051 chạy trên môi trường DOS mặc dù giao diện xấu nhưng đòi hỏi cấu hình máy rất nhẹ thuận tiện cho việc mô phỏng vi điều khiển trước khi quyết định ráp mạch. Trong phần mềm có trang bị chương trình biên dịch từ mã nguồn sang mã hex hoặc bin rất tiện cho bạn nạp trình cho EPROM hoặc vi điều khiển. Với phần mềm này, giáo trình sẽ giới thiệu các phần sau : • Màn hình giao diện chính. • Sử dụng SIM51 dịch chương trình nguồn ra mã máy 134/139 Tham gia đóng góp Tài liệu: Mô phỏng vi điều khiển Biên tập bởi: Nguyễn Phương Quang URL: Giấy phép: Module: Nhập môn Lập trình Vi điều khiển Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 1 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 2 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 3 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 4 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 5 Các tác giả: Nguyễn Phương Quang URL: 135/139 Giấy phép: Module: Bài tập 6 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 7 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 8 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 9 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 10 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập 11 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập nâng cao 1 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: 136/139 Module: Bài tập nâng cao 2 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập nâng cao 3 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập nâng cao 4 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập nâng cao 5 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập nâng cao 6 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Bài tập nâng cao 7 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Phụ lục A Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Phụ lục B 137/139 Các tác giả: Nguyễn Phương Quang URL: Giấy phép: Module: Phụ lục C Các tác giả: Nguyễn Phương Quang URL: Giấy phép: 138/139 Chương trình Thư viện Học liệu Mở Việt Nam Chương trình Thư viện Học liệu Mở Việt Nam (Vietnam Open Educational Resources – VOER) được hỗ trợ bởi Quỹ Việt Nam. Mục tiêu của chương trình là xây dựng kho Tài nguyên giáo dục Mở miễn phí của người Việt và cho người Việt, có nội dung phong phú. Các nội dung đểu tuân thủ Giấy phép Creative Commons Attribution (CC-by) 4.0 do đó các nội dung đều có thể được sử dụng, tái sử dụng và truy nhập miễn phí trước hết trong trong môi trường giảng dạy, học tập và nghiên cứu sau đó cho toàn xã hội. Với sự hỗ trợ của Quỹ Việt Nam, Thư viện Học liệu Mở Việt Nam (VOER) đã trở thành một cổng thông tin chính cho các sinh viên và giảng viên trong và ngoài Việt Nam. Mỗi ngày có hàng chục nghìn lượt truy cập VOER (www.voer.edu.vn) để nghiên cứu, học tập và tải tài liệu giảng dạy về. Với hàng chục nghìn module kiến thức từ hàng nghìn tác giả khác nhau đóng góp, Thư Viện Học liệu Mở Việt Nam là một kho tàng tài liệu khổng lồ, nội dung phong phú phục vụ cho tất cả các nhu cầu học tập, nghiên cứu của độc giả. Nguồn tài liệu mở phong phú có trên VOER có được là do sự chia sẻ tự nguyện của các tác giả trong và ngoài nước. Quá trình chia sẻ tài liệu trên VOER trở lên dễ dàng như đếm 1, 2, 3 nhờ vào sức mạnh của nền tảng Hanoi Spring. Hanoi Spring là một nền tảng công nghệ tiên tiến được thiết kế cho phép công chúng dễ dàng chia sẻ tài liệu giảng dạy, học tập cũng như chủ động phát triển chương trình giảng dạy dựa trên khái niệm về học liệu mở (OCW) và tài nguyên giáo dục mở (OER) . Khái niệm chia sẻ tri thức có tính cách mạng đã được khởi xướng và phát triển tiên phong bởi Đại học MIT và Đại học Rice Hoa Kỳ trong vòng một thập kỷ qua. Kể từ đó, phong trào Tài nguyên Giáo dục Mở đã phát triển nhanh chóng, được UNESCO hỗ trợ và được chấp nhận như một chương trình chính thức ở nhiều nước trên thế giới. 139/139

Các file đính kèm theo tài liệu này:

  • pdfmo_phong_vi_dieu_khien_203.pdf
Tài liệu liên quan