Giáo trình thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang (Phần 1)

Giới thiệu

BÀI 1: NHẬP MÔN HỢP NGỮ. 1

1. Mục tiêu . 1

2. Kiến thức cần chuẩn bị . 1

3. Nội dung thực hành . 1

3.1. Khảo sát lệnh Intel-8086 . 1

3.2. Cấu trúc chương trình dạng EXE . 1

3.3. Viết chương trình đơn giản . 3

4. Bài tập đề nghị.

pdf 23 trang phuongnguyen 10040
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang (Phần 1)", để 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 thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang (Phần 1)

Giáo trình thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang (Phần 1)
TRƯỜNG ĐẠI HỌC CẦN THƠ 
KHOA CÔNG NGHỆ 
BỘ MÔN ĐIỆN TỬ - VIỄN THÔNG 
Giáo trình thực hành 
LẬP TRÌNH 
HỆ THỐNG 
Biên soạn: 
ThS. Nguyễn Hứa Duy Khang 
Ks. Trần Hữu Danh 
-ĐHCT- 
5-2008 
Thực hành lập trình hệ thống 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh i 
NỘI DUNG 
Giới thiệu 
BÀI 1: NHẬP MÔN HỢP NGỮ ............................................................................ 1 
1. Mục tiêu ................................................................................................................ 1 
2. Kiến thức cần chuẩn bị ......................................................................................... 1 
3. Nội dung thực hành .............................................................................................. 1 
3.1. Khảo sát lệnh Intel-8086 ........................................................................ 1 
3.2. Cấu trúc chương trình dạng EXE ........................................................... 1 
3.3. Viết chương trình đơn giản .................................................................... 3 
4. Bài tập đề nghị ...................................................................................................... 3 
BÀI 2: XUẤT NHẬP KÝ TỰ ................................................................................ 5 
1. Mục tiêu ................................................................................................................ 5 
2. Kiến thức cần chuẩn bị ......................................................................................... 5 
3. Nội dung thực hành .............................................................................................. 5 
3.1. In một ký tự ra màn hình ........................................................................ 5 
3.2. In chuỗi ký tự ra màn hình ..................................................................... 6 
3.3. Nhận một ký tự từ bàn phím ................................................................... 6 
3.4. Nhận chuỗi ký tự từ bàn phím ................................................................ 7 
4. Bài tập đề nghị ...................................................................................................... 8 
BÀI 3: CẤU TRÚC RẼ NHÁNH – VÒNG LẬP ................................................. 9 
1. Mục tiêu ................................................................................................................ 9 
2. Tóm tắt lý thuyết .................................................................................................. 9 
3. Nội dung thực hành .............................................................................................. 12 
3.1. Cấu trúc rẽ nhánh ................................................................................... 12 
3.2. Cấu trúc vòng lập ................................................................................... 13 
4. Bài tập đề nghị ...................................................................................................... 13 
BÀI 4: NHẬP XUẤT SỐ DẠNG BIN-HEX-DEC ............................................... 15 
1. Mục tiêu ................................................................................................................ 15 
2. Kiến thức cần chuẩn bị ......................................................................................... 15 
3. Nội dung thực hành .............................................................................................. 15 
3.1. Nhập xuất số nhị phân ............................................................................ 15 
3.2. Nhập xuất số thập lục phân .................................................................... 16 
3.3. Xuất số thập phân nguyên dương ........................................................... 18 
4. Bài tập đề nghị ...................................................................................................... 19 
BÀI 5: XỬ LÝ TẬP TIN ........................................................................................ 21 
1. Mục tiêu ................................................................................................................ 21 
2. Kiến thức cần chuẩn bị ......................................................................................... 21 
3. Nội dung thực hành .............................................................................................. 21 
3.1. Tạo tập tin mới ....................................................................................... 21 
Thực hành lập trình hệ thống 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh ii 
3.2. Ghi nội dung tập tin ................................................................................ 22 
3.3. Đọc nội dung tập tin ............................................................................... 23 
3.4. Xóa tập tin ............................................................................................. 25 
3.5. Đổi tên tập tin ........................................................................................ 26 
4. Bài tập đề nghị ...................................................................................................... 27 
BÀI 6: XỬ LÝ CHUỖI KÝ TỰ ............................................................................. 28 
1. Mục tiêu ................................................................................................................ 28 
2. Kiến thức cần chuẩn bị ......................................................................................... 28 
3. Nội dung thực hành .............................................................................................. 28 
3.1. So sánh chuỗi .......................................................................................... 28 
3.2. Di chuyễn chuỗi ...................................................................................... 30 
3.3. Dò tìm trong chuỗi ................................................................................. 31 
Giới Thiệu 
Thực hành Lập trình Hệ Thống giúp cho sinh viên viết được chương trình bằng 
ngôn ngữ Assembly trên máy tính PC. Giáo trình này chỉ hướng dẫn sinh viên những 
kỹ năng rất cơ bản trong việc lập trình bằng Assembly như: Sử dụng trình biên dịch 
hợp ngữ trong môi trường Windows, biên dịch, sửa lỗi và liên kết, khảo sát tập lệnh, 
các ngắt đơn giản của Hệ điều hành DOS. Để vận dụng và nâng cao được kỹ năng lập 
trình hệ thống bằng Hợp ngữ, đòi hỏi sinh viên phải nổ lực rất nhiều trong việc tự học, 
đọc thêm tài liệu để bổ sung những kiến thức nhất định về phần cứng máy tính cũng 
như nguyên ly vận hành của các thiết bị ngoại vi có liên quan, như: Máy in, hệ vi điều 
khiển, cổng vào ra nối tiếp/ song song .... 
Thời lượng của môn học có giới hạn, nên các bài thực hành được tổ chức thành 
các chủ đề sau đây, mỗi chủ đề thực hành trong 1 buổi (5 tiết): 
Bài 1: Nhập môn hợp ngữ 
Bài 2: Xuất nhập ký tự. 
Bài 3: Cấu trúc rẽ nhánh – Vòng lập 
Bài 4: Xử lý ký tự - Ký số 
Bài 5: Xử lý tập tin 
Bài 6: Nhập xuất số BIN-HEX-DEC 
Để thực hành đạt hiệu quả cao, sinh viên cần phải chuẩn bị cho mỗi bài trước 
khi vào bắt đầu thực hành. Muốn đạt được điều này, sinh viên phải tuân thủ phương 
pháp học như sau: 
Trước khi vào thực hành: 
- Nắm được mục tiêu của bài thực hành. 
- Xem lại các kiến thức cần chuẩn bị được nêu ra cho mỗi bài thực hành. 
- Nắm được các nội dung cần phải làm trong buổi thực hành. 
Trong khi thực hành: 
- Tuyệt đối tuân thủ thực hành theo thứ tự của nội dung thực hành. Hoàn 
thành các vấn đề và trả lời được các câu hỏi đặt ra trong phần trước mới 
chuyển sang thực hành phần sau. 
- Quan sát hiện tượng, những thay đổi, xem xét đánh giá kết quả sau mỗi 
thao tác thực hành. 
- Lập lại các thao tác thực hành nhiều lần, tìm cách giải quyết khác sau khi 
đã thực hành theo yêu cầu cho mỗi vẫn đề. So sánh, nhận xét các cách 
giải quyết khác nhau. 
Sau khi thực hành: 
- Đối chiếu từng mục tiêu của bài thực hành với những gì đã thực hành 
được. Nếu mục tiêu nào chưa thành thạo thì phải tìm cách lập lại thực 
hành đó để nắm được mục tiêu vững chắc hơn. 
Trong quá trình biên soạn, không thể tránh khỏi sơ xuất, hãy chân thành góp ý 
chỉnh sửa để giáo trình ngày càng hoàn chỉnh hơn. 
ThS. Nguyễn Hứa Duy Khang 
Email: nhdkhang@ctu.edu.vn 
Bài 1 – Nhập môn hợp ngữ 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 1 
Bài 1: Nhập Môn Hợp Ngữ 
1. MỤC TIÊU 
- Sử dụng được công cụ Emu8086 để khảo sát các lệnh của Intel-8086. 
- Sử dụng được các chức năng cơ bản của công cụ RadASM như: Soạn 
thảo, Hợp dịch (Assemble), Liên kết (Link) và Chạy chương trình (Run). 
- Viết đúng cấu trúc của chương trình hợp ngữ dạng tái định (EXE). 
- Đọc hiểu và sửa lỗi chương trình. 
2. KIẾN THỨC CẦN CHUẨN BỊ 
- Các thao tác cơ bản trên hệ điều hành Windows. 
- Cấu trúc chương trình hợp ngữ dạng EXE. 
- Qui trình Soạn thảo – Dịch chương trình. 
- Các lệnh đơn giản của Intel-8086 thường dùng như: MOV, ADD, SUB, 
INC, DEC, AND, OR. (Xem cú pháp trong giáo trình) 
3. NỘI DUNG THỰC HÀNH 
3.1. Khảo sát lệnh Intel-8086: 
3.1.1. Nhập vào Emu8086 đoạn lệnh sau đây và dự đoán trước kết quả: 
MOV AH, 80 ; AH ← 80 (AX = ?) 
MOV AL, 86 ; AL ← 86 (AX = ?) 
MOV BX, AX ; BX ← AX (BH = ?, BL = ?) 
MOV DH, BL ; DH ← BL (DH = ?, DX = ?) 
MOV DL, BH ; DL ← BH (DL = ?, DX = ?) 
MOV SI, CS ; SI ← CS (SI = ?) 
Thực hiện từng lệnh, sau mỗi lệnh ghi lại kết quả các thanh ghi trong ngoặc để 
đối chiếu với kết quả dự đoán trên và giải thích. 
3.1.2. Thực hành tương tự như câu 3.1.1 đối với đoạn lệnh sau: 
 MOV AX, 8086 ; AX ← 8086 (AH = ?, AL = ?) 
ADD AL, 3 ; AL ← AL + 3 (AL = ?, AX = ?) 
DEC AX ; AX ← AX – 1 (AH = ?, AL = ?, AX = ?) 
SUB AH, 10h ; AH ← AH – 10h (AH = ?, AL = ?, AX = ?) 
AND AX, 0FF0h ; AX ← AX and 0FF0h (AX = ?) 
3.1.3. Sinh viên chủ động lập lại ít nhất 1 lần câu 3.1.1 và 3.1.2 với các giá trị toán 
hạng khác trong mỗi dòng lệnh. 
3.2. Cấu trúc chương trình dạng EXE: 
3.1.1. [HELLO.ASM] Dùng RadASM để soạn thảo chương trình Hợp ngữ sau đây: 
Lưu ý: - Chương trình hoàn toàn không có lỗi. 
Bài 1 – Nhập môn hợp ngữ 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 2 
- Trong đó có những lệnh mà sinh viên chưa học đến, điều này không 
cần quan tâm, điều cần quan tâm trong bài thực hành này là Cấu trúc 
chương trình hợp ngữ. 
- Đặt tên file chương trình nguồn là HELLO.ASM 
 DSEG SEGMENT ; Tạo đoạn DSEG 
 chuoi DB “Hello World!$” ; Khai báo biến chuỗi 
 DSEG ENDS 
 CSEG SEGMENT ; Tạo đoạn CSEG 
 ASSUME CS: CSEG, DS: DSEG ; CSEG là đoạn lệnh, DSEG là dữ liệu 
 begin: MOV AX, DSEG ; Khởi động địa chỉ đoạn dữ liệu 
 MOV DS, AX 
 MOV AH, 09h ; AH ← 09h 
 LEA DX, chuoi ; DX ← địa chỉ offset biến chuoi 
 INT 21h ; gọi ngắt 21h 
 MOV AH, 01h ; AH ← 01h 
 INT 21h ; gọi ngắt 21h 
 MOV AH, 4Ch ; Thoát chương trình 
 INT 21h 
 CSEG ENDS 
 END begin 
a. Hợp dịch chương trình HELLO.ASM và kiểm tra xem file HELLO.OBJ đã 
được tạo ra chưa. 
b. Liên kết chương trình HELLO, kiểm tra xem file HELLO.EXE đã được tạo ra 
chưa 
c. Chạy chương trình HELLO.EXE, quan sát trên màn hình, chương trình trên làm 
gì? 
d. Thay đổi “Hello World!$” thành “Wellcome to Assembly$”. Làm lại các bước 
a, b và c. Chương trình trên làm gì? 
3.2.2. [HELLO2.ASM] Sửa file HELLO.ASM ở trên sao cho giống hệt như chương 
trình sau và đặt tên lại là HELLO2.ASM (chỉ khác ở những chổ in nghiêng) - Lưu ý: 
Chương trình sẽ có vài lỗi 
a. Dịch chương trình HELLO2.ASM, ghi lại các thông tin về lỗi: Số lỗi, những lỗi 
gì, trên dòng nào? 
b. Kiểm tra xem file HELLO2.OBJ được tạo ra không? Tại sao? 
c. Sửa từng lỗi một từ dòng trên xuống, rồi lập lại câu a cho đến khi nào hết lỗi. 
d. Liên kết chương trình HELLO2. Kiểm tra xem có file HELLO2.EXE không? 
e. Chạy chương trình HELLO2.EXE, so sánh kết quả với 3.1.1.d 
Bài 1 – Nhập môn hợp ngữ 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 3 
 DSEG SEGMEMT ; Tạo đoạn DSEG 
 chuoi DW “Wellcome to Assembly$” ; Khai báo biến chuỗi 
 DSEG ENDS 
 CSEG SEGMENT ; Tạo đoạn CSEG 
 ASSUME CS: CSEG, DS: DSEG ; CSEG là đoạn lệnh, DSEG là dữ liệu 
 begin: MOV BX, SSEG ; Khởi động địa chỉ đoạn dữ liệu 
 MOV DS, BX 
 MOV AH, 09h ; AH ← 09h 
 LEA DH, chuoi ; DX ← địa chỉ offset biến chuoi 
 INT 21h ; gọi ngắt 21h 
 MOV AH, 01h ; AH ← 01h 
 INT 21h ; gọi ngắt 21h 
 MOV AH, 4Ch ; Thoát chương trình 
 INT 21h 
 CSEG ENDS 
 END Begin 
3.3. Viết các chương trình đơn giản: 
3.3.1. [SUM1.ASM] Viết chương trình dạng EXE để tính kết quả biểu thức sau, lưu 
trữ kết quả trong AX: 
 10 + 8086 - 100h + 350 + 0FAh 
 Lưu ý: - Chỉ khai báo 1 đoạn lệnh để viết chương trình. 
a. Dịch sửa lỗi (nếu có lỗi) và chạy chương trình. 
b. Dùng Emu8086 để chạy chương trình trên và kiểm tra kết quả lưu trong AX. 
3.3.2. [SUM2.ASM] Viết chương trình dạng EXE để tính kết quả biểu thức có dạng 
tổng quát như sau: 
 KQUA = A + B – C + D + E 
 Trong đó: KQUA, A, B, C, D, E là các biến 2 byte khai báo trong đoạn dữ liệu. 
Lưu ý: - Chương trình gồm 2 đoạn: Đoạn lệnh và Đoạn dữ liệu dùng để chứa các 
Biến. 
a. Gán giá trị các biến A = 1000, B = 10, C = 1Fh, D = 30h, E = 300Ah. Dịch và 
chạy chương trình. 
b. Dùng Emu8086 để kiểm tra kết quả của câu a. 
c. Áp dụng SUM2.ASM để tính biểu thức đã cho ở câu 3.3.1. Dùng Emu8086 để 
kiểm tra kết quả. 
4. BÀI TẬP ĐỀ NGHỊ: 
4.1. Dùng Emu8086 để khảo sát các lệnh khác trong tập lệnh của Intel-8086. 
4.2. Tự tìm hiểu thêm những chức năng khác của Emu8086 
Bài 1 – Nhập môn hợp ngữ 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 4 
4.3. Viết từng chương trình tính các biểu thức sau: (Phải viết theo kiểu sử dụng biến để 
chứa toán hạng và kết quả, SV tự đặt tên biến theo ý của mình) 
 a. 15h * 250 d. 1000 ÷ 100 
 b. 16 * 0AF1h e. 1000 ÷ 100h 
 c. 300 * 400 f. 3AB45Eh ÷ 0A1h 
4.4. Sử dụng Emu8086 để kiểm chứng kết quả của các chương trình đã viết cho 4.3.
Bài 2 – Xuất nhập ký tự 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 5 
Bài 2: Xuất Nhập Ký Tự 
1. MỤC TIÊU 
- Sử dụng được các ngắt mềm để viết được chương trình: in ký tự - chuỗi ký tự 
lên màn hình và nhập ký tự - chuỗi ký tự từ bàn phím. 
- Hiểu được cách quản lý ký tự và ký số trong Hợp ngữ. 
2. KIẾN THỨC CẦN CHUẨN BỊ 
- Kết quả bài thực hành 1. 
- Các hàm 01h, 02h, 06h, 07h, 08h, 09h, 0Ah của ngắt 21h. 
- Bảng mã ASCII. 
3. NỘI DUNG THỰC HÀNH 
3.1. In 1 ký tự ra nàm hình 
- Chương trình sử dụng hàm 2, ngắt 21h để in ký tự B ra màn hình được viết như 
sau. Hãy soạn thảo lưu lại thành tập tin nguồn có tên là BAI_2A.ASM. 
- Dịch sửa lỗi (nếu có) và chạy chương trình để xem kết quả in ra màn hình. 
- Các dòng lệnh nào thực hiện chức năng in ký tự ‘B’ ra màn hình? Các dòng 
lệnh khác dùng làm gì? 
- Sửa lại chương trình trên để in ra màn hình ký tự ‘D’. Chạy chương trình kiểm 
chứng kết quả. 
- Viết chương trình để in ra màn hình số 9 
- Viết chương trình để in ra màn hình số 89 
- Hai dòng lệnh 6 và 7 có chức năng gì trong chương trình? Nếu không có 2 dòng 
lệnh ấy thì chương trình thực hiện như thế nào? (Thử xóa bỏ 2 d ... ẽ nhánh – Vòng lặp 
1. MỤC TIÊU 
- Hiểu cách so sánh hai số trong hợp ngữ 
- Hiểu cách thay đổi thứ tự thực hiện các lệnh 
- Biết cách sử dụng các lệnh so sánh, nhảy và lặp 
2. TÓM TẮT LÝ THUYẾT 
2.1. Lệnh so sánh 
Cú pháp: CMP Trái, Phải ; Cờ ← Trái – Phải 
Nếu Trái > Phải ⇒ Trái - Phải > 0 : CF = 0 và ZF = 0 
Nếu Trái < Phải ⇒ Trái - Phải < 0 : CF = 1 và ZF = 0 
Nếu Trái = Phải ⇒ Trái - Phải = 0 : CF = 0 và ZF = 1 
 Trái, Phải: Immed, Reg, Mem 
Bản chất của lệnh CMP là lệnh SUB Đích, Nguồn (thực hiện phép tính Đích – 
Nguồn) nhưng kết quả của phép tính không được lưu vào Đích như trong lệnh SUB 
mà tính chất của kết quả được thể hiện thông qua cờ 
Ví dụ: so sánh hai số nguyên dương 
MOV AH, 1 ; AH ← 1 
MOV AL, 2 ; AL ← 2 
CMP AH, AL ; CF ← 1, ZF ← 0 vì AH < AL 
Sau khi thực hiện các lệnh trên, cờ Carry bật (CF=1), báo hiệu rằng AH < AL 
2.2. So sánh nhị phân 
Cú pháp: TEST Trái, Phải ; Cờ ← Trái and Phải 
 Nếu Trái and Phải = 0 thì ZF = 1, ngược lại thì ZF = 0 
Bản chất của lệnh TEST là lệnh AND Đích, Nguồn nhưng kết quả của phép 
tính không được lưu vào Đích như trong lệnh AND mà ảnh hưởng lên cờ. 
Ví dụ: kiểm tra hai bit cuối cùng của AL 
TEST AL, 3 ; 3h = 11b 
Nếu cờ Zero bật (ZF=1), có nghĩa là cả hai bit 0 và 1 của AL đều bằng 0. 
2.3. Lệnh nhảy không điều kiện 
Cú pháp: JMP ; Nhảy đến địa chỉ 
Có các trường hợp sau: 
• JMP SHORT ; (short jump). Kiểu này chỉ nhảy trong phạm vi từ –128 
đến +127 byte so với vị trí hiện tại. 
Ví dụ: JMP SHORT Calculate 
Bài 3 – Cấu trúc rẽ nhánh – Vòng lặp 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 10 
• JMP ; (near jump). Kiểu này nhảy tùy ý trong phạm vi segment. 
Ví dụ: JMP Calculate 
• JMP FAR PTR ; (far jump). Kiểu này nhảy đến bất kì chỗ nào. 
Ví dụ: JMP FAR PTR Calculate 
• JMP ; (near indirect jump). Khi thực hiện, thanh ghi PC sẽ 
được gán bằng giá trị lưu tại địa chỉ này. Có thể kết hợp 
dùng với định vị chỉ số. 
Ví dụ: 
myPointer DW Prepare, Calculate, Check, Output 
... 
MOV BX, 2 ; chỉ số trong mảng con trỏ 
SHL BX, 1 ; nhân đôi 
JMP myPointer[BX] 
... 
Prepare: ; công việc 0 
... 
Calculate: ; công việc 1 
... 
Check: ; công việc 2 – nơi cần nhảy đến 
... 
Output: ; công việc 3 
... 
• JMP ; (far indirect jump). Tương tự trường hợp trên, nhưng 
con trỏ gồm cả segment và offset. Chỉ khác ở khai báo 
con trỏ 
• JMP ; (indirect jump via regs). Nhảy đến địa chỉ lưu trong 
thanh ghi AX. 
Ví dụ: MOV AX, offset Calculate 
... 
JMP AX ; PC ← AX 
2.4. Lệnh nhảy có điều kiện 
Cú pháp: J 
Các lệnh nhảy có điều kiện bắt đầu bằng chữ J sau đó là các chữ cái biểu thị 
điều kiện (ví dụ JGE: Jump if Greater than or Equal, nhảy nếu lớn hơn hay bằng), tiếp 
sau là một tên nhãn. 
Điều kiện để lệnh nhảy xem xét khi thi hành là giá trị các cờ được tạo ra từ lệnh 
CMP hay TEST. Khi sử dụng lệnh nhảy có điều kiện sau khi thực hiện phép so sánh, 
Bài 3 – Cấu trúc rẽ nhánh – Vòng lặp 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 11 
phải đặc biệt lưu ý toán hạng trong phép so sánh là số có dấu (signed) hay không có 
dấu (unsigned) để lựa chọn lệnh cho phù hợp. 
Ví dụ: MOV AH,AL ; AL hiện bằng 128 
CMP AH,1 
JGE Greater ; AH > 1 nhưng không nhảy ???? 
. . . 
Greater: 
Ví dụ: nếu AL là số nguyên không dấu thì đoạn chương trình ở trên phải sửa lại như 
sau: 
MOV AH,AL 
CMP AH,1 
JAE Greater 
. . . 
Greater: 
Một số lệnh nhảy có điều kiện thường dùng: 
Lệnh Ý Nghĩa Điều Kiện 
JB 
JNAE 
Nhảy nếu nhỏ hơn (Jump if Below) 
Nhảy nếu không lớn hơn hoặc bằng 
CF = 1 
JAE 
JNB 
Nhảy nếu lớn hơn hoặc bằng (Jump if Above or Equal) 
Nhảy nếu không nhỏ hơn 
CF = 0 
JBE 
JNA 
Nhảy nếu nhỏ hơn hoặc bằng (Jump if Below or Equal) 
Nhảy nếu không lớn hơn 
CF = 1 và ZF = 
1 
JA 
JNBE 
Nhảy nếu lớn hơn (Jump if Above) 
Nhảy nếu không nhỏ hơn hoặc bằng 
CF = 0 và ZF = 
0 
JE 
JZ 
Nhảy nếu bằng (Jump if Equal) 
Nhảy nếu bằng (Jump if Zero) 
ZF = 1 
JNE 
JNZ 
Nhảy nếu không bằng (Jump if Not Equal) 
Nhảy nếu không bằng (Jump if Not Zero) 
ZF = 0 
2.5. Lệnh lặp 
Bằng cách dùng các lệnh nhảy có thể tạo ra vòng lặp. Tuy nhiên, để viết chương 
trình tiện lợi và ngắn gọn, có thể dùng thêm các lệnh lặp như LOOP, LOOPZ, 
Cú pháp: LOOP 
tự động giảm CX một đơn vị, sau đó kiểm tra xem CX có bằng 0, nếu không 
bằng thì nhảy đến nhãn 
Cú pháp: LOOPZ 
tự động giảm CX một đơn vị, sau đó kiểm tra xem CX có bằng 0 hoặc cờ ZF có 
bật không (ZF=1), nếu cả hai điều này không xảy ra thì nhảy đến nhãn 
Bài 3 – Cấu trúc rẽ nhánh – Vòng lặp 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 12 
Ví dụ: Nhập mảng A gồm 10 ký tự 
MOV SI, 0 ; chỉ số mảng 
MOV CX, 10 ; số lần lặp 
LAP: MOV AH, 1 ; nhập ký tự 
INT 21H 
MOV A[SI], AL 
INC SI 
3. NỘI DUNG THỰC HÀNH 
3.1. Cấu trúc Rẽ nhánh 
- Chương trình sau đây nhận 1 ký tự. Nếu là ký tự HOA thì in ra màn hình "Ky tu 
HOA". Ngược lại in ra câu "Ky tu thuong". (Mã ASCII của ký tự HOA <= 'Z'). 
Soạn thảo và lưu với tên BAI_3A.ASM 
- Dịch và chạy CT ở những trường hợp khác nhau để xem kết quả trên màn hình. 
- Vẽ lưu đồ điều khiển của chương trình. 
DSEG SEGMENT 
 tbao1 DB "Ky tu HOA.$" 
 tbao2 DB "Ky tu thuong.$" 
DSEG ENDS 
CSEG SEGMENT 
 ASSUME CS: CSEG, DS: DSEG 
start:mov ax, DSEG 
 mov ds, ax 
mov ah, 01h 
 int 21h 
 cmp al, 'Z' ; so sánh với 'Z' 
 ja nhan ; Nếu lớn hơn => ký tự thường 
 mov ah, 09 ; Nếu không lớn hơn => ký tự HOA 
 lea dx, tbao1 ; in "Ky tu HOA" 
 int 21h 
 jmp exit 
nhan: mov ah, 09 ; in "Ky tu thuong" 
 lea dx, tbao2 
 int 21h 
exit:mov ah, 7 
 int 21h 
mov ah, 4Ch ; trở về hệ điều hành 
 int 21h 
CSEG ENDS 
 END start 
Bài 3 – Cấu trúc rẽ nhánh – Vòng lặp 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 13 
- Tại sao cần phải có lệnh JMP EXIT? Nếu không có lệnh ấy thì chương trình 
thực hiện như thế nào? Chạy chương trình để kiểm chứng. 
- Thay lệnh JA NHAN bằng lệnh JNA NHAN. Sửa chương trình sao cho kết 
quả không thay đổi. 
- Khi ký tự nhập vào không phải là chữ cái thì kết quả in ra màn hình là gì? Tại 
sao? 
3.2 Cấu trúc vòng lặp 
- Xem chương trình in ra màn hình lần lượt các ký tự từ A đến Z được viết như 
sau. Hãy soạn thảo và đặt tên tập tin là BAI_3B.ASM. 
- Dịch và chạy chương trình để xem kết quả trên màn hình. 
- Vòng lặp trong chương trình bao gồm đoạn lệnh nào? Viết theo kiểu while do 
hay repeat ... until hay for? Vẽ lưu đồ chương trình. 
- Sửa chương trình để in ra màn hình lần lượt các ký tự từ 'Z' đến 'A'. 
- Tiếp tục sửa chương trình sao cho giữa các ký tự có 1 khoảng trống (Z Y ....B 
A) 
- Dùng lệnh LOOP để viết lại chương trình BAI_3B.ASM theo cấu trúc vòng lặp 
for. 
4. BÀI TẬP KIỂM TRA: 
4.1 Viết chương trình cho nhập 1 ký tự từ màn hình và xuất câu thông báo tương ứng 
sau: 
- Nếu ký tự nhập là ‘S’ hay ‘s’ thì in ra “Good morning!” 
- Nếu ký tự nhập là ‘T’ hay ‘t’ thì in ra “Good Afternoon!” 
- Nếu ký tự nhập là ‘C’ hay ‘c’ thì in ra “Good everning!” 
4.2 Viết lại chương trình BAI_3A.ASM sao cho chương trình có thể phân biệt được 3 
loại ký tự nhập từ bàn phím: "Ký tự HOA", "ký tự thường" và "ký tự khác". 
CSEG SEGMENT 
 ASSUME CS: CSEG 
start:mov dl, 'A' ; DL chứa ký tự đầu tiên 'A' 
nhan:mov ah, 02h ; in ký tự trong DL ra màn hình 
 int 21h 
 inc dl ; DL chứa ký tự kế cần in 
 cmp dl, 'Z' ; So sánh DL với 'Z' 
 jna nhan ; Nếu <= 'Z' thì tiếp tục in 
 mov ah, 08h ; Nếu > 'Z' thì thoát (không in tiếp) 
 int 21h 
 mov ah, 4Ch 
 int 21h 
CSEG ENDS 
 END start 
Bài 3 – Cấu trúc rẽ nhánh – Vòng lặp 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 14 
4.3 Viết chương trình nhập từ bàn phím 1 ký tự thường. Sau đó in ra màn hình lần lượt 
các ký tự từ ký tự nhận được đến 'z' sao cho giữa các ký tự có 1 khoảng trống. 
4.4 Không dùng hàm 0Ah/21h, hãy dùng lệnh lặp để viết chương trình nhập vào 1 
chuỗi ký tự. Sau khi nhập xong đếm xem chuỗi có bao nhiêu ký tự. In ra màn hình 
chuỗi nhận được và số ký tự có trong chuỗi. 
Ví dụ: S = "Hello world !" ==> Số kí tự trong chuỗi là 13. 
4.5 Viết chương trình cho phép nhập vào một chuỗi bất kỳ. Sau đó: 
- Đổi tất cả ký tự thường thành ký tự hoa và in ra màn hình. 
- Đổi tất cả ký tự hoa thành ký tự thường và in ra màn hình. 
Ví dụ: S = ‘weLcOme To AssEmblY’ 
 In ra: welcome to assembly - WELCOME TO ASSEMBLY 
4.6 Nhập vào 2 chuỗi số, đổi 2 chuỗi thành số, sau đó cộng hai số, đổi ra chuỗi và xuất 
chuỗi tổng. 
Ví dụ: S1 = "123" => N1 = 123 
S2 = "456" => N2 = 456 
N = N1 + N2 = 123 + 456 = 579 => S = "579" (xuất S ra màn hình) 
4.7 Nhập 2 số nguyên dương A, B. Tính A/B, A*B (không dùng lệnh DIV, MUL) và 
in ra màn hình kết quả. 
Ví dụ: A=18, B=3 
Tính A/B: 18 - 3 - 3 - 3 - 3 - 3 - 3 = 0, vậy A/B = 6 (tổng trừ B cho đến khi A = 0). 
Tính A*B = 18 + 18 + 18 = 54 
Bài 4 – Nhập xuất số dạng BIN-HEX-DEC 
ThS. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 28 
Bài 4: Nhập xuất số dạng BIN – HEX - DEC 
1. Mục Tiêu: 
- Nhập từ bàn phím số ở dạng nhị phân, thập lục phân và thập phân 
- In lên màn hình các số ở dạng nhị phân, thập lục phân và thập phân 
2. Kiến thức cần chuẩn bị: 
- Kết quả của các bài thực hành trước 
- Các lệnh xử lý chuỗi. 
3. Nội dung thực hành: 
3.1. Nhập xuất nhị phận: 
Chương trình mẫu sau đây cho phép nhập số nhị phân 8 bit, sau đó in ra màn hình 
số nhị phân nhận được (BAI_6A.ASM): 
inchuoi MACRO chuoi 
 MOV AH, 9h 
 LEA DX, chuoi 
 INT 21h 
 ENDM 
DSEG SEGMENT 
 msg1 DB "Hay nhap so nhi phan 8 bit: $" 
 msg2 DB "So nhi phan da nhap la: $" 
 xdong DB 10, 13, ‘$’ 
 sobin DB ? ; lưu trữ số nhị phân nhận được 
DSEG ENDS 
CSEG SEGMENT 
 ASSUME CS:CSEG, DS:DSEG 
begin: MOV AX, DSEG 
 MOV DS, AX 
 inchuoi msg1 
 CALL bin_in 
 MOV sobin, BL 
 inchuoi xdong 
 inchuoi msg2 
 MOV BL, sobin 
 CALL bin_out 
 MOV AH, 01 
 INT 21h 
 MOV AH, 4Ch ; thoat khỏi chương trình 
 INT 21h 
bin_in PROC 
 MOV BL, 0 ; Xóa BL 
 MOV CX, 8 ; nhập đủ 8 bit thì dừng 
Bài 4 – Nhập xuất số dạng BIN-HEX-DEC 
ThS. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 29 
 nhap:MOV AH, 01h ; Hàm nhập ký tự 
 INT 21h 
 CMP AL, 0Dh ; nếu là phím Enter thì thôi nhập 
 JZ exit ; không phải Enter thì đổi sang bit 
 SHL BL, 1 ; Dịch trái BL 1 bit 
 SUB AL, 30h ; Ký số - 30h = số 
 ADD BL, AL ; Chuyển bit từ AL sang BL lưu trữ 
 LOOP nhap 
 exit:RET 
bin_in ENDP 
bin_out PROC 
 MOV CX, 8 ; Xuất 8 bit trong BL ra M.Hình 
 xuat:MOV DL, 0 
 SHL BL, 1 ; CF chứa MSB, xuất ra màn hình 
 RCL DL, 1 ; đưa CF vào LSB của DL 
 ADD DL, 30h ; Số + 30h = Ký số 
 MOV AH, 02h ; In ra màn hình 
 INT 21h 
 LOOP xuat 
 RET 
bin_out ENDP 
CSEG ENDS 
 END begin 
- Soạn thảo, Biên dịch và cho chạy file BAI_6A.ASM để kiểm tra kết quả. 
- Sửa chương trình trên thành BAI_6A1.ASM sao cho có thể nhập và xuất số nhị 
phân 16 bit. 
- Viết lại chương trình trên để nhập 1 ký tự từ bàn phím, sau đó in ra màn hình 
mã ASCII của ký tự nhận được ở dạng nhị phân. 
3.2. Nhập xuất thập lục phân: 
 Chương trình sau đây cho phép nhập 1 ký tự từ bàn phím, sau đó in ra màn hình 
mã ASCII của ký tự nhận được ở dạng thập lục phân 
- Soạn thảo, Biên dịch và cho chạy file BAI_6B.ASM để kiểm tra kết quả. 
- Viết lại chương trình trên để nhập 2 số thập lục phân 8 bit A và B, sau đó in ra 
màn hình kết A + B ở dạng thập lục phân. 
inchuoi MACRO chuoi 
 MOV AH, 9h 
 LEA DX, chuoi 
 INT 21h 
 ENDM 
DSEG SEGMENT 
 msg1 DB "Hay nhap 1 ky tu: $" 
 msg2 DB "Ma ASCII o dang Hex: $" 
Bài 4 – Nhập xuất số dạng BIN-HEX-DEC 
ThS. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 30 
 xdong DB 10, 13, ‘$’ 
 kytu DB ? 
DSEG ENDS 
CSEG SEGMENT 
 ASSUME CS:CSEG, DS:DSEG 
begin: MOV AX, DSEG 
 MOV DS, AX 
 inchuoi msg1 
 MOV AH, 01h 
 INT 21h 
 MOV kytu, AL ; cất ký tự nhận được 
 inchuoi xdong 
 inchuoi msg2 
 MOV BH, kytu ; Ký tự cần in 
 CALL hex_out 
 MOV AH, 02 ; in ra ký tự h sau số Hex 
 MOV DL, ‘h’ 
 INT 21h 
 MOV AH, 01 
 INT 21h 
 MOV AH, 4Ch ; thoat khỏi chương trình 
 INT 21h 
hex_out PROC 
 MOV CX, 4 
 xuat:PUSH CX 
 MOV CL, 4 
 MOV DL, BH 
 SHR DL, CL 
 CMP DL, 09h 
 JA kytu 
 ADD DL, 30h ; Đổi thành ký số ‘0’-‘9’ 
 JMP inra 
 kytu:ADD DL, 37h ; Đổi thành ký tự ‘A-‘F’ 
 inra:MOV AH, 02h ; In ra màn hình ký tự đã đổi 
 INT 21h 
 SHL BX, CL ; Quay trái BX 4 bit 
 POP CX 
 LOOP xuat 
 RET 
hex_out ENDP 
CSEG ENDS 
 END begin 
3.3. Xuất số thập phân nguyên dương: 
 Chương trình sau đây cho phép nhập 1 ký tự từ bàn phím, sau đó in ra màn hình 
mã ASCII của ký tự nhận được ở dạng thập phân. 
Bài 4 – Nhập xuất số dạng BIN-HEX-DEC 
ThS. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 31 
- Soạn thảo, Biên dịch và cho chạy file BAI_6C.ASM để kiểm tra kết quả. 
- Đọc thủ tục DEC_OUT để tìm hiểu giải thuật xuất giá trị trong AX ra màn hình 
ở dạng thập phân. Từ đó đưa ra giải thuật nhập số thập phân từ bàn phím. 
- Viết lại chương trình trên để nhập 2 số thập phân A và B có 2 chữ số, sau đó in 
ra màn hình kết quả A + B ở dạng thập phân. 
- Nhập xuất số thập phân ÂM như thế nào? 
inchuoi MACRO chuoi 
 MOV AH, 9h 
 LEA DX, chuoi 
 INT 21h 
 ENDM 
DSEG SEGMENT 
 msg1 DB "Hay nhap 1 ky tu: $" 
 msg2 DB "Ma ASCII o dang Dec: $" 
 xdong DB 10, 13, ‘$’ 
 kytu DB ? 
DSEG ENDS 
CSEG SEGMENT 
 ASSUME CS:CSEG, DS:DSEG 
begin: MOV AX, DSEG 
 MOV DS, AX 
 inchuoi msg1 
 MOV AH, 01h 
 INT 21h 
 MOV kytu, AL ; cất ký tự nhận được 
 inchuoi xdong 
 inchuoi msg2 
 XOR AX, AX 
 MOV AL, kytu ; Ký tự cần in 
 CALL dec_out 
 MOV AH, 01 
 INT 21h 
 MOV AH, 4Ch ; thoat khỏi chương trình 
 INT 21h 
dec_out PROC 
 XOR CX,CX ; CX đếm số chữ số thập phân 
 MOV BX,10 
 chia10: XOR DX,DX 
 DIV BX ; DX:AX÷BX => AX: Thương, DX: số dư 
 PUSH DX ; Cất số dư vào stack 
 INC CX 
 CMP AX, 0 
 JNZ chia10 ; nếu AX>0 thì chia tiếp cho 10 
 inra: MOV AH,2 ; in ra màn hình 
 POP DX ; lấy chữ số thập phân 
Bài 4 – Nhập xuất số dạng BIN-HEX-DEC 
ThS. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 32 
 ADD DL,30h ; đổi thành ký số 
 INT 21h 
 LOOP inra 
 RET 
dec_out ENDP 
CSEG ENDS 
 END begin 
4. Bài tập kiểm tra: 
4.1. Viết chương trình nhập 2 số nhị phân 16 bit A và B. Sau đó in ra màn hình các kết 
quả ở dạng nhị phân: A + B, A – B, A and B, A or B. 
 Ví dụ: Nhập số nhị phân A: 10101010 
 Nhập số nhị phân B: 01010101 
 A + B = 11111111 A – B = 01010101 
 A and B = 00000000 A or B = 11111111 
4.2. Viết chương trình nhập 1 ký tự từ bàn phím, sau đó in ra màn hình mã ASCII của 
ký tự nhận được ở dạng thập lục phân, thập phân và nhị phân. 
 Ví dụ: Nhập 1 ký tự: A 
 Mã ASCII dạng Hex: 41h 
 Mã ASCII dạng Dec: 65 
 Mã ASCII dạng Bin: 01000001b 
4.3. Viết lại chương trình bài 4.1 nhưng 2 số A và B được nhập theo dạng thập lục 
phân. Các kết quả được in ra màn hình ở dạng nhị phân. 
4.4. Viết lại chương trình bài 4.1 nhưng 2 số A và B được nhập theo dạng thập phân. 
In các kết quả ở dạng thập phân: A + B, A – B. 
4.5. Viết chương trình tính giai thừa n! Với n là số nguyên dương nhập từ bàn phím. In 
kết quả ra màn hình ở dạng thập phân. Cho biết, khả năng của 8086 tính được n 
lớn nhất là bao nhiêu? 

File đính kèm:

  • pdfgiao_trinh_thuc_hanh_lap_trinh_he_thong_nguyen_hua_duy_khang.pdf