Giáo trình Lập trình hệ thống

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

pdf 39 trang kimcuc 7020
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình hệ thố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 Lập trình hệ thống

Giáo trình Lập trình hệ thống
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òng lệnh ấy rồi 
chạy chương trình, quan sát kết quả để phát hiện chức năng) 
CSEG SEGMENT 
 ASSUME CS: CSEG 
start: mov ah, 02h ; Hàm 2, in 1 ký tự ra màn hình 
 mov dl, ‘B’ ; DL chứa ký tự cần  ... ương 
thức mã hoá đó. 
3.4. Xóa tập tin. 
Soạn thảo như đoạn chương trình mẫu phía dưới và lưu với tên là BAI_5D.ASM. 
- Biên dịch và cho chạy file BAI_5D.ASM để kiểm tra và xem kết quả. 
- Hãy sửa đổi file BAI_5D.ASM và lưu với tên BAI_5D1.ASM để có thể thực 
hiện được yêu cầu sau: xóa tên một tập tin. Tên tập tin cần được nhập từ bàn 
phím. Gợi ý: xem lại các bài trước để lấy giải thuật nhập tên file từ bàn phím. 
dseg segment 
 tenfile db "d:\tt_asm\data.txt",0 
 thefile dw ? 
 buffer db 251 dup ('$') 
dseg ends 
cseg segment 
 assume cs:cseg, ds:dseg 
begin: mov ax, dseg 
 mov ds, ax 
 mov ah, 3dh ; mo tap tin da co 
 lea dx, tenfile 
 mov al, 2 ; thuoc tinh tap tin 
 int 21h 
 mov thefile, ax ; cat the file 
 mov ah, 3fh ; doc noi dung file vao vung dem 
 mov bx, thefile 
 lea dx, buffer 
 mov cx, 250 ; so byte can doc tu file da mo 
 int 21h 
 mov ah, 3eh ; dong tap tin 
 mov bx, thefile 
 int 21h 
 mov ah, 09h ; in noi dung cua file ra man hinh 
 lea dx, buffer 
 int 21h 
 mov ah,08h ; dung man hinh de xem ket qua 
 int 21h 
 mov ah, 4ch ; thoat ve Dos 
 int 21h 
cseg ends 
 end begin 
Bài 5 – Xử lý tập tin 
ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 26 
3.5. Đổi tên tập tin cũ thành một tập tin mới trong cùng thư mục 
Soạn thảo như đoạn chương trình mẫu phía dưới và lưu với tên là BAI_5E.ASM. 
- Biên dịch và cho chạy file BAI_5E.ASM để kiểm tra và xem kết quả. 
- Hãy tạo một thư mục con có tên là baitap nằm trong thư mục tt_asm. Sửa đổi 
lệnh oldfile db “d:\tt_asm\data.txt”,0 và newfile db “tt_asm\solieu.txt”,0 lại 
thành oldfile db “d:\tt_asm\solieu.txt”,0 và newfile db 
“tt_asm\baitap\data.txt”,0. Biên dịch lại và cho chạy chương trình để xem xét 
kết quả. Có nhận xét gì về kết quả nhận được. 
- Hãy sửa đổi file BAI_5E.ASM và lưu với tên BAI_5E1.ASM để có thể thực 
hiện được yêu cầu sau: đổi tên một tập tin. Tên tập tin cũ và mới được nhập từ 
bàn phím. Gợi ý: xem lại các bài tập trước để lấy giải thuật nhập tên file từ bàn 
phím 
dseg segment 
 tenfile db "d:\tt_asm\data.txt",0 
dseg ends 
cseg segment 
 assume cs:cseg, ds:dseg 
begin: mov ax, dseg 
 mov ds, ax 
 mov ah,41h ; xoa tap tin da co 
 lea dx, tenfile 
 int 21h 
 mov ah, 4ch ; thoat ve Dos 
 int 21h 
cseg ends 
 end begin 
dseg segment 
 oldfile db "d:\tt_asm\data.txt",0 
 newfile db "d:\tt_asm\solieu.txt",0 
dseg ends 
cseg segment 
 assume cs:cseg, ds:dseg, es: dseg 
begin: mov ax, dseg 
 mov ds, ax 
 mov es, ax 
 mov ah,56h ; rename/remove tên file cu thanh moi 
 lea dx, oldfile 
 lea di, newfile 
 int 21h 
 mov ah, 4ch ; thoat ve Dos 
 int 21h 
cseg ends 
 end begin 
Bài 5 – Xử lý tập tin 
ThS. Nguyễn Hứa Duy Khang - Ks. Trần Hữu Danh 27 
4. Bài tập kiểm tra: 
4.1. Viết chương trình sử dụng hàm 41h/ INT 21h để xóa tập tin trên đĩa. Tên tập tin 
cần xóa được nhập từ bàn phím khi thực hiện chương trình. 
4.2. Viết chương trình nhập 1 chuỗi từ bàn phím, sau đó ghép chuỗi nhận được vào 
cuối của nội dung tập tin có trên đĩa. Tên tập tin nhập từ bàn phím khi chạy 
chương trình. 
4.3. Viết chương trình nhập 1 chuỗi từ bàn phím, sau đó chèn chuỗi nhận được vào 
đầu của nội dung tập tin có trên đĩa. Tên tập tin nhập từ bàn phím khi chạy chương 
trình. 
4.4. Viết chương trình ghép nội dung 2 tập tin có sẳn trên đĩa thành 1 tập tin mới. Tên 
của các tập tin được nhập từ bàn phím khi chạy chương trình. 
4.5. Viết chương trình đọc nội dung tập tin trên đĩa, sau đó đổi tất cả ký tự HOA thành 
ký tự thường và lưu lại vào tập tin đó. Tên tập tin phải được nhập từ bàn phím 
Bài 6 – Xử lý chuỗi ký tự 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 28 
Bài 6: Xử Lý Chuỗi Ký Tự 
1. Mục Tiêu: 
- Viết được các chương trình xử lý chuỗi ký tự bằng các lệnh xử lý chuỗi 
2. Kiến thức cần chuẩn bị: 
- Bảng mã ASCII. 
- Kết quả của các bài thí nghiệm trước 
- Các hàm 01h, 02h, 06h, 08h, 09h, 0Ah của INT 21h và các lệnh xử lý chuỗi 
như MOVSB/W, SCASB/W, STOSB/W, CMPSB/W. 
3. Nội dung thực hành: 
3.1. So sánh hai chuỗi oldpass và newpass. Nếu hai chuỗi này giống nhau thì kết luận 
giống nhau và ngược lại. 
Soạn thảo như đoạn chương trình trên và lưu với tên là BAI_6A.ASM. 
- Biên dịch và cho chạy file BAI_6A.ASM để kiểm tra và xem kết quả. 
- Trong macro writeln, các lệnh nào có chức năng xuống dòng sau khi in xong chuỗi 
ký tự. 
- Mục đích của việc khai báo LOCAL bien1 trong macro là gì? 
- Hãy cho biết địa chỉ của DS và ES có giống nhau hay không? Điều này được thể 
hiện qua các câu lệnh nào trong đoạn chương trình mẫu? Tại sao người ta không 
khai báo DS và ES trên các phân đoạn khác nhau ? 
- Tiền tố REPE trong đoạn chương trình mẫu trên có ý nghĩa như thế nào? 
- Ta có thể thay đổi lệnh REPE CMPSB thành một nhóm lệnh khác được không? 
Nếu được hãy thay đổi nó, biên dịch và chạy chương trình để kiểm chứng. 
- Thử thay đổi nội dung ở oldpass và newpass sao cho chúng giống nhau. Biên dịch 
và chạy chương trình xem kết quả, sau đó hãy giải thích cơ chế làm việc của đoạn 
lệnh từ lệnh CLD cho đến lệnh REPE CMPSB. 
- Giả sử, người ta muốn thay thế lệnh cmpsb thành lệnh cmpsw, các bạn có cần sửa 
đổi các lệnh nào trong chương trình hay không ? Tại sao ?. Biên dịch và chạy 
chương trình để kiểm chứng. 
- Lệnh jmp thoat trong đoạn chương trình trên có nhiệm vụ gì ?. Thử bỏ lệnh jmp 
thoat sau đó biên dịch và chạy chương trình xem kết quả. 
- Hãy sửa đổi file BAI_6A.ASM và lưu với tên BAI_6A1.ASM để có thể thực hiện 
được nhiệm vụ sau: nhập vào một chuỗi ký tự có tối đa 10 ký tự, trong lúc nhập chỉ 
hiện thị ra ký tự “*”. Khi đã nhập đủ 10 ký tự hoặc khi gặp phím ESC thì sẽ in ra 
các ký tự đã nhập ra màn hình. Gợi ý: dùng hàm 08h, 02h hoặc 09h của int 21h, 
lệnh loop, cmp,  Cần phải khai báo dùng đệm để lưu các ký tự đã nhập. 
Bài 6 – Xử lý chuỗi ký tự 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 29 
- Hãy sửa đổi file BAI_6A1.ASM, kết hợp với file BAI_6A.ASM (chương trình 
mẫu) và lưu với tên BAI_6A2.ASM để có thể thực hiện được nhiệm vụ sau: nhập 
vào một chuỗi ký tự có 10 ký tự, trong lúc nhập chỉ hiện thị ra ký tự “*”. Sau đó so 
sánh với một oldpass có nội dung tùy ý (nhưng chỉ có độ dài là 10 ký tự mà do 
writeln macro bien1 
LOCAL bien1 
 mov ah,09 
 lea dx, bien1 
 int 21h 
 mov ah,02h 
 mov dl, 0ah 
 int 21h 
 mov dl, 0dh 
 int 21h 
endm 
dseg segment 
 tbao db "Chuong tring so sanh oldpass va newpass$" 
 oldpass db "0123456789" 
 newpass db "1234567890" 
 tbao1 db "Haichuoi giong nhau $" 
 tbao2 db "Haichuoi khong giong nhau $" 
dseg ends 
cseg segment 
 assume cs:cseg, ds:dseg, es: dseg 
begin: mov ax, dseg 
 mov ds, ax 
 mov es, ax 
 writeln tbao 
 cld ; chonchieu xu ly chuoi 
 mov cx, 10 ; so ky tu/so byte can so sanh 
 lea si, oldpass; (DS:SI)--> dia chi cua chuoi nguon 
 lea di, newpass; (ES:DI)--> dia chi cua chuoi dich 
 repe cmpsb ; so sanh tung ky tu/byte 
 je intb1 
 writeln tbao2 
 jmp thoat 
intb1: writeln tbao2 
thoat: 
 mov ah,08h 
 int 21h 
 mov ah, 4ch 
 int 21h 
cseg ends 
 end begin 
Bài 6 – Xử lý chuỗi ký tự 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 30 
chúng ta gán trước, ví dụ như oldpass db “1234567890”). Nếu 10 ký tự vừa nhập 
có nội dung giống oldpass thì in ra câu thông báo “Ban da nhap dung roi” và thoát, 
ngược lại thì in ra câu thông báo “Ban da nhap sai roi va vui long nhap lai” và quay 
trở lại nhập cho đến khi nào đúng mới thoát. Gợi ý: dùng hàm 08h, 02h, 09h của 
int 21h và các lệnh loop, cmpsb,. 
3.2. Di chuyển 33 bytes từ nội dung của string1 sang string2, sau đó in nội dung của 
string2 ra màn hình. 
Soạn thảo như đoạn chương trình mẫu và lưu với tên là BAI_6B.ASM. 
- Biên dịch và cho chạy file BAI_6B.ASM để kiểm tra và xem kết quả. 
- Tại sao chỉ di chuyển 33 ký tự/byte mà lại khai báo biến string2 db 34 dup(‘$”). 
Thử thay 34 thành 33 và tiến hành biên dịch, chạy chương trình để xem kết quả. 
Có nhận xét gì về vấn đề này không ?. Giải thích ý nghĩa của việc khai báo này. 
- Thay lệnh CLD trong đoạn chương trình mẫu thành STD. Biên dịch và cho chạy 
chương trình để kiểm chứng kết quả. Cho nhận xét về kết quả nhận được. 
- Nếu thay lệnh movsb thành MOVSW thì chúng ta có phải thay đổi giá trị nào trong 
đoạn chương trình mẫu trên không ?. Nếu có thay đổi, hãy biên dịch và chạy 
chương trình để kiểm chứng lại kết quả. 
dseg segment 
 string1 db "Khong co gi quy hon doc lap tu do" 
 string2 db 34 dup('$') 
dseg ends 
cseg segment 
 assume cs:cseg, ds:dseg, es: dseg 
begin: mov ax, dseg 
 mov ds, ax 
 mov es, ax 
 cld ; chon chieu xu ly chuoi 
 mov cx, 33 ; so ky tu/so byte can di chuyen 
 lea si, string1 ; (DS:SI)--> dia chi cua chuoi nguon 
lea di, string2 ; (ES:DI)--> dia chi cua chuoi dich 
 rep movsb ; di chuyen tung byte 
 mov ah, 09h 
 lea dx, string2 
 int 21h 
 mov ah,08h ; dung man hinh de xem ket qua 
 int 21h 
 mov ah, 4ch ; thoat ve Dos 
 int 21h 
cseg ends 
 end begin 
Bài 6 – Xử lý chuỗi ký tự 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 31 
- Có thể thay thế lệnh REP MOVSB bởi một số lệnh khác hay không? Nếu được thì 
hãy thay đổi và sau đó biên dịch, cho chạy chương trình để kiểm chứng lại kết quả. 
- Giả sử ta có nội dung của một biến string1 có tổng số byte >256 byte thì lúc đó 
chúng ta phải khai báo lại các biến này như thế nào ?. Lúc này có khó khăn gì xảy 
ra không ?. Hãy thử sửa lại, sau đó biên dịch và chạy chương trình để xem kết quả. 
- Có cách nào xác định chiều dài của một biến bất kỳ hay không ?. Hãy cho biết các 
cú pháp của lệnh có thể thực hiện được yêu cầu này. Sau đó thử áp dụng để xác 
định chiều dài của biến string1. 
3.3. Tìm ký tự “A” có trong một chuỗi ký tự bất kỳ, nếu có thì in ra câu thông báo là 
có ký tự “A” trong chuỗi ký tự và ngược lại. 
Soạn thảo như đoạn chương trình mẫu và lưu với tên là BAI_6C.ASM. 
- Biên dịch và cho chạy file BAI_6C.ASM để kiểm tra và xem kết quả. 
write macro bien1 
 mov ah, 09h 
 lea dx, bien1 
 int 21h 
endm 
dseg segment 
 string1 db "NGAC NHIEN CHUA ?" 
 tb1 db "co ky tu A trong chuoi string1 $" 
 tb2 db "khong ky tu A trong chuoi string1 $" 
dseg ends 
cseg segment 
 assume cs:cseg, ds:dseg, es: dseg 
begin: mov ax, dseg 
 mov ds, ax 
 mov es, ax 
 cld ; chonchieu xu ly chuoi 
 mov cx, 17 ; so ky tu can tim 
 mov al, 'A' ; tim kien ky tu A trong string1 
 lea di, string1 ; (ES:DI)--> dia chi cua chuoi dich 
 repne scasb ; lap lai viec tim kiem ky tu cho den 
 jne intb2 ; khi gap duoc hoac den het chuoi 
 write tb1 
 jmp thoat 
intb2: write tb2 
thoat: mov ah,08h ; dung man hinh de xem ket qua 
 int 21h 
 mov ah, 4ch ; thoat ve Dos 
 int 21h 
cseg ends 
 end begin 
Bài 6 – Xử lý chuỗi ký tự 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 32 
- Thay lệnh MOV AL, ‘A’ thành MOV AL, ‘B’, sau đó biên dịch và chạy chương 
trình để xem kết quả. 
- Giải thích nhiệm vụ của các lệnh từ CLD cho đến JNE INTB2. Có thể thay thế 
lệnh REPNE SCASB thành các lệnh khác được không ?. Nếu được hãy thay thế 
chúng, biên dịch và chạy chương trình để kiểm chứng lại kết quả. 
Phụ Lục – Môi trường phát triển hợp ngữ RadASM 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 33 
Phụ lục 
Môi trường phát triển hợp ngữ RadASM 
RadASM là môi trường phát triển Hợp ngữ, được xây dựng để kết hợp những 
hợp ngữ khác nhau nhau MASM, TASM, HASM . và chạy trên môi trường 
Windows. Mỗi hợp ngữ khác nhau khi kếp hợp vào RadASM phải được cấu hình khác 
nhau. Vì mục đích cung cấp công cụ cho sinh viên sử dụng đơn gian, nên RadASM đã 
được cấu hình phù hợp với hợp ngữ MASM for DOS. Vì thế trong quá trình sử dụng, 
sinh viên không cần phải cấu hình gì thêm. 
1. Khởi động RadASM 
 Nhấp đúp biểu tượng trên desktop thì màn hình làm việc của RadASM 
xuất hiện như hình 1. Màn hình làm việc của RadASM chia thành 2 vùng: 
• Vùng soạn thảo dùng để soạn thảo chương trình nguồn ASM 
• Vùng thông báo kết quả: Khi dịch chương trình, những kết quả hay lỗi sẽ 
xuất hiện tại vùng này 
Hình 1: Màn hình làm việc của RadASM 
Số thứ tự 
dòng lệnh
Vùng soạn thảo
Vùng thông báo kết 
quả Dịch chương trình
Phụ Lục – Môi trường phát triển hợp ngữ RadASM 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 34 
Hình 2: Menu FILE Hình 2: Menu MAKE 
Các menu thường dùng là FILE (hình 2) và MAKE (hình 3), các lệnh thường 
dùng: 
• New File (Ctrl+N): Mở file mới để soạn thảo chương trình mới 
• Open File (Ctrl+O): Mở file đã lưu sẳn trên đĩa 
• Save File (Ctrl+S): Lưu file thành tên (nhớ đặt tên file không có khoảng 
trắng, phần mở rộng ASM được thêm vào tự động) 
• Assemble (F5): Hợp dịch file nguồn (ASM) thành file đối tượng (OBJ) 
• Link (Alt+Ctrl+F5): Liên kết file đối tượng (OBJ) thành file thực thi 
(EXE) 
• Run! (Ctrl+Shift+F5): Thực thi chương trình (EXE) 
2. Soạn thảo file chương trình nguồn 
 Chọn lệnh New File trong menu FILE (hay bấm phím nóng tương ứng) để mở 
vùng soạn thảo mới, trong vùng soạn thảo, sử dụng các chức năng soạn thảo giống như 
các trình soạn thảo khác. 
 Sau khi soạn thảo file nguồn xong phải lưu lại thành tên file có phần mở rộng là 
ASM. Và trong tên file không có chứa khoảng trắng. 
3. Hợp dịch (Assemble) 
 Sau khi lưu file chương trình nguồn xong, chọn Assemble trong menu MAKE 
(Hay bấm phím nóng tương ứng) để tiến hành hợp dịch chương trình nguồn. 
• Nếu chương trình có lỗi cú pháp thì vùng thông báo có dạng hình 4. 
Trong đó từng lỗi được chỉ ra bởi số thứ tự dòng lệnh và mã lối 
 Ví dụ: chuoi2.asm(18) : error A2008: syntax error : mod 
 Lỗi ở dòng 18, mã lỗi A2008: sai cú pháp mod 
Phụ Lục – Môi trường phát triển hợp ngữ RadASM 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 35 
Hình 4: Thông báo kết quả Hợp dịch không thành công 
• Khi chương trình xuất hiện lỗi thì file đối tượng (OBJ) không được tạo 
ra và người lập trình phải sửa lại cho đến khi không còn lỗi. 
• Khi không có lỗi chương trình (Hợp dịch thành công) thì trong vùng 
thông báo xuất hiện như hình 5 và file đối tượng (OBJ) được tạo ra. Khi 
đó mới chuyển sang bước LIÊN KẾT 
Hình 5: Thông báo kết quả Hợp dịch thành công 
4. Liên kết (Link) 
 Chọn lệnh Link trong menu MAKE. (hay bấm phím nóng tương ứng) 
 Sau khi hoàn thành bước hợp dịch, thì bước liên kết là bước cuối cùng để tạo ra 
file thực thi (EXE). Trong bước này, không còn kiểm tra lỗi cú pháp nữa và thông 
thường sẽ liên kết thành công và file thực thi EXE sẽ được tạo ra. Nội dung thông báo 
khi liên kết thành công như hình 6. 
Hình 6: Liên kết thành công 
5. Thực thi chương trình EXE 
 Để thực thi chương trình vừa liên kết xong, chọn lệnh RUN trong menu MAKE 
(hay bấm phím nóng tương ứng) . 
Nếu chương trình có truy xuất đến bàn phím hay màn hình thì 1 cửa sổ (dạng 
màn hình của hệ điều hành DOS) xuất hiện như hình 7. Cửa sổ này được tạo ra để hiển 
thị kết quả hay để người dùng tương tác với chương trình đang chạy. 
Phụ Lục – Môi trường phát triển hợp ngữ RadASM 
Ths. Nguyễn Hứa Duy Khang, Ks. Trần Hữu Danh 36 
Nếu chương trình không có thao tác nào để truy xuất bàn phím hay màn hình thì 
chúng ta không thấy được cửa sổ này. 
Như vậy, trong lập trình hợp ngữ, nếu muốn nhìn thấy kết quả gì đó thì chúng 
ta phải có những đoạn lệnh tương ứng để xuất giá trị ra màn hình. 
Hình 7: Cửa sổ kết quả chương trình 

File đính kèm:

  • pdfgiao_trinh_lap_trinh_he_thong.pdf