Bài tập 7
Chương trình đọc một chuỗi văn bản và cất vào RAM Mục đích-yêu cầu: Làm quen với địa chỉ bắt đầu của chương trình dịch hợp ngữ. Hiểu cách dùnh lệnh HALT, phân biệt với lệnh END. Phân biệt cách dùng lệnh RET trong mỗi ...
Chương trình đọc một chuỗi văn bản và cất vào RAM
Mục đích-yêu cầu:
- Làm quen với địa chỉ bắt đầu của chương trình dịch hợp ngữ.
- Hiểu cách dùnh lệnh HALT, phân biệt với lệnh END.
- Phân biệt cách dùng lệnh RET trong mỗi phần của chương trình.
- Hiểu được các lệnh PUSH, POP, PUSHF, POPF, JZ, JMP, CALL trong bài tập.
Kiến thức nền :
1/ Lệnh MOV BL,70 :
Chép 70 vào thanh ghi BL, đây là địa chỉ mà thủ tục sẽ nhập văn bản vào RAM. Ví dụ này nói về tham số trung gian sử dụng thanh ghi. Chương trình có khả năng nhận được một số từ một phần của một chương trình đến một chương trình khác.
2/ Lệnh INC BL :
Ðây là lệnh cộng 1 vào BL. Kết quả này làm cho BL chỉ tới vị trí bộ nhớ kế tiếp để sẵn sàng cho các ký tự văn bản kế tiếp đã được cất giữ.
3/ Lệnh CALL 10 :
Lệnh gọi thủ tục tại địa chỉ 10. Ðiều này được thực hiện bằng việc thiết lập con trỏ lệnh IP của CPU đến địa chỉ [10].
4/ Lệnh RET:
Tại điểm kết thúc của thủ tục, lệnh RET xác lập lại con trỏ lệnh IP về đến lệnh ngay sau lệnh CALL được gọi. Ðịa chỉ này được cất trên ngăn xếp bởi lệnh CALL.
5/ Lệnh HALT :
Ta không nên lẫn lộn lệnh HALT và lệnh END. Lệnh END kết thúc chương trình hợp ngữ. Lệnh HALT thì phát ra các mã máy 00 làm cho CPU tạm dừng. Có thể có một vài lệnh HALT trong chương trình nhưng chỉ có một lệnh END.
6/ Lệnh ORG 10:
Con số 10 là giá trị của địa chỉ bắt đầu của chương trình.
7/ Lệnh PUSH AL và POP AL:
Cất giá trị của AL vào ngăn xếp. Ðây là một vùng nhớ ở trong RAM bắt đầu tại địa chỉ BF. Ngăn xếp tiến về 0. Việc hiển thị RAM cho thấy con trỏ ngăn xếp có màu xanh được làm nổi bật với nền chữ vàng. Lệnh PUSH và POP dùng chung với nhau giúp cho các ngắt có thể thực hiện dễ dàng ngay cả trong thủ tục ngắt (một ngắt thứ hai có thể xuất hiện trong khi yêu cầu ngắt thứ nhất đang thực hiện). Thủ tục hay ngắt có thể thay đổi các thanh ghi CPU nhưng nó sẽ được khôi phục lại được giá trị cũ của chúng khi trở về chương trình chính.
8/ Lệnh PUSHF và POPF:
Lệnh PUSHF lưu các cờ của CPU vào ngăn xếp. Lệnh POPF khôi phục lại các cờ CPU đến các giá trị đầu của chúng. Ðiều này có thể làm cho các thủ tục và ngắt được hữu dụng trong công việc mà không làm ảnh hưởng tới chế độ nghỉ lại của chương trình.
9/ Lệnh IN 00:
Nhập từ port 0. Port này được kết nối với bàn phím. Phím nhấn được lưu trong thanh ghi AL.
10/ Lệnh CMP AL,0D :
Ðây là lệnh so sánh thanh ghi AL với số 0Dh. 0D là mã ASCII của phím Enter. Khi chạy chương trình thì trên màn hình sẽ xuất hiện dòng chữ "Phím ENTER được nhấn chưa?" ("Was the Enter key pressed?"). CMP làm việc bằng cách trừ 0D từ AL. Nếu chúng bằng nhau thì việc trừ cho kết quả zero. Ðây là lý do cờ "Z" được thiết lập.
11/ Lệnh JZ Stop :
Lệnh này cho phép nhảy đến nhãn stop nếu cờ "Z" được thiết lập. JZ là lệnh nhảy có điều kiện.
12/ Lệnh MOV [BL],AL :
Di chuyển phím nhấn được cất trong AL vào ô nhớ RAM mà [BL] chỉ tới. INC BL được sử dụng để làm cho BL chỉ tới vị trí RAM kế tiếp.
13/ Lệnh JMP Rep :
JMP cho phép nhảy về nhãn Rep, đây là lệnh nhảy không điều kiện. Nó luôn nhảy và các cờ CPU được bỏ qua.
14/ Lệnh RET :
Lệnh RET này là lệnh quay về từ thủ tục đến địa chỉ được cất trong ngăn xếp. Ðiều này được làm bởi việc thiết lập con trỏ lệnh IP trong CPU.
Chương trình:
; Chương trình chính ------------------------------------------------------------------
MOV BL,70 ;[70] là địa chỉ mà ở đó văn bản được lưu giữ
CALL 10 ;thủ tục tại địa chỉ [10] đọc văn bản và đặt nó bắt đầu từ địa chỉ trong BL
CALL 40 ;thủ tục này không làm gì cho đến khi bạn viết nó, nó sẽ hiển thị văn bản.
HALT ;phát ra mã 00 làm CPU ngừng không sử dụng lệnh END ở đây vì sẽ bị lỗi.;Thủ tục đọc văn bản
ORG 10 ;mã bắt đầu từ địa chỉ [10]
PUSH AL ;lưu AL trong ngăn xếp
PUSH BL ;lưu BL trong ngăn xếp
PUSHF ;lưu cờ CPU vào ngăn xếp
Rep:
IN 00 ;nhập từ port 00 (bàn phím)
CMP AL,0D ;so sánh xem có nhấn phímEnter chưa?
JZ Stop ;nếu có thì chương trình sẽ nhảy đến nhãn Stop
MOV [BL],AL ;chuyển phím nhấn tới RAM tại vị ;trí [BL]
INC BL ;tăng BL, BL chỉ tới vị trí kế tiếp
JMP Rep ;nhảy về nhãn Rep nhận ký tự kế
Stop:
MOV AL,0 ;giá trị null(=0) kết thúc vạch dấu
MOV [BL],AL ;chuyển đến [BL]
POPF ;khôi phục các cờ từ ngăn xếp
POP BL ;khôi phục BL từ ngăn xếp
POP AL ;khôi phục AL từ ngăn xếp
RET ;kết thúc chương trình con
;-----------------------------------------------------------------------------------------
;Thủ tục hiển thị văn bản trên màn hình mô phỏng
ORG 40 ;địa chỉ bắt đầu của thủ tục hiển ;thị là [40]
END ; kết thúc chương trình
;---------------------------------------------------------------------------------------
Bài tập 07. Nhấn nút Play để xem.
Tải file phim về ở đây