? Các vị trí RAM. ? Ngăn xếp.
Trong ví dụ dưới đây sử dụng 3 cách giải khác nhau để cộng 2 số.
Chương trình:
; 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,4 ;giữ 1 byte của RAM tại địa chỉ 03
CALL 30 ;gọi thủ tục thứ nhất
;sử dụng vị trí RAM để đưa các tham số vào trong 1 thủ tục
MOV AL,3
MOV [02],AL
MOV BL,1
MOV [03],BL
CALL 40 ;gọi thủ tục thứ hai ;sử dụng ngăn xếp để đưa tham số vào 1 thủ tục
MOV AL,7 PUSH AL MOV BL,2 PUSH BL CALL 60 ;gọi thủ tục thứ ba POP BL POP AL
JMP Start ;trở về nhãn Start để thực hiện
;Thủ tục để cộng 2 số (cách 1) --- ;Các tham số thông qua trong thủ tục sử dụng AL và BL
;Kết quả đưa vào AL
;Ðây là phương pháp đơn giản nhưng không hay lắm vì có nhiều thamsố ORG 30 ;bắt đầu tại địa chỉ 30
RET ;kết thúc chương trình con, quay trở về từ thủ tục ;Thủ tục để cộng 2 số (cách 2) --- ;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
;Phương pháp này thì phức tạp hơn và không giới hạn số tham số 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 PUSH DL
PUSHF
MOV CL,[02] ;tìm nạp tham số từ RAM MOV DL,[03] ;tìm nạp tham số từ RAM
ADD CL,DL
MOV [02],CL ;cất kết quả trong RAM
POPF ;khôi phục lại thanh ghi ban đầu và giá trị cờ POP DL
POP CL
RET ;kết thúc chương trình con
;Thủ tục cộng 2 số (cách 3) --- ;Số được cộng bên trong ngăn xếp
;Lấy tham số ra ngăn xếp ;Thực hiện việc cộng
;Phần lớn thủ tục gọi trong thời gian thực đều được sử dụng ngăn xếp ORG 60 ;mã bắt đầu tại địa chỉ 60
POP DL
POP BL
POP AL
ADD AL,BL ;đặt trở lại ngăn xếp như trước đó
PUSH AL
PUSH DL
END ;kết thúc chương trình
;---
Bài tập 09. Nhấn nút Play để xem.
Bài tập 10
Chương trình ngắt mềm
Mục đích-yêu cầu:
• Làm quen với ngắt mềm và nhận ra sự khác nhau giữa ngắt mềm và gọi thủ tục. • Hiểu về bảng vectơ ngắt và cách gọi ngắt mềm như thế nào?
• Sử dụng ngắt mềm trong trao đổi dữ liệu. Kiến thức nền:
1/ Ngắt và thủ tục:
Tính ưu việt của hệ vi xử lý trong điều khiển hệ thống đó là tính uyển chuyển (flexible): dễ dàng thay đổi chương trình để thích nghi với môi trường làm việc. Muốn vậy, khi có tín hiệu cần trao đổi với hệ thống, CPU phải tạm dừng công việc hiện tại để phục vụ việc trao đổi dữ liệu. Sau khi hoàn thành việc trao đổi dữ liệu, CPU lại quay về làm tiếp công việc đang làm dở dang. Cách làm việc kiểu này gọi là ngắt CPU. Ngắt là một đoạn mã ngắn cung cấp các dịch vụ hữu ích có thể sử dụng bằng các chương trình khác nhau. Chương trình ngắt điển hình như thi hành các phím nhấn, sự di chuyển chuột, nút nhấn, màn hình soạn thảo, đọc đĩa, viết .
Ngắt mềm bản chất là một lệnh CALL đặt biệt, nó được gọi một cách chủ động theo nhiều cách thông qua chương trình của người lập trình nghĩa là nó được viết tại một vi trí cố định trong chương trình và nhờ vào vector ngắt chỉ đến chương trình phục vụ ngắt cụ thể. Nếu nhìn một cách hời hợt từ bên ngoài, ta dễ nhầm lẫn giữa gọi thủ tục và ngắt mềm, thực ra chúng vẫn có điểm khác: nếu như gọi thủ tục là việc gọi đi gọi lại một đoạn chương trình nào đó bất kỳ (do người lập trình lập ra) thì ngắt mềm lại gọi một đoạn chương trình đa số được chuẩn hoá cho việc ngắt, ví dụ: khi giao tiếp CPU trong hệ thống với cổng RS232 của máy tính ta chỉ cần dùng lệnh INT 21 máy sẽ hiểu và thực thi ngay lệnh ngắt này. Tuy vậy vẫn có thể dùng CALL thay cho ngắt mềm, vì thế trong họ vi điều khiển 8051 người ta không dùng ngắt mềm mà chỉ dùng ngắt cứng do ứng dụng cục bộ của vi điều khiển, trong khi vi xử lý có ứng dụng rộng lớn hơn nhiều.
Ngắt cứng được gây ra bởi tín hiệu điện tới CPU từ các thiết bị phần cứng. Ngắt này xảy ra ở một thời điểm nào đó bất kỳ mà người lập trình không thể biết được, ví dụ như khi hết giấy trong khay máy in, chuyên gia lập trình của Microsoft không thể biết ! nhưng họ có thể lường trước được khả năng này do vậy tín hiệu hết giấy trên được chuyển thành tín hiệu điện truyền đến CPU, người lập trình nhờ vào vector ngắt chỉ đến
đoạn chương trình phục vụ ngắt để giải quyết vấn đề trên. Như vậy, một thủ tục phục vụ ngắt có thể xuất hiện bất cứ lúc nào trong khi chương trình đang chạy, trong khi đó các thủ tục thông thường chỉ xuất hiện ở những vị trí cố định trong chương trình.
Cũng giống như ở thủ tục, trước khi thực hiện chương trình phục vụ yêu cầu ngắt, địa chỉ trở về cần được cất vào ngăn xếp.
Khi hoạt động ở cơ chế ngắt thiết bị ngoại vi chủ động phát tín hiệu ngắt cho hệ vi xử lý qua chân INT (Interrupt). CPU có phương thức kiểm tra sự xuất hiện của tín hiệu yêu cầu ngắt này và sẽ đáp ứng khi có thể.
Hình 4.1: Cơ chế ngắt 2/ Ngắt mềm:
Là ngắt được gọi bằng một lệnh ở trong chương trình. Lệnh đó là INT kèm theo số hiệu ngắt n, ví dụ: lệnh gọi ngắt số 5 được viết là INT 5. Các ngắt mềm này cho phép gọi trực tiếp các thủ tục (chương trình con) phục vụ ngắt có trong chương trình.
Khi một ngắt được chấp thuận, giá trị của địa chỉ bắt đầu của chương trình phục vụ ngắt gọi là vectơ ngắt. Các số hiệu ngắt n đều tương ứng với các địa chỉ xác định của ô nhớ có chứa địa chỉ đầu tiên của chương trình con phục vụ ngắt chứa trong bảng vectơ ngắt. Nói cụ thể hơn : đối với các nguyên nhân ngắt khác nhau thì CPU sẽ thực thi các mã lệnh khác nhau để gọi cho ngắt ấy một chương trình ngắt tương ứng, địa chỉ đầu tiên của chương trình này được xác định qua bảng vector ngắt. Trong các máy IBM, bảng này nằm trong bộ nhớ trung tâm bắt đầu tại địa chỉ 0 đến 1024.
3/ Gọi lệnh ngắt (calling an interrupt) :
Ðây là một việc làm phức tạp. Lệnh INT 02 làm CPU gọi ra nội dung chứa trong RAM tại địa chỉ 02. Sau khi lưu địa chỉ trở về trong ngăn xếp, con trỏ lệnh IP được chỉ tới vị trí này. Mã ngắt khi ấy được thực hiện. Khi hoàn thành lệnh IRET làm cho chương trình quay trở về từ lệnh ngắt đó. Con trỏ lệnh IP được đặt tới địa chỉ đã được lưu trong ngăn xếp ban đầu.
Chương trình:
;Chương trình ngắt phần mềm--- JMP Start ;nhảy qua bảng của vectơ ngắt
DB 51 ;vectơ tại địa chỉ 02 chỉ tới địa chỉ 51 DB 71 ;vectơ tại địa chỉ 03 chỉ tới địa chỉ 71 Start: INT 02 ;ngắt 02 INT 03 ;ngắt 03 JMP Start ;--- ORG 50 DB E0
;---đảo các bit trong ô nhớ 50---
NOT AL
MOV [50],AL
;---