75. WAIT – Wait for TEST or INTR Signal (chờ tớn hiệu từ chõn TEST hoặc INTR).
2.8.3. KHUễN DẠNG CỦA CHƯƠNG TRèNH HỢP NGỮ
Như chỳng ta đó biết cú hai loại tập tin thực hiện được là .EXE và .COM. - Chương trỡnh .EXE là một thủ tục xa (Far Procedure), cú thể được gọi từ
một đoạn khỏc. Với chương trỡnh .EXE cú thể được định nghĩa 4 đoạn khỏc nhau: Đoạn lệnh (code), đoạn dữ liệu (data), đoạn ngăn xếp (stack) và đoạn thờm (extra).
- Khỏc với chương trỡnh .EXE chương trỡnh .COM là một thủ tục gần (Near Procedure), chỉ gọi được từ bờn trong đoạn lệnh và chỉ cú thể được định nghĩa với duy nhất một đoạn lệnh, do đú phải đặt đoạn dữ liệu và ngăn xếp vào bờn trong đoạn lệnh này.
PSP100h 100h 100h 100h PSP SS CS DS ES Stack ChƯơng trình ChƯơng trình 2.8.3.1. Chương trỡnh .EXE
Khi một chương trỡnh .EXE được nạp vào bộ nhớ, DOS sẽ tạo ra một vựng gồm 256 byte gọi là đoạn mở đầu của chương trỡnh (PSP), dựng để chứa cỏc thụng tin liờn quan đến việc thực hiện chương trỡnh. Vựng PSP nằm ngay trước phần mó lệnh. Cỏc thụng số liờn quan đến chương trỡnh cũng được đưa vào DS, ES. Vỡ vậy DS và ES khụng chứa địa chỉ đoạn dữ liệu, do đú phải đặt thanh ghi DS để nú chứa địa chỉđoạn dữ liệu bằng cỏc lệnh sau đõy:
MOV AX, data MOV DS, AX
Khung cho một chương trỡnh .EXE cú dạng sau:
TITLE Tờn_chương_trỡnh
COMMENT *
Bắt đầu của một khối chỳ thớch
;Khai bỏo đoạn stack
stack SEGMENT STACK
;Khai bỏo kớch thước Stack
stack ENDS ;Khai bỏo đoạn dữ liệu data SEGMENT ;Định nghĩa cỏc dữ liệu data ENDS ;Khai bỏo đoạn mó code SEMENT
ASSUME CS:code, DS:data Start:
;Cỏc lệnh
code ENDS END Start
Nhón Start là nơi chứa địa chỉ đầu tiờn mà CPU sẽ thực hiện, chỉ thị
END sẽ kết thỳc chương trỡnh
Vớ dụ: Viết chương trỡnh .EXE in ra màn hỡnh dũng chữ “DHKTCN”. Trước hết ta sẽđưa ra một số hàm ngắt của INT 21H và INT 20H
Hàm 1 của ngắt INT 21H: Đọc một ký tự từ bàn phớm.
Vào: AH=1
Ra: AL=mó ASCII củ ký tự
AL=0 khi ký tự gừ vào là cỏc phớm chức năng
Hàm 2 của ngắt INT 21H: Hiện một ký tự lờn màn hỡnh. Vào: AH=2 DL=mó ASCII của ký tự cần hiển thị Hàm 9 của ngắt INT 21H: Hiện chuỗi ký tự với $ ở cuối lờn màn hỡnh. Vào: AH=9 DX=địa chỉ lệch của chuỗi ký tự
Hàm 4CH, ngắt INT 21H Kết thỳc chương trỡnh loại .EXE hoặc .COM
Vào: AH=4CH
Ngắt INT 20H dành riờng để kết thỳc chương trỡnh dạng .COM
Chương trỡnh được viết như sau: TITLE VIDU_EXE
COMMENT *
in ra man hinh dong chu DHKTCN Chuong trinh thuoc dang .EXE
*
stack SEGMENT STACK
DB 20 DUP(‘STACK’) stack ENDS data SEGMENT STRING DB ‘DHKTCN!$’ data ENDS code SEGMENT
ASSUME CS:code, DS:data Start:
;Dat thanh ghi DS
MOV AX, data
MOV DS, AX
;In ra man hinh
MOV AH, 9
LEA DX, STRING ;chuyen dia chi lech
;cua xau vao DX
INT 21h MOV AH, 4Ch INT 21h code ENDS END Start Trong chương trỡnh trờn phần chỉ thị:
stack SEGMENT STACK
DB 20 DUP(‘STACK’)
stack ENDS
Là phần khai bỏo đoạn ngăn xếp cú tờn là STACK. Ngăn xếp cú kớch thước là 20x5=100 byte và lỳc khởi đầu được lấp đầy bằng từ STACK.
data SEGMENT
STRING DB ‘DHKTCN!$’
data ENDS
Là phần khai bỏo đoạn dữ liệu cú tờn là data, đang chứa xõu STRING là dũng chữ “DHKTCN!” cần in ra màn hỡnh. Xõu này kết thỳc bởi ký tự $ để bỏo cho DOS biết là đó đến cuối xõu.
Đoạn chương trỡnh được bao quanh bởi cỏc chỉ thị sau: code SEGMENT
ASSUME CS:code, DS:data ...
code ENDS
Trong đú chỉ dẫn ASSUME bỏo cho Assembler biết rằng thanh ghi CS trỏđến đoạn lệnh, thanh ghi DS trỏđến đoạn dữ liệu.
Trong chương trỡnh trờn cú sử dụng ngắt 21h (xem phần phụ lục A trang 320 – Kỹ thuật vi xử lý của Văn Thế Minh). Trong đú hàm 9 của INT 21h được dựng để in xõu cú địa chỉ đặt trong thanh ghi DS:DX ra màn hỡnh, hàm 4Ch để
kết thỳc chương trỡnh và trở về DOS.
2.8.3.2. Chương trỡnh .COM
Chương trỡnh .COM chỉ cú một đoạn duy nhất. Khi chương trỡnh .COM bắt đầu chạy thỡ cả 4 thanh ghi đoạn đều trỏ tới đầu của vựng PSP. Cỏc chỉ thị
cho CPU bắt đầu tạo Offset 100h ngay sau vựng PSP. Vỡ vậy trong chương trỡnh .COM, chỉ dẫn ASSUME phải bỏo cho CPU biết cỏc thanh ghi CS, DS
đều trỏ đến đoạn lệnh, khụng cần tạo ra một ngăn xếp riờng biệt và khụng cần
đặt lại một thanh ghi đoạn nào. Với chương trỡnh .COM chỉ cần cho thanh ghi IP (con trỏ lệnh) chỉ đến địa chỉ đầu tiờn trong đoạn lệnh bằng lệnh chỉ dẫn ORG 100h ngay đầu đoạn lệnh.
Khung cho một chương trỡnh .COM cú dạng sau:
TITLE Tờn_chương_trỡnh COMMENT * Bắt đầu của một khối chỳ thớch * ;Khai bỏo đoạn mó code SEGMENT
ASSUME CS:code, DS:code
ORG 100h
Start:
;Cỏc lệnh
code ENDS END Start
Trở lại vớ dụ trờn. Bõy giờ chỳng ta sẽ viết chương trỡnh dạng .COM TITLE VIDU_COM
COMMENT *
in ra man hinh dong chu DHKTCN Chuong trinh thuoc dang .COM
* code SEGMENT
ORG 100h Start:
;In ra man hinh
MOV AH, 9 ;ham cua INT 21h
LEA DX, STRING ;lay dia chi offset
;cua xau INT 21h MOV AH, 4Ch INT 21h STRING DB ‘DHKTCN!$’ code ENDS END Start 2.8.4. CẤU TRÚC LẬP TRèNH CƠ BẢN BẰNG HỢP NGỮ 2.8.4.1. Cấu trỳc tuần tự
Kiểu cấu trỳc này cỏc lệnh được viết tuần tự, lệnh nọ tiếp lệnh kia. Đõy cũng là cấu trỳc thụng dụng và đơn giản nhất.
Vớ dụ: Cỏc thanh ghi BX và CX chứa cỏc giỏ trị của biến b và c. Hóy tớnh
giỏ trị của biểu thức a=2(b+c) và lưu kết quả vào AX. XOR AX, AX ;Xoa thanh ghi AX
ADD AX, BX ;cong thanh ghi AX voi b ADD AX, CX ;cong tiep voi c
SAL AX, 1 ;nhan doi ket qua a=2(b+c)-> AX