Giáo trình Hợp ngữ

Các thanh ghi thông dụng:

Bao gồm 4 thanh ghi. Mỗi thanh ghi đều có những chức năng riêng mặc dù

chúng cũng là những nơi lưu trữ những kết quả trung gian:

AX là thanh ghi 16 bit gọi là thanh ghi tích lũy (Accumulator) sử dụng khi

thực hiện các phép tính số học.

BX là thanh ghi 16 bit gọi là thanh ghi nền (Base register)

CX là thanh ghi 16 bit gọi là thanh ghi đếm (Counter)

DX là thanh ghi 16 bit gọi là thanh ghi dữ liệu (Data)

Nên biết rằng mỗi thanh ghi này đều có thể phân ra làm hai thanh ghi 8 bit sử

dụng riêng rẽ được:

AX = AH và AL;

BX = BH và BL;

CX = CH và CL;

DX = DH và DL.

Cũng nên nhớ rằng những phép toán thực hiện với các thanh ghi luôn nhanh

khi chúng thực hiện với các ô nhớ trong bộ

 

pdf 110 trang kimcuc 7200
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hợp ngữ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Hợp ngữ

Giáo trình Hợp ngữ
TRƯỜNG ĐẠI HỌC ĐÀ LẠT 
F 7 G 
GIÁO TRÌNH 
HỢP NGỮ 
NGUYỄN HỮU LỘC 
2002 
Hợp Ngữ - 2 - 
MỤC LỤC 
LỜI MỞ ĐẦU ..................................................................................................................... 4 
CHƯƠNG 1: GIỚI THIỆU CHUNG ................................................................................... 5 
I. CÁC THANH GHI TRONG VI XỬ LÝ HỌ INTEL:................................................... 5 
1. Các thanh ghi thông dụng: ....................................................................................... 6 
2. Các thanh ghi phân đoạn ......................................................................................... 7 
3. Các thanh ghi chỉ mục và con trỏ:............................................................................ 7 
4. Thanh ghi trạng thái (FLAG) ................................................................................... 8 
II. ĐỊA CHỈ Ô NHỚ: ....................................................................................................... 8 
III. MỘT SỐ LỆNH CƠ BẢN: ........................................................................................ 9 
CHƯƠNG 2: GỌI NGẮT VÀ TRÌNH DEBUG..................................................................11 
I. CÁC LỆNH GỌI NGẮT: ...........................................................................................11 
II. TRÌNH DEBUG:........................................................................................................12 
III. VÀI CHƯƠNG TRÌNH ỨNG DỤNG :.....................................................................15 
CHƯƠNG 3: HỢP NGỮ DÙNG TRONG PC.....................................................................19 
I. DÒNG LỆNH:.............................................................................................................19 
II. DỮ LIỆU:...................................................................................................................20 
1. Hằng: ......................................................................................................................20 
2. Biến: .......................................................................................................................21 
III. CẤU TRÚC CHƯƠNG TRÌNH:...............................................................................22 
CHƯƠNG 4: PHƯƠNG PHÁP LẬP TRÌNH......................................................................27 
I. TỔNG QUAN: ............................................................................................................27 
II. CÁC LỆNH LIÊN QUAN ĐẾN RẼ NHÁNH:...........................................................27 
1. Các lệnh rẽ nhánh có điều kiện: ............................................................................28 
2. Các lệnh rẽ nhánh không điều kiện: ......................................................................29 
III. CÁC CẤU TRÚC ĐIỀU KHIỂN:.............................................................................29 
CHƯƠNG 5: NGĂN XẾP VÀ THỦ TỤC ..........................................................................38 
I. NGĂN XẾP: ................................................................................................................38 
II. THỦ TỤC: .................................................................................................................38 
III. SỬ DỤNG PTR VÀ LABEL: ...................................................................................40 
IV. VÀI CHƯƠNG TRÌNH ỨNG DỤNG:......................................................................41 
1. Hiện số thập phân: ..................................................................................................41 
2. Hiện số nhị phân và thập lục phân..........................................................................44 
3. Đọc từ bàn phím......................................................................................................46 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 3 - 
CHƯƠNG 6: MOĐUN CHƯƠNG TRÌNH & CÁC KIỂU ĐỊNH VỊ ĐỊA CHỈ .............51 
I. MOĐUN CHƯƠNG TRÌNH .......................................................................................51 
1. Định hướng biên dịch extrn.....................................................................................51 
2. Định hướng biên dịch public ...................................................................................52 
3. Lập thư viện - tạo vĩ lệnh (macro) .........................................................................54 
II. CÁC KIỂU ĐỊNH VỊ ĐỊA CHỈ..................................................................................56 
III. CHƯƠNG TRÌNH ỨNG DỤNG...............................................................................60 
IV. TẠO TẬP TIN .COM ...............................................................................................67 
1- Dạng của một chương trình COM...........................................................................68 
2- Ưùng dụng tập tin .com ............................................................................................69 
CHƯƠNG 7: SỬ DỤNG PHÂN ĐOẠN TOÀN PHẦN.....................................................76 
I- SỬ DỤNG CÁC ĐỊNH HƯỚNG BIÊN DỊCH............................................................76 
1. Segment ..................................................................................................................76 
2. Định hướng biên dịch assume.................................................................................79 
II - DẠNG CỦA CHƯƠNG TRÌNH .EXE SỬ DỤNG TRONG CÁC PHƯƠNG PHÁP 
CŨ: .................................................................................................................................79 
III- VÍ DỤ CHƯƠNG TRÌNH COM..............................................................................83 
CHƯƠNG 8: CHƯƠNG TRÌNH ỨNG DỤNG ..................................................................85 
I. IN NỘI DUNG VĂN BẢN RA MÁY IN: ...................................................................85 
1. Sử dụng hàm 40h ngắt 21h (DOS) để thực hiện......................................................85 
2. Sử dụng hàm 01h ngắt 17h (ROMBIOS) ................................................................85 
II. ĐẾM SỐ TỪ TRONG MỘT TẬP TIN ......................................................................86 
III- ĐỔI NGƯỢC CHUỖI.............................................................................................89 
IV. CHƯƠNG TRÌNH HIỂN THỊ THỜI GIAN .............................................................90 
V. CHƯƠNG TRÌNH THƯỜNG TRÚ BỘ NHỚ............................................................97 
Phụ lục A: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA DOS.......................................105 
Phụ lục B: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA ROM-BIOS............................108 
TÀI LIỆU THAM KHẢO.................................................................................................110 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 4 - 
LỜI MỞ ĐẦU 
Hợp ngữ là một môn học dành cho sinh viên các chuyên ngành kỹ thuật. 
Là một ngôn ngữ can thiệp sâu vào hệ thống máy tính, hợp ngữ thường được sử 
dụng trong những phần việc tương đối tinh tế như điều khiển hệ thống, vi điều 
khiển ... 
Tuy vậy với những người lần đầu tiên làm quen với ngôn ngữ này, việc 
tiếp thu quả thật rất khó khăn bởi lẽ ngôn ngữ này gần với ngôn ngữ máy và sử 
dụng các ký tự gợi nhớ nên khó hiểu hơn sử dụng các ngôn ngữ cấp cao như 
Pascal, C..v.v...Ngoài ra, người học không những phải biết phần mềm mà còn 
phải hiểu phần cứng ở mức độ nào đó nữa. Điều này tạo ra một áp lực rất lớn gây 
khó khăn cho người học. 
Trong nhiều năm giảng dạy môn này, tôi nhận thấy hiện có rất nhiều 
sách, tài liệu tham khảo viết về hợp ngữ song để có một tài liệu đáp ứng yêu cầu 
của sinh viên trong việc tiếp thu môn hợp ngữ tuần tự từ dễ đến khó có phương 
pháp thì thật hiếm. 
Do vậy tôi thực hiện giáo trình này với mong ước có một tài liệu đáp ứng 
yêu cầu trên. Trong giáo trình, tôi có đưa vào rất nhiều ví dụ và ứng dụng từ thấp 
đến cao để sinh viên có thể tiếp thu dễ dàng môn học này. 
Tuy vậy tài liệu này không sao tránh khỏi những sai sót, rất mong các 
đồng nghiệp, sinh viên và bạn đọc góp ý 
Hoàn thành giáo trình này, tôi xin chân thành cám ơn đến các đồng 
nghiệp trong Khoa Vật lý Trường Đại học Dalat đã động viên, góp ý và tạo điều 
kiện cho tôi trong quá trình thực hiện. Tôi cũng xin ghi nhận sự đóng góp của 
nhiều thế hệ sinh viên khoa vật lý, khoa toán - tin để giáo trình này được sắp xếp 
ngày càng dễ hiểu và hợp lý hơn. 
Nguyễn Hữu Lộc
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 5 - 
CHƯƠNG 1: GIỚI THIỆU CHUNG 
Tại sao chúng ta phải học lập trình với hợp ngữ trong khi hiện nay 
có rất nhiều ngôn ngữ cấp cao như C hoặc Pascal dùng để lập trình dễ dàng 
hơn? Có thể nói có nhiều câu trả lời cho câu hỏi này. Nhưng ban đầu, chúng 
ta có thể xét đối với hợp ngữ thì mỗi lệnh tương ứng với một lệnh ngôn ngữ 
máy. Nói cách khác, nếu mỗi dòng lệnh trong chương trình là một lệnh hợp 
ngữ và một từ máy tương ứng với một lệnh máy như vậy n dòng trong chương 
trình sẽ tạo ra một chương trình máy gồm n từ. Như vậy hợp ngữ có thể xem 
là ngôn ngữ rất gần với ngôn ngữ máy, chúng ta có thể tiếp cận đến tất cả các 
ngóc ngách của máy và quan trọng hơn là chúng ta thực hiện chương trình 
viết bằng hợp ngữ nhanh hơn so với viết bằng những ngôn ngữ cấp cao khác. 
Tuy vậy cũng cần thấy rằng rất nhiều ngôn ngữ cấp cao hổ trợ giao diện với 
hợp ngữ, nói cách khác là chúng ta có thể viết 1 đoạn hợp ngữ trong chương 
trình viết bằng ngôn ngữ cấp cao như C hoặc Pascal... Điều này cho phép 
chúng ta lập trình hiệu quả hơn với những phần việc sát với hệ thống và đòi 
hỏi thời gian nhanh. 
Trong kiến trúc máy tính nhiều cấp, việc chuyển một chương trình 
của người sử dụng từ một ngôn ngữ này sang chương trình dùng ngôn ngữ 
khác gọi là chương trình dịch. Ngôn ngữ sử dụng để viết chương trình ban đầu 
gọi là ngôn ngữ nguồn còn ngôn ngữ sau khi dịch gọi là ngôn ngữ đích. 
Người ta phân biệt các chương trình dịch ra làm hai loại tùy theo 
mối quan hệ giữa ngôn ngữ nguồn và ngôn ngữ đích. Khi ngôn ngữ nguồn 
gồm những ký tự gợi nhớ lệnh của ngôn ngữ máy thì chương trình dịch sẽ gọi 
là hợp dịch (assembler) và ngôn ngữ nguồn là hợp ngữ (assembly language). 
Trong khi đó ngôn ngữ nguồn là ngôn ngữ cấp cao như C hoặc Pascal thì 
chương trình dịch sẽ gọi là biên dịch. 
I. CÁC THANH GHI TRONG VI XỬ LÝ HỌ INTEL: 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 6 - 
Bộ vi xử lý 8088 có thể địa chỉ hóa đến 220 byte bắt đầu từ địa chỉ 0. Những 
lệnh của 8088 có thể thực hiện với những từ 8 bit hay byte cũng như với những từ 16 bits. 
8088 sử dụng những địa chỉ 20 bits để truy cập đến 220 byte ô nhớ. Vì các thanh ghi có 
chiều dài là 16 bits nên các địa chỉ dùng 20 bits sẽ có khó khăn trong thực hiện. Để giải 
quyết vấn đề này, những nhà sản xuất bộ vi xử lý đã sử dụng 4 thanh ghi phân đoạn (một 
dùng cho lệnh, một cho dữ liệu, một cho ngăn xếp và một dự trữ) 
Những thanh ghi có thể xem là những ô nhớ nằm bên trong bộ vi xử lý có thời 
gian truy xuất cao, với 8088, chúng ta có 14 thanh ghi chia ra làm 4 loại: 
- Các thanh ghi làm việc; 
- Các thanh phân đoạn; 
- Các thanh ghi bước nhảy (offset); 
- Thanh ghi trạng thái (Cờ: FLAG) 
1. Các thanh ghi thông dụng: 
Bao gồm 4 thanh ghi. Mỗi thanh ghi đều có những chức năng riêng mặc dù 
chúng cũng là những nơi lưu trữ những kết quả trung gian: 
AX là thanh ghi 16 bit gọi là thanh ghi tích lũy (Accumulator) sử dụng khi 
thực hiện các phép tính số học. 
BX là thanh ghi 16 bit gọi là thanh ghi nền (Base register) 
CX là thanh ghi 16 bit gọi là thanh ghi đếm (Counter) 
DX là thanh ghi 16 bit gọi là thanh ghi dữ liệu (Data) 
Nên biết rằng mỗi thanh ghi này đều có thể phân ra làm hai thanh ghi 8 bit sử 
dụng riêng rẽ được: 
AX = AH và AL; 
BX = BH và BL; 
CX = CH và CL; 
DX = DH và DL. 
Cũng nên nhớ rằng những phép toán thực hiện với các thanh ghi luôn nhanh 
khi chúng thực hiện với các ô nhớ trong bộ nhớ. 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 7 - 
2. Các thanh ghi phân đoạn 
Gồm 4 thanh ghi: 
CS viết tắt từ "Code Segment", là nơi lưu trữ địa chỉ của phân đoạn bộ nhớ 
tại đó các lệnh trong chương trình nạp vào (mã máy). 
DS viết tắt từ "Data Segment", là nơi lưu trữ địa chỉ của phân đoạn bộ nhớ 
tại đó đặt dữ liệu (data) của chương trình. 
SS viết tắt từ "Stack Segment", là nơi lưu trữ địa chỉ của phân đoạn ngăn 
xếp. 
ES viết tắt từ "Extra Segment", là nơi lưu trữ địa chỉ của phân đoạn dự trữ 
thường dùng ghi giữ dữ liệu. 
3. Các thanh ghi chỉ mục và con trỏ: 
Các thanh ghi này giữ giá trị bước nhảy (offset ) kết hợp với địa chỉ phân đoạn. 
Tổng cộng có 5 thanh ghi: 
SI viết tắt từ "Source Index". Thanh ghi này là thanh ghi 16 bit sử dụng khi 
thực hiện các phép toán với chuỗi (dãy ký tự); thường được dùng kết hợp với thanh ghi 
phân đoạn DS. 
DI viết tắt từ "Destination Index". Thanh ghi này cũng là thanh ghi 
16 bit sử dụng khi thực hiện các phép toán với chuỗi (dãy ký tự); thường được 
dùng kết hợp với thanh ghi phân đoạn DS. Tuy nhiên trong trường hợp 
chuyển chuỗi thì nó sẽ kết hợp với thanh ghi phân đoạn ES. 
BP hoặc "Base Pointer". Thanh ghi 16 bit này kết hợp với thanh ghi phân đoạn 
SS (SS:BP) để đưa dữ liệu vào trong ngăn xếp khi gọi chương trình con (CALL) 
SP hoặc "Stack Pointer". Thanh ghi 16 bit này cũng kết hợp với thanh ghi phân 
đoạn SS (SS:SP) để chỉ ra phần tử cuối của ngăn xếp. 
IP gọi là con trỏ lệnh (Instruction Pointer). Thanh ghi 16 bit này kết hợp với 
thanh ghi phân đoạn CS (CS:IP) để chỉ đến lệnh tiếp theo sẽ thực hiện. Nội dung của 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 8 - 
thanh ghi này không thể thay đổi trực tiếp; nó chỉ bị thay đổi một cách gián tiếp thông qua 
các lệnh nhảy bước, qua các chương trình con và qua các ngắt. 
4. Thanh ghi trạng thái (FLAG) 
Thanh ghi trang thái là ... ng trình được tiến hành như sau: sau khi thiết lập con trỏ và 
các vectơ ngắt, thủ tục MAIN đợi 1 phím nhấn. Khi ấy thủ tục ngắt 
TIME_INT cập nhật thời gian mới mỗi khi có xung nhịp của mạch thời 
gian. Sau khi một phím được nhấn, vectơ cũ được phục hồi và chương 
trình kết thúc. 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 95 - 
PGM2_1.ASM 
EXTRN GET_TIME:NEAR, SETUP_INT:NEAR 
.MODEL SMALL 
.STACK 100H 
.DATA 
TIME_BUF DB '00:00:00$' 
CURSOR_POS DW ? 
NEW_VEC DW ?,? 
OLD_VEC DW ?,? 
; 
.CODE 
MAIN PROC 
 MOV AX,@DATA 
 MOV DS,AX ;Khởi tạo DS 
;cất vị trí con trỏ 
 MOV AH,3 
 MOV BH,0 ;trang 0 
 INT 10H 
 MOV CURSOR_POS,DX; cất vị trí con trỏ 
;thiết lập thủ tục ngắt bằng cách 
; đưa segment:offset của TIME_INT vào NEW_VEC 
 MOV NEW_VEC, OFFSET TIME_INT 
 MOV NEW_VEC+2,SEG TIME_INT 
 LEA DI, OLD_VEC ;DI trỏ đến bộ đệm vectơ 
 LEA SI, NEW_VEC ;SI trỏ đến vectơ mới 
 MOV AL,1CH ; ngắt thời gian 
 CALL SETUP_INT ; thiết lập vectơ mới 
; đọc bàn phím 
 MOV AH,0 
 INT 16H 
;phục hồi vectơ ngắt cũ 
 LEA DI,NE_VEC 
 LEA SI,OLD_VEC 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 96 - 
 MOV AL,1CH 
 CALL SETUP_INT 
;trở về DOS 
 MOV AH,4CH 
 INT 21H 
MAIN ENDP 
; 
TIME_INT PROC 
;thủ tục ngắt 
;kích hoạt bởi mạch thời gian 
 PUSH DS; cất giá trị tức thời của DS 
 MOV AX,@DATA 
 MOV DS,AX ;DS trỏ đến đoạn dữ liệu 
;lấy thời gian mới 
 LEA BX, TIME_BUF ; BX trỏ đến bộ đệm 
 ;thời gian 
 CALL GET_TIME ; cất thời gian trong bộđệm 
;hiển thị thời gian 
 LEA DX,TIME_BUF 
 MOV AH,09H 
 INT 21H 
;phục hồi vị trí con trỏ 
 MOV AH,2 
 MOV BH,0 
 MOV DX,CURSOR_POS 
 INT 10H 
 IRET 
TIME_INT ENDP 
; 
 END MAIN 
Lệnh LINK gồm các mođun PGM2_1.ASM, PGM1_2.ASM, 
PGM2_2.ASM 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 97 - 
V. CHƯƠNG TRÌNH THƯỜNG TRÚ BỘ NHỚ. 
Cũng vẫn hiển thị giờ nhưng bây giờ là ở thường trú trong bộ nhớ 
(terminate and stay resident) 
Thông thường khi kết thúc một chương trình, bộ nhớ mà nó chiếm 
giữ được DOS sử dụng để nạp chương trình khác. Tuy nhiên khi một 
chương trình TSR kết thúc, bộ nhớ không bị thu hồi lại. Chính vì thế một 
chương trình TSR còn được gọi là chương trình thường trú bộ nhớ 
(memory resident program) 
Để trở về DOS, một chương trình TSR kết thúc bằng cách sử dụng 
ngắt 27h hay ngắt 21h (hàm 31h) 
Chúng ta sẽ tạo một chương trình .COM vì để sử dụng ngắt 27h 
chúng ta cần xác định số byte được ở lại thường trú trong bộ nhớ. Cấu 
trúc của một chương trình .COM khiến việc tính toán dễ dàng hơn vì nó 
chỉ có một phân đoạn chương trình. 
Một khi muốn kết thúc hoàn toàn nghĩa là chương trình TSR 
không hoạt động. Chương trình này phải được kích hoạt bởi các tác động 
ngoài như một tổ hợp phím nào đó (Ví dụ:Ctrl+Shift). Ưu điểm của 
chương trình thường trú là chúng có thể được kích hoạt khi đang chạy 
một chương trình nào khác. 
Chương trình gồm 2 phần: Phần khởi tạo thiết lập vectơ ngắt và 
phục vụ ngắt 
Tập tin PGM3_1.ASM 
EXTRN MAIN:NEAR, SETUP_INT:NEAR 
EXTRN NEW_VEC:DWORD, OLD_VEC:DWORD 
PUBLIC INITIALIZE 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 98 - 
C_SEG SEGMENT PUBLIC 
 ASSUME CS:C_SEG 
INITIALIZE PROC 
;thiết lập vectơ ngắt 
 MOV NEW_VEC,OFFSET MAIN; lưu địa chỉ 
 MOV NEW_VEC+2,CS 
 LEA DI, OLD_VEC ; DI trỏ về vectơ cũ 
 LEA SI, NEW_VEC ; SI trỏ về vectơ mới 
 MOV AL,09H ;ngắt bàn phím 
 CALL SETUP_INT ; thiết lập vectơ ngắt 
;trở về DOS 
 LEA DX, INITIALIZE 
 INT 27H ; Kết thúc và ở lại thường trú 
INITIALIZE ENDP 
C_SEG ENDS 
 END INITIALIZE 
Cách đơn giản để nhận biết các phím điều khiển là kiểm tra các 
cờ phím (hàm 2- ngắt 16h). Chúng ta sẽ sử dụng tổ hợp phím Ctrl và 
Shift phải để kích hoạt và kết thúc sự hiển thị đồng hồ. Khi kích hoạt, 
thời gian hiện tại sẽ được hiển thị tại góc phải trên của màn hình . Đầu 
tiên phải chép lại dữ liệu màn hình để sau khi kết thúc hiển thị đồng hồ 
ta có thể phục hồi lại màn hình cũ. 
Thủ tục SET_CURSOR thiết lập vị trí con trỏ tại hàng 0 và cột 
trong DL 
Thủ tục SAVE_SCREEN chép dữ liệu màn hình vào bộ đệm 
Thủ tục RESTOR_SCREEN trả lại dữ liệu cho bộ đệm màn hình 
Tập tin PGM3_2.ASM 
EXTRN SS_BUF:BYTE 
PUBLIC SAVE_SCREEN,RESTOR_SCREEN, SET_CURSOR 
C_SEG SEGMENT PUBLIC 
 ASSUME CS:C_SEG 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 99 - 
; 
SAVE_SCREEN PROC 
;lưu giữ 8 ký tự ở góc phải trên của màn hình 
 LEA DI,SS_BUF ; Bộ đệm màn hình 
 MOV CX,8 
 MOV DL,72 ;cột 72 
 CLD ; xoá DF cho thao tác chuỗi 
SS_LOOP: 
 CALL SET_CURSOR;thiết lập con trỏ 
 MOV AH,08H ; đọc ký tự trên màn hình 
 INT 10H ;AH=thuộc tính/AL=ký tự 
 STOSW ; cất ký tự và thuộc tính 
 INC DL ; cột tiếp theo 
 LOOP SS_LOOP 
 RET 
SAVE_SCREEN ENDP 
; 
RESTOR_SCREEN PROC 
;phục hồi màn hình đã cất 
 LEA SI,SS_BUF ;SI trỏ đến bộ đệm 
 MOV DI,8 ;lặp 8 lần 
 MOV DL,72 ;cột 72 
 MOV CX,1 ; mỗi lần 1 ký tự 
RS_LOOP: 
 CALL SET_CURSOR ;di chuyển con trỏ 
 LODSW ;AL=ký tự/AH=thuộc tính 
 MOV BL,AH 
 MOV AH,9 ; viết ký tự và thuộc tính 
 MOV BH,0 ;trang 0 
 INT 10h 
 INC DL ;vị trí ký tự tiếp theo 
 DEC DI 
 JG RS_LOOP 
 RET 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 100 - 
RESTOR_SCREEN END 
; 
SET_CURSOR PROC 
;chuyển con trỏ đến hàng 0, cột DL 
; vào DL=số hiệu cột 
 MOV AH,2 
 MOV BH,0 
 MOV DH,0 
 INT 10H 
SET_CURSOR END 
; 
C_SEG ENDS 
 END 
Bây giờ chúng ta đã sẵn sàng để viết thường trình ngắt. Để xác 
định xem sự hiển thị thời gian có được kích hoạt hay không ta sử dụng cờ 
biến đổi được ON_FLAG. Cờ này được thiết lập bằng 1 khi thời gian 
được hiển thị. MAIN là thủ tục ngắt 
Tập tin PGM3_3.ASM 
;chương trình thường trú bộ nhớ chỉ thời gian 
; kích hoạt bằng tổ hợp phím Ctrl+Shift phải 
EXTRN INITIALIZE:NEAR,SAVE_SCREEN:NEAR 
EXTRN RESTOR_SCREEN:NEAR,SET_CURSOR:NEAR 
EXTRN GET_TIME:NEAR 
PUBLIC MAIN 
PUBLIC NEW_VEC,OLD_VEC,CURSOR_POS 
C_SEG SEGMENT 
 ASSUME CS:C_SEG, DS:C_SEG, SS:C_SEG 
 ORG 100H 
START: 
 JMP MAIN 
; 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 101 - 
SS_BUF DB 16DUP(?) ;bộ đệm lưu giữ màn hình 
TIME_BUF DB '00:00:00$' 
CURSOR_POS DW ? ;vị trí con trỏ 
ON_FLAG DB 0 ;1=chạy thủ tục ngắt 
NEW_VEC DW ?,? ; chứa vectơ mới 
OLD_VEC DW ?,? ;chứa vectơ cũ 
; 
MAIN PROC 
;thủ tục ngắt 
; cất các thanh ghi 
 PUSH DS 
 PUSH ES 
 PUSH AX 
 PUSH BX 
 PUSH CX 
 PUSH DX 
 PUSH SI 
 PUSH DI 
 MOV AX,CS ;thiết lập DS 
 MOV DS,AX 
 MOV ES,AX 
;Gọi thủ tục ngắt bàn phím cũ 
 PUSHF 
 CALL INITIALIZE 
 ;lấy các cờ bàn phím 
 MOV AX,CS ;thiết lập lại DS 
 MOV DS,AX 
 MOV ES,AX ;ES cho phân đoạn hiện hành 
 MOV AH,02 ; xem cờ bàn phím 
 INT 16H ;AL chứa các cờ bàn phím 
 TEST AL,1 ; Shift phải? 
 JE I_DONE ; không, thoát 
 TEST AL,100B ;Ctrl? 
 JE I_DONE ;không, thoát 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 102 - 
;đúng, xử lý 
 CMP ON_FLAG,1;thủ tục đang được kích hoạt? 
 JE RESTOR ;đúng, khử kích hoạt 
 MOV ON_FLAG,1 ;không, kích hoạt 
;cất vị trí con trỏ và thông tin màn hình 
 MOV AH,03 ;lấy vị trí con trỏ 
 MOV BH,0 ;trang 0 
 INT 10H ;DH=hàng,DL=cột 
 MOV CURSOR_POS,DX ;lưu vị trí con trỏ 
 CALL SAVE_SCREEN ;lưu màn hình 
 ; hiển thị thời gian 
; định vị con trỏ đến góc trên bên phải 
 MOV DL,72 ; cột 72 
 CALL SET_CURSOR 
 LEA BX,TIME_BUF 
 CALL GET_TIME ; lấy thời gian hiện tại 
;hiển thị thời gian 
 LEA SI,TIME_BUF 
 MOV CX,8 ; 8ký tự 
 MOV BH,0 ; trang 0 
 MOV AH,0EH ; viết ký tự 
M1: 
 LODSB ;ký tự trong AL 
 INT 10H ;con trỏ được chuyển 
 ; đến hàng tiếp theo 
 LOOP M1 ; lặp lại 8 lần 
 JMP RES_CURSOR 
RESTOR: 
;phục hồi màn hình 
 MOV ON_FLAG,0 ;xoá cờ 
 CALL RESTOR_SCREEN 
;phục hồi vị trí con trỏ lưu trữ 
RES_CURSOR: 
 MOV AH,02 ;thiết lập con trỏ 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 103 - 
 MOV BH,0 
 MOV DX,CURSOR_POS 
 INT 10H 
;phục hồi các thanh ghi 
I_DONE: POP DI 
 POP SI 
 POP DX 
 POP CX 
 POP BX 
 POP AX 
 POP ES 
 POP DS 
 IRET ;trở về từ ngắt 
MAIN ENDP 
C_SEG ENDS 
 END START 
 Tập tin PGM3_4.ASM 
PUBLIC GET_TIME,SETUP_INT 
C_SEG SEGMENT PUBLIC 
 ASSUME CS:C_SEG 
; 
GET_TIME PROC 
 MOV AH,2CH 
 INT 21H 
 MOV AL,CH 
 CALL CONVERT 
 MOV [BX],AX 
 MOV AL,CL 
 CALL CONVERT 
 MOV [BX+3],AX 
 MOV AL,DH 
 CALL CONVERT 
 MOV [BX+6],AX 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 104 - 
 RET 
GET_TIME ENDP 
; 
CONVERT PROC 
 MOV AH,0 
 MOV DL,10 
 DIV DL 
 OR AX,0303H 
 RET 
CONVERT ENDP 
; 
SETUP_INT PROC 
 MOV AH,35H 
 INT 21H 
 MOV [DI],BX 
 MOV [DI+2],ES 
 MOV DX,[SI] 
 PUSH DS 
 MOV DS,[SI+2] 
 MOV AH,25H 
 INT 21H 
 POP DS 
 RET 
SETUP_INT ENDP 
; 
C_SEG ENDS 
 END 
LINK PGM3_3+PGM3_2+PGM3_4+PGM3_1. 
Chú ý PGM3_1 được liên kết cuối cùng để thủ tục INITIALIZE 
được đưa vào cuối chương trình. Viết các chương trình TSR rất phức tạp, 
nếu như đã có một chương trình TSR khác trong hệ thống, chương trình 
hiện có có thể không còn thực hiện đúng nữa 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 105 - 
PHỤ LỤC A: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA DOS 
Chức năng Ngắt 
(Hex) 
TG vào 
Kết thúc chương trình 20 
Kết thúc nhưng nằm 
thường trực (max 64KB) 
27 DS:DX=địachỉ byte sau vùng được giữ 
lại thường trú 
CÁC CHƯƠNG TRÌNH PHỤC VỤ CỦA DOS (NGẮT 21h) 
Chức năng Số (Hex) TG vào TG ra 
Đưa vào từ bàn phím 01 AH=01 
AL=ký tự vào 8 bit 
Đưa ra màn hình một ký 
tự 
02 AH=02 
DL=ký tự ra 8 bit 
Đưa ra máy in 05 AH=05 
DL=ký tự 
Đưa vào trực tiếp từ bàn 
phím và không hiện 
07 AH=07 
AL=ký tự vào 8 bit 
Đưa ra màn hình một 
chuỗi 
09 AH=09 
DS:DX = trỏ đến 
chuỗi kết thúc bằng 
'$' 
Đưa vào đệm bàn phím 0A AH=0A 
DS:DX=trỏ đến đệm 
bàn phím 
Thiết lập vectơ ngắt 25 AH=25 
AL= số hiệu ngắt 
DS:DX= trỏ tới 
chương trình xử lý 
ngắt 
Lấy ngày tháng năm 2A AH=2A AL=thứ trong tuần 
CX=năm (1980-2099 
DH=tháng 
DL=ngày 
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 106 - 
Nguyễn Hữu Lộc Khoa Vật Lý 
Chức năng Số (Hex) TG vào TG ra 
Đặt ngày tháng năm 2B AH=2B 
CX=năm (1980-2099 
DH=tháng 
DL=ngày 
AL=mã trả về 
Lấy thời gian 2C AH=2C CL=phút 
CH=giờ 
DL=phần trăm giây 
DH=giây 
Đặt thời gian 2D AH=2D 
CL=phút 
CH=giờ 
DL=phần trăm giây 
DH=giây 
Kết thúc chương trình và 
thường trú 
31 AH=31 
AL=mã trả về 
DX=địa chỉ đoạn 
chương trình trên bộ 
nhớ để giải phóng 
AX=mã trả về 
Lấy vectơ ngắt 35 AH=35 
AL=số hiệu ngắt 
ES:BX=vectơ ngắt 
AX=mã trả về 
Tạo thư mục 39 AH=39 
DS:DX = trỏ đến 
chuỗi ASCII tên 
đường 
Nếu sai CF=01, 
 AX= mã lỗi 
Nếu tốt: CF=00 
Xoá thư mục 3A AH=3A 
DS:DX = trỏ đến 
chuỗi ASCII tên 
đường 
Nếu sai CF=01, 
 AX= mã lỗi 
Đổi thư mục hiện thời 3B AH=3B 
DS:DX = trỏ đến 
chuỗi ASCII tên 
đường 
Nếu sai CF=01, 
 AX= mã lỗi 
Tạo file 3C AH=3C 
CX=đặc tính file 
DS:DX= trỏ đến 
AX=thẻ file hoặc mã 
trả về 
CF=00 (tốt), 01 (sai) 
Hợp Ngữ - 107 - 
Nguyễn Hữu Lộc Khoa Vật Lý 
Chức năng Số (Hex) TG vào TG ra 
chuỗi ASCII tên file 
Mở thẻ 3D AH=3D 
CX=mã truy nhập 
DS:DX = trỏ đến 
chuỗi ASCII tên file 
AX=thẻ file hoặc mã 
trả về 
Đóng thẻ 3E AH=3E 
BX=thẻ file 
AX=thẻ file hoặc mã 
trả về 
Đọc file hoặc từ thiết bị 3F AH=3F 
BX=thẻ file 
CX=số byte cần đọc 
DS:DX= trỏ đến 
vùng đệm dữ liệu 
AX=số byte đọc được 
hoặc mã trả về 
Ghi file hoặc ra thiết bị 40 AH=40 
BX=thẻ file 
CX=số byte cần ghi 
DS:DX= trỏ đến 
vùng đệm dữ liệu 
AX=số byte ghi được 
hoặc mã trả về 
Xoá file 41 AH=41 
DS:DX = trỏ đến 
chuỗi ASCII tên file 
Nếu sai CF=01, AX= 
mã trả về 
Kết thúc quá trình 4C AH=4C 
AL= mã trả về 
Đổi tên file 56 AH=56 
DS:DX = trỏ đến 
chuỗi ASCII tên cũ 
ES:DI = trỏ đến 
chuỗi ASCII tên mới 
Nếu sai CF=01, AX= 
mã trả về 
Hợp Ngữ - 108 - 
PHỤ LỤC B: MỘT SỐ CHƯƠNG TRÌNH PHỤC VỤ CỦA ROM-
BIOS 
Chức năng Ngắt 
(Hex) 
TG vào TG ra 
Di chuyển con trỏ 10 AH=2 
BH=số hiệu trang 
DH=số hiệu dòng 
DL=số hiệu cột 
Lấy vị trí con trỏ 10 AH=3 
BH=số hiệu trang 
DH=số hiệu cột 
DL=số hiệu dòng 
CH=dòng quét đầu 
của con trỏ 
CL=dòng quét cuối 
của con trỏ 
Đọc một ký tự và thuộc 
tính 
10 AH=8 
BH=trang màn hình 
AH=thuộc tính 
AL=ký tự 
Ghi 1 ký tự 10 AH=0E 
AL=ký tự 
BL=màu trong kiểu 
đồ thị 
Đọc một cung 13 AH=02 
AL= số cung 
CH=rãnh 
CL=cung 
DL=ổ đĩa 
ES:BX=con trỏ đến 
đệm 
CF=báo kết quả 
tốt/hỏng 
AH=mã trạng thái 
AL=số cung được 
đọc 
Ghi một cung 13 AH=03 
AL= số cung 
CH=rãnh 
CL=cung 
DL=ổ đĩa 
ES:BX=con trỏ đến 
đệm 
CF=báo kết quả 
tốt/hỏng 
AH=mã trạng thái 
AL=số cung được ghi
Nguyễn Hữu Lộc Khoa Vật Lý 
Hợp Ngữ - 109 - 
Nguyễn Hữu Lộc Khoa Vật Lý 
Chức năng Ngắt 
(Hex) 
TG vào TG ra 
Lấy các tham số hiện 
thời của ổ đĩa 
13 AH=08 
DL=số hiệu đĩa 
DL=số ổ đĩa 
DH=số lượng mặt 
max 
CL[0,5]=số hiệu 
cung max 
CL[6,7]=2 bit cao 
của số lượng từ trụ 
max 
CH=ca'c bit thấp của 
số lượng từ trụ max 
CF=cờ báo kết quả 
tốt/hỏng 
AH=mã trạng thái 
Đọc ký tự tiếp từ bàn 
phím 
16 AH=00 AH=mã quét bàn 
phím 
AL=mã ASCII 
Lấy cờ bàn phím 16 AH=02 AL=cờ các phím 
bit 0=1: Shift phải 
bit 1=1: Shift trái 
bit 2=1: Ctrl 
bit 3=1: Alt 
bit 4=1: Scroll lock 
bit 5=1: Num Lock 
bit 6=1:Caps lock 
bit 7=1: Chế độ chèn 
Gửi một byte ra máy in 17 AH=00 
AL=ký tự 
DX=số máy in 
Giá trị các bit: 
0: quá thời gian 
1: không sử dụng 
2: không sử dụng 
3=1:lối vào/ra 
4=1: đã được chọn 
5=1:hết giấy 
6=1:xác nhận 
7=1:không bận 
Hợp Ngữ - 110 - 
TÀI LIỆU THAM KHẢO 
1. Ngôn ngữ lập trình Assembly và máy vi tính IBM-PC - Ytha Yu và 
Charles Marut (Quách Tuấn Ngọc-Đỗ Tiến Dũng- Nguyễn Quang 
Khải biên dịch) - Nhà xuất bản Giáo dục 
2. Lập trình Hợp ngữ Turbo Assembler 2.0 - Phan Trương Dần - Nhà xuất 
bản Giáo dục 
3. Cẩm nang lập trình - Peter Norton (Nguyễn Minh San dịch) - Nhà xuất 
bản Giáo Dục 
4. Cẩm nang cho người lập trình trên máy vi tính IBM- Peter Norton - 
Nhà xuất bản Thống kê - Viện Điện tử - Tin học 
5. Assembleur facile - PhMercier- Marabout 
6. Hardware Reference Manual 8088 - Intel 
7. Macro Assembler Programmer's Guide 5.0 - Microsoft 
Nguyễn Hữu Lộc Khoa Vật Lý 

File đính kèm:

  • pdfgiao_trinh_hop_ngu.pdf