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
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:
- mo_phong_vi_dieu_khien_203.pdf