z
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
TRƢỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÀI TẬP LỚN
Kiến trúc các hệ thống thông tin
Giảng viên hướng dẫn : PGS.TS Nguyễn Thị Hoàng Lan
Sinh viên thực hiện
: Nguyễn Ngọc Linh
Lớp
: Hệ thống thông tin và truyền thông
KSCLC - K52
Hà Nội 4 - 2011
1
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
MỤC LỤC
Trang
A . MỤC ĐÍCH ....................................................................................................... 3
B . NỘI DUNG CÁC BÀI TẬP
Bài tập 1
Lập trình hợp ngữ với các cấu trúc điều khiển …………………….............. 4
Bài tập 2
1. Dịch lời gọi thủ tục ..................................................................................... 6
2. Cơ chế ngắt và lời gọi hệ thống
+ Khảo sát version DOS ....................................................................... 8
+ Phân tích các vector ngắt .................................................................. 8
+ Khảo sát ngắt 21h ............................................................................. 10
+ Lời gọi hệ thống ................................................................................ 14
Bài tập 3
1. Khảo sát cấu hình & hệ thống bộ nhớ ........................................................ 16
2. Phân tích cơ chế quản lý bộ nhớ ................................................................. 16
3. Dùng công cụ Debug khảo sát nội dung các thanh ghi .............................. 18
4. Giải thích nội dung thanh ghi ..................................................................... 20
C. KẾT LUẬN ........................................................................................................ 21
D . PHỤ LỤC : CÁC CHƢƠNG TRÌNH ASSEMBLY
Bài 1 . ............................................................................................................. 22
Bài 2.1 . .......................................................................................................... 29
Bài 2.2 . .......................................................................................................... 33
E . TÀI LIỆU THAM KHẢO ................................................................................ 37
2
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
A . MỤC ĐÍCH
Hợp ngữ ( assembly languague ) là ngôn ngữ bậc thấp gần với ngôn ngữ
máy , được sử dụng để xây dựng phần mềm cho hệ vi xử lý .
Do hợp ngữ sử dụng trực tiếp tập lệnh của bộ vi xử lý nên quá trình điều
hành chức năng rất sát với cấu trúc phần cứng của hệ thống , triệt để khai thác
đước khả năng của phần cứng .
Mục đích của bài tập lớn là giúp sinh viên làm quen với môi trường lập
trình hợp ngữ , có những hiểu biết cơ bản về tập lệnh , cách thức quản lý & sử
dụng tài nguyên ( thanh ghi , bộ nhớ ) của bộ vi xử lý Intel 8x86 . Điều này thể
hiện qua 3 bài tập với các yêu cầu khác nhau :
• Bài 1: Lập trình hợp ngữ với các cấu trúc điều khiển.
• Bài 2: Lập trình hợp ngữ dịch lời gọi thủ tục, khảo sát tổ chức hệ thống, cơ chế
ngắt và thực hành các lời gọi hệ thống
• Bài 3: Thực hành quản lý bộ nhớ cho một ứng dụng
3
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
B . NỘI DUNG CÁC BÀI TẬP
Bài 1 . Lập trình hợp ngữ với các cấu trúc điều khiển
Viết và thực hành một thủ tục assembler thực hiện so sánh xâu chuỗi ký tự theo
các yêu cầu sau:
Cho hai xâu chuỗi ký tự X và Y có độ dài tương ứng là n và m (kể cả ký tự
rỗng) với n>m, kết quả chương trình trả lời các câu hỏi dưới đây:
– Xâu Y có phải là xâu con của xâu X không?
– Nếu xâu Y là xâu con của xâu X thì chỉ ra vị trí xâu Y ở xâu X, xâu X
chứa mấy xâu Y?
( So sánh chuỗi kí tự -> file 1s.Chuoi con.asm , 1s.Chuoi con.exe )
Giải thích chương trình :
- Nhập chuỗi kí tự X , Y với độ dài tối đa 255 như đã khai báo trong code . Nếu nhập
quá số kí tự tối đa , chương trình có thể cho kết quả sai .
Việc nhập chuỗi kí tự được thực hiện nhờ thủ tục INPUTSTR . Chiều dài chuỗi vừa
nhập được chứa trong thanh ghi BX sau đó đưa ra các biến N1 ( độ dài X ) , N2 ( độ
dài Y )
Thủ tục BACKSPACE được gọi trong trường hợp xóa kí tự khi nhập : thay thế kí tự
bị xóa bằng khoảng trắng , biến đếm độ dài và con trỏ đều giảm 1 .
- So sánh độ dài 2 chuỗi X , Y . Các trường hợp : chuỗi rỗng ( độ dài = 0 ) , N2 > N1 ,
chương trình kết luận Y không là chuỗi con của X .
- Trong trường hợp N2 <= N1 , chương trình tiến hành kiểm tra ( thủ tục CHECK )
bằng cách so sánh liên tiếp các chuỗi con dài N2 trong X ( trỏ bởi DI ) với chuỗi Y (
trỏ bởi SI ) , ngừng quá trình khi tới 1 vị trí giới hạn .
4
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
- In ra vị trí tìm thấy chuỗi con ( nếu có )
- Sử dụng 1 biến đếm (DEM) để xác định số lần xuất hiện chuỗi con Y trong X .
- Khi việc kiểm tra kết thúc , nếu DEM = 0 -> Y không là chuỗi con của X . Ngược
lại , Y là chuỗi con của X .
- Việc in số thực hiện nhờ thủ tục PRTNUM ( chia liên tiếp số cần in cho 10 , in lần
lượt các số dư ra màn hình )
- Khai báo & sử dụng Macro Thongbao để in 1 chuỗi kí tự ra màn hình .
Chạy chương trình :
- Trong trường hợp tìm thấy xâu con :
- 1 trường hợp đặc biệt :
5
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
Bài 2 . Lời gọi thủ tục , tổ chức hệ thống , cơ chế ngắt và lời gọi hệ thống
Phần 1 . Dịch lời gọi thủ tục
Viết và thực hiện chương trình tìm số lớn nhất trong một mảng N các số
nguyên 16 bit và hiển thị kết quả lên màn hình bằng mã ASCII. Viết thủ tục con SAP
thực hiện chuyển đổi một số nguyên VAL 16 bit thành số CHA hệ cơ số 10 biểu diễn
bằng mã ASCII. Thủ tục con này được gọi bởi chương trình tìm số lớn nhất
( Tìm số lớn nhất trong dãy số -> file 2s.1.Max.asm , 2s.1.Max.exe )
Giải thích chương trình :
- Dãy số có dấu nhập từ bàn phím ( gọi thủ tục Nhap ) .
Các phần tử phải nằm trong khoảng ( -32768 , 32767 ) . Nếu nhập sai , kết quả
chương trình sẽ không chính xác
- Tìm phần tử lớn nhất bằng cách so sánh liên tiếp từng cặp phần tử cho tới khi duyệt
hết dãy số
Sử dụng :
+ Thanh ghi CX làm biến đếm ( chứa số phần tử N của dãy số )
+ Thanh ghi AX chứa phần tử lớn nhất tạm thời ( ban đầu chính là phần tử đầu
dãy số )
+ Thanh ghi BX trỏ tới từng phần tử của dãy số sau đó thực hiện so sánh .
Kết thúc quá trình so sánh , AX chứa phần tử lớn nhất của dãy .
- Việc chuyển đổi số 16bit thành thập phân và in ra màn hình được thực hiện nhờ thủ
tục SAP ( chia liên tiếp số cần in cho 10 , in lần lượt các số dư ra màn hình )
- Khai báo & sử dụng MACRO Thongbao để in 1 chuỗi kí tự ra màn hình , MACRO
Xuongdong để chuyển con trỏ xuống 1 dòng mới .
6
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
Chạy chương trình :
- Trường hợp bình thường
- Trường hợp nhập sai quy định , chương trình cho ra kết quả không chính xác
7
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
Phần 2 . Cơ chế ngắt , lời gọi hệ thống
1. Khảo sát version DOS trên máy đang thực hiện
- Chạy lệnh VER tại dấu nhắc dòng lệnh
- Kết quả : Microsoft Windows 6.1.7601
2. Viết thủ tục thực hiện hiển thị lên màn hình N vector ngắt của hệ thống
(0
( file 2s.2.Ngat.asm , 2s.2.Ngat.exe )
- Sử dụng hàm 35h của ngắt 21
+ Vào : AL chứa số thứ tự ngắt
+ Ra : ES : BX chứa địa chỉ của chương trình con phục vụ ngắt
In nội dung ES : BX ra màn hình , trong đó sử dụng thủ tục INRA để in 1 số hexa .
( chia liên tiếp số cần in cho 16 , in lần lượt các số dư ra màn hình )
- Lặp N lần quá trình trên để in đủ N vector ngắt .
- Khai báo & sử dụng MACRO Thongbao để in 1 chuỗi kí tự ra màn hình , MACRO
Xuongdong để chuyển con trỏ xuống 1 dòng mới
8
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
- Chạy chương trình :
Số thứ tự ngắt
Địa chỉ ( ES:BX )
- Nhận xét :
+ Bảng vector ngắt đầy đủ gồm 256 phần tử , mỗi phần tử gồm 4 byte ứng với
256 ngắt từ 0 đến 0FFh . Mỗi phần tử chứa 2 địa chỉ : địa chỉ thanh ghi đoạn ES đưa
vào CS , địa chỉ offset BX của chương trình con phục vụ ngắt đưa vào IP
+ Chia 2 loại : Ngắt của BIOS : từ 0h đến 1Fh
Ngắt của DOS : từ 20h đến 0FFh
+ Có 1 số vector ngắt chưa được sử dụng , mang địa chỉ 0000:0000 .
9
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
3. Khảo sát ngắt 21h và hãy cho biết chức năng các hàm của DOS
* Ngắt 21h : các chức năng của DOS . 1 số hàm thông dụng của ngắt 21h :
-Hàm 01h : Đợi đọc 1 ký tự từ bàn phím (có hiện trên màn hình)
Vào
Không
Ra
AL : Mã ASCII của phím nhận được
Đợi đọc một ký tự từ bàn phím (phím nhận được sẽ hiển thị trên màn hình). Khi
một phím được ấn thì ký tự tương ứng với phím đó được lưu trong thanh ghi AL. Nếu
phím được ấn là một phím đặt biệt thì AL=0. Tổ hợp phím Ctrl-Break kết thúc công
việc của hàm này.
-Hàm 02h : Hiển thị 1 kí tự tại vị trí con trỏ trên màn hình
Vào
DL <- Mã ASCII của kí tự cần hiển thị
Ra
Không
- Hàm 03h : Đọc dữ liệu vào từ cổng nối tiếp chuẩn (COM1)
Vào
Không
Ra
AL : byte dữ liệu đọc được
-Hàm 04h : Xuất ký tự ra cổng nối tiếp chuẩn (COM1)
Vào
DL ← ký tự cần xuất
Ra
Không
-Hàm 05h : Xuất byte dữ liệu ra cổng máy in chuẩn (LPT1)
Vào
DL : Byte dữ liệu cần xuất
Ra
Không
10
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
-Hàm 06h : Nhập / Xuất từ thiết bị chuẩn (không đợi)
Vào
DL ← Mã ASCII ký tự cần xuất lên màn hình
Nếu DL ← 0FFh : Thực hiện chức năng nhập ký tự
Ra
Nếu ZF = 0 thì ALchứa mã ASCII ký tự nhận được
Nếu ZF = 1 thì không nhận được ký tự
-Hàm 07h : Giống hàm 01h , nhưng không hiện ký tự ra màn hình
Vào
Không
Ra
AL : Mã ASCII ký tự nhận được
-Hàm 08h : Giống hàm 01h , nhưng không hiện ký tự ra màn hình
Vào Không
Ra
AL : Mã ASCII ký tự nhận được
Lưu ý:
Ctrl-Break không ảnh hưởng đến hoạt động của hàm 07h và 08h
-Hàm 09h : Xuất 1 chuỗi ký tự lên màn hình
Vào
DS:DX ← địa chỉ logic của chuỗi ký tự cần xuất
Ra
Không
Lưu ý: DS ← địa chỉ segment của chuỗi trong bộ nhớ
DX ← địa chỉ offset của chuỗi trong bộ nhớ
Chuỗi ký tự phải chấm dứt bằng ký tự ‘$’
-Hàm 0Ah : Đợi đọc 1 chuỗi ký tự từ bàn phím, kết thúc bằng Enter
Vào
DS:DX ← địa chỉ của vùng đệm bàn phím trong bộ nhớ
Ra
LEN: Tổng số ký tự nhận được
BUFF: Mã ASCII của các ký tự nhận được
11
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
-Hàm 0Bh : Cho trạng thái bàn phím
Vào
DS:DX ← địa chỉ logic của vùng đệm bàn phím trong bộ nhớ
Ra
LEN: Tổng số ký tự nhận được
BUFF: Mã ASCII của các ký tự nhận được
-Hàm 25h : thiết lập vector ngắt
Vào
DS:DX : giá trị mới của địa chỉ vector ngắt
AL : số thứ tự ngắt
Ra Không
-Hàm 30h : lấy giá trị phiên bản DOS
Vào
Ra
AL : phần chính của phiên bản
AH :phần phụ của phiên bản
-Hàm 35h :
Vào AL : Số thứ tự ngắt
Ra ES:BX : Địa chỉ chương trình phục vụ ngắt
-Hàm 3Ch : Tạo tập tin mới
Vào
DS:DX ← Địa chỉ chuỗi tên của tập tin mới.
CX ← thuộc tính của tập tin (0: bình thường, 1: chỉ đọc, 2: ẩn,4: tập tin hệ
thống)
Ra
AX : Thẻ tập tin
-Hàm 3Dh : Mở tập tin trên đĩa
Vào
DS:DX ← Địa chỉ chuỗi tên của tập tin mới.
AL ← kiểu truy xuất tập tin (0: chỉ đọc, 1: chỉ ghi, 2: đọc/ghi)
Ra
AX : Thẻ tập tin
12
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
-Hàm 3Eh : Đóng tập tin đang mở.
Vào
BX ← Thẻ tập tin
Ra
AX : Mã lỗi (nếu có)
Sau khi xử lý xong tập tin và trước khi thoát khỏi chương trình, tập tin phải được
đóng lại để cập nhật thông tin hoặc nội dung mới của tập tin.
-Hàm 3Fh : Đọc nội dung tập tin vào bộ nhớ
Vào
DS:DX ← Địa chỉ vùng nhớ chứa dữ liệu đọc được
BX ← Thẻ tập tin cần đọc
CX ← số byte cần đọc
Ra
AX : Số byte đọc được
-Hàm 40h : Ghi dữ liệu trong bộ nhớ vào tập tin
Vào
DS:DX ← Địa chỉ vùng nhớ chứa dữ liệu cần ghi
BX ← Thẻ tập tin cần đọc
CX ← số byte cần ghi
Ra
AX : Số byte ghi được
Các hàm 3Fh và 40h cũng có thể được sử dụng đọc hoặc ghi dữ liệu cho ngoại vi, vì
DOS quản lý việc truy xuất ngoại vi bằng thẻ
-Hàm 41h : Xóa tập tin trên đĩa
Vào
DS:DX ← Địa chỉ chuỗi tên tập tin
Ra
AX : Mã lỗi (nếu có)
-Hàm 42h : Dời con trỏ tập tin hiện hành
Vào
AL ← Hướng dời
CX:DX ← Cự ly dời = (CX*65536) + DX
BX ← Thẻ tập tin
Ra
DX:AX : Vị trí con trỏ mới = (DX*65536)+AX
13
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
-Hàm 43h : Đọc hoặc thay đổi thuộc tính tập tin trên đĩa
Vào
DS:DX ← Địa chỉ chuỗi tên tập tin
Nếu Đọc thuộc tính:
AL ← 0
Nếu Thay đổi thuộc tính:
AL ←1vàCX ←thuộc tính mới
Ra
Nếu Đọc thuộc tính: CX : chứa thuộc tính tập tin
-Hàm 4Ch : Kết thúc chương trình và trở về DOS
Vào Không
Ra
Không
-Hàm 56h : Đổi tên tập tin
Vào
DS:DX ← Địa chỉ chuỗi tên tập tin cũ
ES:DI ← Địa chỉ chuỗi tên tập tin mới
Ra
Không
4.Khảo sát thực hiện các lời gọi hệ thống của DOS, giải thích cơ chế thực hiện một
lời gọi hệ thống trên máy thực tế (tùy chọn một lời gọi)
* Lời gọi hệ thống :
=> Cung cấp giao diện giữa một quá trình và hệ điều hành. Các lời gọi này thường
dùng các lệnh hợp ngữ . Lời gọi hệ thống được thực hiện nhờ các ngắt .
Cơ chế thực hiện 1 lời gọi hệ thống , lấy ví dụ với 1 lời gọi hệ thống trên máy
thực tế : dùng ngắt 21h , hàm 09h để in 1 chuỗi kí tự ra màn hình .
- Khi gặp 1 lời gọi hệ thống ( ngắt ) , trạng thái của chương trình chính ( nội dung các
thanh ghi , cờ , quan trọng nhất là nội dung của con trỏ CS:IP ) được sao lưu .
- CPU tìm địa chỉ bắt đầu của chương trình con phục vụ ngắt trong bảng vector ngắt
theo số thứ tự ngắt .
- Chuyển tới chương trình con phục vụ ngắt bằng cách gán địa chỉ của nó vào CS:IP > nội dung 2 thanh ghi bị thay đổi .
14
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
- Thực hiện chương trình con ( lời gọi hệ thống )
- Sau khi thực hiện xong , khôi phục trạng thái của các thanh ghi , trở về chương trình
chính để thực hiện các lệnh tiếp theo .
15
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
Bài 3 . Phân tích khảo sát cơ chế quản lý bộ nhớ
1. Khảo sát cấu hình của máy và hệ thống bộ nhớ của máy đang sử dụng (Bộ nhớ
trong: ROM, RAM, Cache (System,…), Bộ nhớ ngoài: ổ đĩa cứng, CD, Thiết bị vào
ra,…)
- CPU : Core 2 Duo E6550 2.33GHz bus 1333 MHz
- Bộ nhớ trong :
+ ROM - BIOS : AMI v.1201
+ RAM : 4GB DDR2 bus 800MHz
+ Cache CPU : L1 = 2x32k , L2 = 4MB
- Bộ nhớ ngoài :
+ HDD : 160GB , cache = 8MB
+ DVDROM
- Thiết bị vào ra : bàn phím , chuột , màn hình , loa
2.Phân tích cơ chế quản lý bộ nhớ được hệ điều hành thực hiện như thế nào đối với
một chương trình ứng dụng, ví dụ xét cụ thể đối với chương trình của bài tập 1.
Áp dụng đối với chƣơng trình 1s.Chuoi con.exe :
a. Bộ nhớ được quản lý theo cơ chế phân đoạn (segmentation)
Cơ chế này coi không gian địa chỉ là một tập các phân đoạn (segment) . Mỗi
chương trình có thể có nhiều phân đoạn . Khi 1 đoạn cần được đưa vào vùng nhớ
chính, hệ điều hành sẽ tìm kiếm vùng nhớ trống đủ lớn để lưu thông tin phân đoạn đó.
Mỗi phân đoạn có địa chỉ cơ sở, được tạo trong bộ nhớ và giới hạn kích cỡ.
Mỗi địa chỉ được xác định bởi 2 giá trị < s , d >
16
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
Số hiệu phân đoạn s : được sử dụng như chỉ
mục đến bảng phân đoạn
Địa chỉ tương đối d : có giá trị trong khoảng
từ 0 đến giới hạn chiều dài của phân đoạn.
Nếu địa chỉ tương đối hợp lệ, nó sẽ được
cộng với giá trị chứa trong thanh ghi nền để
phát sinh địa chỉ vật lý tương ứng.
b. Đối với chương trình 1s.Chuoi con.exe
đang xét :
* Chương trình khi chưa thực hiện được lưu trong bộ nhớ ngoài (VD :ổ cứng)
* Chương trình khi thực hiện được nạp vào bộ nhớ trong . Hệ điều hành cấp phát
không gian địa chỉ cho các phân đoạn của chương trình ( SS , DS , CS , ES )
- .MODEL SMALL => Mã lệnh và dữ liệu của chương trình nằm ở 2 đoạn khác nhau
(đoạn mã trỏ bởi CS ,đoạn dữ liệu trỏ bởi DS) , mỗi đoạn có kích thước tối đa là 64
KB .
- .STACK 100h => Kích thước đoạn SS dành cho ngăn xếp là 256 bytes
- .DATA => Đánh dấu vùng nhớ dành cho dữ liệu . Trong chương trình ES , DS trỏ
tới vùng nhớ này để sử dụng các dữ liệu đã khai báo .
Mỗi biến , mỗi lệnh , mỗi chương trình con có 1 địa chỉ xác định , các thanh ghi có
liên quan được khởi tạo .
* Nội dung của các thanh ghi & ngăn xếp có thể thay đổi liên tục trong quá trình thực
hiện chương trình .
17
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
3.Dùng công cụ Debug khảo sát nội dung các thanh ghi IP, DS, ES, SS, CS, BP, SP
- Xét VD cụ thể là chương trình ở Bài 1 :
Sau khi dịch , ta thu được file đuôi .exe
- Chạy debug từ dấu nhắc dòng lệnh theo cú pháp :
debug <đường dẫn tới file .exe>
- Để hiển thị nội dung hiện tại của các thanh ghi , dùng lệnh –r
- Để hiển thị nội dung các thanh ghi sau n bước thực hiện chương trình , dùng lệnh
–t n ( trong hình minh họa , n = 5 )
- Để chạy chương trình , dùng lệnh –g
- Để thoát khỏi debug , dùng lệnh –q
=> Thực hiện debug với file 1s.exe sử dụng các lệnh trên ( xem hình )
*Nhận xét nội dung các thanh ghi DS , ES , SS , CS , BP , SP , IP :
- Ban đầu : DS = ES = 13CE
+ Sau lệnh thứ 2 , 3 , các thanh ghi DS , ES thay đổi giá trị và sau đó giữ không
đổi cho tới khi kết thúc chương trình
DS = ES = 13EE
- Nội dung các thanh ghi SS , BP không đổi trong suốt quá trình chạy chương trình
SS = 13DE , BP = 0000
- Nội dung thanh ghi CS , SP thay đổi khi gặp ngắt , ở đây là ngắt 21h .
- Nội dung thanh ghi IP liên tục thay đổi
18
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
19
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
4. Giải thích nội dung các thanh ghi, trên cơ sở đó giải thích cơ chế quản lý bộ nhớ
của hệ thống trong trường hợp cụ thể này
- Khi chương trình bắt đầu chạy , hệ điều hành tự động khởi tạo các thanh ghi , vùng
nhớ và cấp phát không gian địa chỉ cho chương trình .
- Tương ứng với các câu lệnh trong mã nguồn , nội dung các thanh ghi có thể thay đổi
hoặc không .
+ IP là thanh ghi con trỏ lệnh . Khi 1 lệnh được nạp vào , IP sẽ tăng để trỏ tới
lệnh tiếp theo . Giá trị tăng thêm tùy thuộc độ dài lệnh trước đó . Khi nhảy tới nhãn /
chương trình con ... , con trỏ lệnh trỏ tới địa chỉ nhãn , chương trình con tương ứng .
Đối với lệnh nhảy có điều kiện , nếu điều kiện không thỏa mãn , giá trị IP không đổi .
+ DS , ES trỏ tới vùng dữ liệu (Ở chương trình đang xét , @DATA = 13EE =
không đổi ) . Sau đó không có lệnh nào làm thay đổi nội dung 2 thanh ghi này .
+ SS , BP giữ nguyên giá trị khởi tạo do trong chương trình không có lệnh nào
làm thay đổi nội dung 2 thanh ghi này .
+ SP trỏ vào phần tử ở đỉnh ngăn xếp . Do chương trình khai báo kích thước
ngăn xếp là 100h (256 bytes) nên ban đầu SP = 100h . Khi gặp các các ngắt hay
chương trình con có sử dụng ngăn xếp ( thao tác pop , push ) , nội dung của thanh ghi
SP thay đổi .
+ Khi ngắt , trạng thái của chương trình chính được cất giữ , chương trình con
phục vụ ngắt được gọi . Địa chỉ của nó được xác định bởi CS:IP nên cùng với IP , nội
dung của CS cũng bị thay đổi .
20
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
C. KẾT LUẬN
Sau khi hoàn thành các bài tập trên , sinh viên có thể :
* Làm quen với hợp ngữ :
- Nắm được cấu trúc của 1 chương trình hợp ngữ .
- Hiều & biết cách sử dụng các thanh ghi và ngăn xếp .
- Hiểu & biết cách sử dụng các cấu trúc lặp , rẽ nhanh , các hàm của ngắt ( chủ yếu là
ngắt 21h ) , biết cách tổ chức chương trình con ( thủ tục ) , macro và sử dụng chúng
trong chương trình chính .
* Nắm được các lệnh thường dùng trong tập lệnh của vi xử lý 8x86 .
* Có kiến thức cơ bản về cơ chế quản lý bộ nhớ của hệ điều hành đối với 1 chương
trình ứng dụng . Sử dụng công cụ debug sẵn có của hệ điều hành để khảo sát các
thanh ghi và ngăn xếp trong quá trình chạy 1 chương trình .
Từ trên , có thể thấy rằng đây là các bài tập cần thiết bởi nó liên quan đến
những nội dung quan trọng trong chương trình học .
Bài tập lớn giúp sinh viên nắm vững & hệ thống lại các kiến thức đã học trên
lớp , đồng thời phát hiện & kịp thời khắc phục những thiếu sót trong quá trình học
trước đó , cải thiện hiệu quả trong môn học Kiến trúc các hệ thống thông tin .
21
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
D . PHỤ LỤC .
CÁC CHƢƠNG TRÌNH ASSEMBLY
;BAI 1
+ Nhap 2 xau X Y
;
+ Kiem tra Y chua trong X , neu co thi o vi tri nao , may lan ?
;-------------------------------------------------------------------------------------.MODEL SMALL
.STACK 100h
.DATA
X
DB 255 DUP(0)
Y
DB 255 DUP(0)
N1 DW ?
N2 DW ?
START
DW ?
STOP
DW ?
DEM
DW 0
MSG1
DB 'Nhap vao xau X : $'
MSG2
DB 'Nhap vao xau Y : $'
MSG3
DB 'Xau Y chua trong xau X.$'
MSG4
DB 'Xau Y khong chua trong xau X.$'
MSG6
DB 'Vi tri thu : $'
MSG7 DB 'So lan xuat hien : $'
KT DB 13,10,'$'
Thongbao macro msg
lea dx,msg
mov ah,9
int 21h
endm
.CODE
MAIN
PROC
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
Thongbao MSG1
22
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
LEA DI,X
;DI tro toi X
CALL INPUTSTR;nhap X
MOV N1,BX
;N1 chua chieu dai X
Thongbao KT
Thongbao MSG2
LEA DI,Y
CALL INPUTSTR;nhap Y
MOV N2,BX
;N2 chua chieu dai Y
Thongbao KT
PUSH AX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
;backup thanh ghi
MOV CX,N1
CMP CX,0
JE NO
;neu N1=0 -> ko la xau con
MOV CX,N2
;CX=N2
CMP CX,0
;CX=0 ?
JE
NO
;neu N2=0 -> ko la xau con
MOV BX,N1
;BX=N1
CMP CX,BX
;so sanh N1 voi N2
JA NO
;neu N2>N1 -> ko la xau con
;N2!=0 & N2<=N1
LEA SI,Y
LEA DI,X
CALL CHECK
MOV AX,DEM
CMP AX,0
JE
NO
YES:
;ktra Y co chua trong X ko
;neu ko tim thay
;neu tim thay
23
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
Thongbao MSG3
Thongbao MSG7
MOV AX,DEM
CALL PRTNUM
JMP EXIT
;in ra so lan xuat hien
NO:
Thongbao MSG4
EXIT:
MOV AH,1
INT 21H
MOV AH,4Ch
INT 21h
MAIN
ENDP
;------------------------------------------------------------------------------;Thu tuc doc 1 xau
;input : DI=offset ca xau
;output: DI=offset cua xau
;
BX=so ky tu cua xau
INPUTSTR PROC
PUSH AX
;backup cac thanh ghi
PUSH CX
PUSH DX
PUSH DI
CLD
XOR BX,BX
MOV AH,1
INT 21h
LAP1:
CMP AL,0Dh
JE
EXIT1
CMP AL,8h
JE
BACK
STOSB
INC BX
JMP READ
;DF=0 : xu ly tu trai sang phai
;khoi tao bien dem BX
;doc ky tu
;AL="enter" ?
;thoat
;AL="backspace" ?
;dung
;cat AL vao ES:DI,tang DI
24
Mục lục
Nguyễn Ngọc Linh
HTTT – KSCLC K52
--------------------------------------------------------------------------------------------------------
BACK:
CMP BX,0
JE
NOBACK
;ko the xoa 1 ky tu truoc no (do BX=0)
DEC BX
DEC DI
;doi DI ve truoc 1 ky tu
CALL BACKSPACE
;xoa 1 ky tu tren man hinh
JMP READ
NOBACK:
CALL BACKERROR
READ:
INT 21h
JMP LAP1
EXIT1:
POP DI
;restore thanh ghi,qay lai ct chinh
POP DX
POP CX
POP AX
RET
INPUTSTR ENDP
;------------------------------------------------------------------------------CHECK
PROC
;ktra xau con
;input:
SI=offset cua Y
;
DI=offset cua X
;output:BX=0 neu khong tim thay
;
BX=vi tri cua Y trong X
PUSH AX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
;backup thanh ghi
PUSH DI
MOV START,DI
POP DI
PUSH DI
25
Mục lục