Bài tập 4
Viết chương trình đếm lên Mục đích -yêu cầu: Trong bài tập này ta hiểu được nhãn, việc tràn bộ nhớ và thanh ghi trạng thái SR. Hiểu được lệnh tăng INC, lệnh nhảy JMP và con trỏ lệnh IP. Làm quen với các chu kỳ tìm nạp - ...
Viết chương trình đếm lên
Mục đích -yêu cầu:
- Trong bài tập này ta hiểu được nhãn, việc tràn bộ nhớ và thanh ghi trạng thái SR.
- Hiểu được lệnh tăng INC, lệnh nhảy JMP và con trỏ lệnh IP.
- Làm quen với các chu kỳ tìm nạp - thi hành lệnh (Fetch Execute Cycle).
- Thực hiện được các chương trình đếm thông dụng.
Kiến thức nền:
1/ Lệnh MOV BL,40:
Câu lệnh cho ta biết được địa chỉ đầu của thanh ghi BL là 40.
2/ Nhãn Rep trong chương trình :
Rep là 1 nhãn, các nhãn được sử dụng với lệnh Jump. Nó là vị trí để các chương trình có thể nhảy lùi hay nhảy tới để tiếp tục thực thi. Ðây là cách thức các số được lưu giữ, ngoài ra ta có những bước nhảy rộng hơn từ -178 đến +127. Các nhãn phải được bắt đầu với mẫu ký tự hay ký tự. Nhãn có thể chứa các mẫu tự, ký số và ký tự. Cuối nhãn đích phải có dấu 2 chấm (:).
3/ Lệnh INC BL:
Ðây là lệnh cộng thêm 1 vào thanh ghi BL. Thanh ghi BL sẽ đếm lên từ 40h sau 49h.
3/ Tràn bộ nhớ (overflow) :
Khi BL đạt đến 7FH hay 127 trong hệ thập phân, thì số kế tiếp phải đến 128, nhưng do các số này là số nhị phân nên số tiếp theo sau phải là -128. kết quả này được gọi là tràn bộ nhớ.
Tràn bộ nhớ là tình trạng xảy ra khi 1 chương trình cố đưa quá nhiều dữ liệu vào 1 khu vực nhớ so với sức chứa của nó, do đó sẽ sinh ra 1 thông báo lỗi.
4/ Thanh ghi trạng thái SR (Status Register):
Thanh ghi trạng thái SR chứa cờ 4 bit cho biết thông tin về trạng thái của CPU. Ở đây có 3 cờ cho biết có hay không việc tính toán tràn bộ nhớ, nếu cho kết quả âm hay cho kết quả bằng 0 thì việc tính toán thiết lặp các cờ này.
? S : Cờ dấu cho biết kết quả (-)
? O : Cờ tràn cho biết có tràn bộ nhớ
? Z : Cờ zero cho biết kết quả = 0
Cờ thứ tư
? I : là cờ cho phép ngắt
? STI : cho phép mở thanh ghi trạng thái
? CLI : cho phép tắt thanh ghi trạng thái
Các cờ này sẽ được mô tả chi tiết ở phần sau .
5/ Lệnh JMP Rep:
Lệnh này làm cho đơn vị xử lý trung tâm (CPU) nhảy lùi và lập lại những lệnh trước đó hay nhảy tới và bỏ qua 1 vài lệnh.
6/ Con trỏ lệnh:
Con trỏ lệnh IP chứa địa chỉ của lệnh đang thi hành. Ðiều này được cho biết bởi vị trí nổi bật trong chương trình mô phỏng. Mỗi lệnh trong CPU làm cho IP được tăng thêm 1,2 hay 3 tuỳ thuộc vào độ dài của lệnh. Khi hiển thị RAM, con trỏ làm nổi rõ màu đỏ với nền chữ vàng.
NOP ; tăng IP =1
INC BL ; tăng IP =2
ADD AL,BL ; tăng IP =3
JMP Rep ; cộng hay trừ giá trị từ IP để nhảy đến 1 phần mới của chương trình .
7/ Chu kỳ đón - thực thi lệnh (Fetch Execute Cycle):
Chu kỳ đón - thực thi lệnh (còn gọi là chu kỳ tìm nạp + giải mã + thi hành lệnh) thực hiện theo từng bước sau :
* Tìm nạp lệnh tiếp theo từ bộ nhớ vào IR. Trong chương trình này CPU tìm nạp lệnh theo địa chỉ mà IP chỉ tới: đón hay tìm nạp lệnh.
* Ðịnh loại lệnh vừa tìm nạp, nếu lệnh dùng dữ liệu trong bộ nhớ thì CPU sẽ tìm đến và nạp vào thanh ghi bên trong CPU: giải mã lệnh.
* Thi hành lệnh và lưu kết quả ở nơi thích hợp: thi hành lệnh.
Sau khi thực hiện xong 3 bước này CPU lại tìm đến lệnh tiếp theo trong chương trình để tuần tự thực hiện lặp lại 3 bước trên.
Như vậy dù cho chương trình CPU thì rất phức tạp nhưng về cơ bản nó cũng chỉ thực hiện 2 hoạt động: tìm lệnh, thi hành, tìm lệnh, thi hành .và cứ như thế mà tiếp diễn. CPU sẽ thực thi được toàn bộ chương trình.
Chương trình:
; Chương trình đếm lên -------------------------------------------MOV BL,40 ; giá trị đầu được lưu trong BLRep :INC BL ??? ; cộng 1 vào BLJMP Rep ; nhảy về nhãn RepEND ; kết thúc chương trình
;---------------------------------------------------------------------
Bài tập 04. Nhấn nút Play để xem.
Tải file phim về ở đây.
Bài tập củng cố: 4.1/ Viết chương trình đếm lùi lại sử dụng DEC BL. 4.2/ Viết chương trình đếm lên 3 sử dụng lệnh Add BL,3. 4.3/ Viết chương trình đếm 1,2,4,8,16 sử dụng lệnh MUL BL,2. 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ớ. Ðây là một chương trình khó đối với các bạn mới bắt đầu học lập trình, mỗi số trong chương trình này là tổng của 2 số liền trước. Bạn cần sử dụng 2 thanh ghi và 2 vị trí RAM để tạm thời cất giữ giá trị của các số đang tính. Bạn nên nhớ rằng kết quả sẽ bị tràn khi nó đếm đến 127 và các số hiển thị trong chương trình đều viết dưới dạng số hexa.