Kiến trúc máy tính - Bài thực hành 3
Mục đích của bài thực hành: Giúp sinh viên làm quen với Turbo Assember để dịch các chương trình hợp ngư
Bạn đang xem nội dung tài liệu Kiến trúc máy tính - Bài thực hành 3, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
18
Bài 3: Sử dụng công cụ TASM để dịch chương trình
Mục đích của bài thực hành: Giúp sinh viên làm quen với công cụ Turbo Assember để
dịch các chương trình hợp ngữ.
Các bài tập thực hành:
1. Tìm hiểu các thông số của chương trình thực thi TASM.EXE, TLINK.EXE,
EXE2BIN.EXE
Hướng dẫn: Vào chế độ command line, gõ lần lượt:
TASM /?
TLINK/?
EXE2BIN /?
2. Sử dụng công cụ soạn thảo chương trình, soạn hai file mẫu chương trình Hello
Assembly dạng COM và dạng EXE đã học trong buổi lý thuyết với tên đặt là:
Hello_E.ASM Cho chương trình dạng EXE
Hello_C.ASM Cho chương trình dạng COM
3. Dịch và thực thi hai file nguồn Hello_E.ASM và Hello_C.ASM bằng công cụ TASM
Hướng dẫn:
+ Vào chế độ dòng lệnh(Start Run CMD.EXE)
+ Dùng lệnh CD để chuyển đến thư mục chứa file nguồn đã tạo
+ Dùng lệnh PATH để thiết lập đường dẫn đến công cụ TASM
PATH ↵
Lưu ý: có thể double click lên file thuchanh.bat để thực hiện các công việc trên một
cách nhanh chóng.
+Dịch và thực thi file dạng EXE (Hello_E.ASM) :
B1. Dịch file nguồn Hello_E.ASM thành file Hello_E.OBJ
TASM Hello_E.ASM ↵
Dùng lệnh DIR xem đã xuất hiện file Hello_E.OBJ chưa
B2. Chuyển file Hello_E.OBJ thành file thực thi Hello_E.EXE
TLINK Hello_E.OBJ ↵
Dùng lệnh DIR xem đã xuất hiện file Hello_E.EXE chưa
B3. Thực thi file EXE bằng cách gõ tên file Hello_E ở chế độ dòng lệnh và ghi
nhận kết quả:
Hello_E ↵
+Dịch và thực thi file dạng COM (Hello_C.ASM) :
B1. & B2. Làm tương tự dạng EXE
Sau các bước này ta có file Hello_C.EXE
19
B3. Chuyển file EXE thành file COM:
EXE2BIN Hello_C.EXE Hello_C.COM ↵
Dùng lệnh DIR xem đã xuất hiện file Hello_C.COM chưa
B4. Thực thi file Hello_C.COM
So sánh kích thước của hai file Hello_C.COM và Hello_E.EXE
4. Thử debug chương trình COM và EXE bằng chương trình DEBUG
Hướng dẫn:
DEBUG HELLO_C.COM
DEBUG HELLO_E.EXE
Dùng lệnh D, U để xem nội dung chương trình trong bộ nhớ, G để thực thi.
5. Thử debug chương trình COM và EXE bằng chương trình TD (Turbo debugger)
Hướng dẫn:
TD HELLO_C.COM
TD HELLO_E.EXE
Bài tập: Viết chương trình in ra màn hình các thông tin về sinh viên như sau, mỗi
thông tin in trên 1 dòng
Truong:….
Lop:….
Ho va ten: …..
Yêu cầu: Viết cho hai dạng EXE và COM
Gợi ý: có thể in ra chuỗi sau để điều khiển việc xuống dòng:
xuongdong db 0Dh,0Ah,’$’
20
Bài 4: Ngắt và các chương trình phục vụ xuất nhập
Mục đích của bài thực hành: Giúp sinh viên làm quen với các thao tác xuất nhập màn
hình /bàn phím qua INT 21h. Sinh viên tham khảo thêm trong cuốn giáo trình.
4.1. Khái niệm ngắt và các chương trình phục vụ:
Sử dụng các lệnh IN / OUT cho các thao tác xuất nhập các thiết bị ngoại vi là công việc
phức tạp, đòi hỏi người lập trình phải am hiểu phần cứng máy tính. Ngoài ra tùy theo các
loại máy tính mà số hiệu cổng của các thiết bị ngoại vi có thể thay đổi. Vì vậy để đơn giản,
các nhà sản xuất máy tính đã cung cấp sẳn các chương trình phục vụ vào ra cơ bản cho
người lập trình và người lập trình sẽ gọi các chương trình phục vụ này thông qua lời gọi
ngắt INT
Cú pháp: INT số_hiệu_ngắt
Mỗi số hiệu ngắt tương ứng với một bộ chương trình phục vụ, mỗi bộ chương trình gồm
nhiều hàm, các hàm được chọn thông qua thanh ghi AH.
Ví dụ: INT 21h/AH=1 : Nhập 1 ký tự từ bàn phím
INT 21h/AH=2 : Xuất 1 ký tự ra màn hình
INT 21h/AH=9 : Xuất 1 chuỗi ký tự ra màn hình
4.2. Các chương trình phục vụ nhập xuất cơ bản qua ngắt INT 21h
4.2.1. Nhập ký tự từ bàn phím
a. INT 21h/AH=1
• Nhập một ký tự từ bàn phím và có hiển thị ký tự này ra màn hình
• Gọi với: AH=1
INT 21h
• Trị trả về: AL = mã ASCII của ký tự vừa nhập
• Bài tập thực hành: Thử hàm này bằng trình debug
Hướng dẫn:
Khởi động Debug, nhập vào đoạn chương trình gọi hàm INT21h/AH=1 ở địa chỉ
CS:100h
-a 100
17E1:0100 MOV AH,1
17E1:0102 INT 21
17E1:0104
Lưu ý trong debug hệ đếm mặc định là 16 nên chỉ cần viết 21
thay vì 21h
21
Thực thi đoạn chương trình gồm 2 lệnh vừa nhập, và nhập vào 1 ký tự bất kỳ
(trong ví dụ này nhập vào ký tự B):
-g=100 104
B
Xem nội dung các thanh ghi sau khi thực hiện xong:
AX=0142 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=17E1 ES=17E1 SS=17E1 CS=17E1 IP=0104 NV UP EI PL NZ NA PO NC
17E1:0104 0000 ADD [BX+SI],AL DS:0000=CD
AX có giá trị 0142,
với AH=01 (gán bởi lệnh MOV)
và AL=42h (mã ASCII của ký tự ‘B’ đã nhập)
b. INT 21h/AH=8
• Nhập một ký tự từ bàn phím nhưng không hiển thị ký tự này ra màn hình
• Gọi với: AH=8
INT 21h
• Trị trả về: AL = mã ASCII của ký tự vừa nhập
• Bài tập thực hành: Thử hàm này bằng trình debug tương tự như mục a.
4.2.2. Nhập chuỗi từ bàn phím - INT 21h/AH=0Ah
• Nhập một chuỗi ký tự từ bàn phím với chiều dài tối đa 255, dùng phím
BACKSPACE để sửa ký tự, ENTER để kết thúc việc nhập
• Gọi với: AH=0Ah
DS:DX = địa chỉ của vùng đệm lưu chuỗi
INT 21h
• Trị trả về: không có
• Chú ý: Vùng đệm lưu chuỗi phải có dạng sau:
o Byte đầu tiên: kích thước của vùng đệm, thể hiện số byte tối đa cần đọc
- cần phải gán trước khi gọi hàm
o Byte thứ hai: số byte thực sự đọc – được trả về sau khi gọi hàm
o Các byte tiếp theo: lưu các ký tự đã nhập vào – được gán sau khi gọi
hàm
• Bài tập thực hành: Thử hàm này bằng trình debug tương tự như mục a.
Hướng dẫn:
Nhập chuỗi dài tối đa 20 ký tự (14h) vào vùng nhớ DS:202h
Dùng lệnh E chuẩn bị vùng đệm chứa chuỗi nhập gồm byte đầu tiên chứa giá trị
14h, byte thứ 2 chứa giá trị 0:
-E DS:200 14 00
Dùng lệnh D kiểm tra lại:
22
-d 200
17E1:0200 14 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17E1:0210 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17E1:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17E1:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17E1:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17E1:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17E1:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
17E1:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Nhập đoạn chương trình vào:
-a cs:100
17E1:0100 mov dx,200
17E1:0103 mov ah,0a
17E1:0105 int 21
17E1:0107
Thực thi và nhập thử 1 chuỗi:
-g=100 107
Kiểm tra lại vùng nhớ DS:202:
-D DS:200
Xem số ký tự đã nhập chứa trong byte ở địa chỉ DS:201
4.2.3. Hàm xuất ký tự INT 21h/AH=2
• Hiển thị ký tự có mã ASCII chứa trong DL ra màn hình
• Gọi với: AH=2
DL = Mã ASCII của ký tự muốn xuất
INT 21h
• Trị trả về: không có
• Chú ý: Các ký tự đặc biệt
o Ký tự có mã ASCII 41h : ‘A’
Như vậy 42h là ‘B’, 43h là ‘C’ …
o Ký tự có mã ASCII 61h : ‘a’
o Ký tự có mã ASCII là 0Ah: xuống dòng
o Ký tự có mã ASCII là 0Dh: về đầu dòng
• Bài tập thực hành: Thử hàm này bằng trình debug
Ví dụ: In ra màn hình ký tự ‘A’
MOV AH,2
MOV DL,41h
INT 21h
Ví dụ: Phát tiếng Beep
MOV AH,2
MOV DL,7
INT 21h
23
4.2.4. Hàm xuất chuỗi INT 21h/AH=9
• Xuất một chuỗi ký tự ra màn hình. Chuỗi phải kết thúc bằng ký tự ‘$’
• Gọi với: AH=9
DS:DX = Địa chỉ của chuỗi cần xuất
INT 21h
• Trị trả về: không có
• Bài tập thực hành: Thử hàm này bằng trình debug
Hướng dẫn:
Dùng lệnh E nhập vào chuỗi ‘Thuc hanh hop ngu$’ vào vùng nhớ bắt đầu ở địa
chỉ DS:500h
Nhập đoạn chương trình sau vào vùng nhớ CS:100h bằng lệnh A
MOV DX,500
MOV AH,9
INT 21h
INT 20h
Thực thi đoạn chương trình trên bằng lệnh G
Bài tập tổng hợp:
1. Viết chương trình nhập 1 ký tự là chữ cái in hoa từ bàn phím, in ra màn hình ký tự
in thường tương ứng.
Gợi ý: kí tự thường cách ký tự hoa 1 giá trị là 20h, nên việc đổi từ hoa sang thường
được thực hiện bằng cách cộng thêm 1 lượng 20h và đổi từ thường sang hoa bằng
cách trừ đi một lượng 20h vào mã ASCII của nó qua 2 lệnh sau:
ADD DL,20h ; Với DL chứa mã ASCII của ký tự cần đổi sang chữ thường
SUB DL,20h ; Với DL chứa mã ASCII của ký tự cần đổi sang chữ hoa
2. Viết chương trình nhập 1 ký tự là chữ cái in thường từ bàn phím, in ra màn hình ký
tự in hoa tương ứng.
3. Viết chương trình in ra màn hình các thông tin về sinh viên như sau, mỗi thông tin
in trên 1 dòng. Khi in xong một dòng, phải đợi người dùng nhấn phím ENTER rồi
mới in dòng tiếp theo.
Truong:….
Lop:….
Ho va ten: …..
24
Bài 5: Nhóm lệnh chuyển dữ liệu
Bài tập thực hành:
1. Nhập đoạn chương trình sau bằng chương trình debug, thực thi từng bước
bằng lệnh T, cho biết kết quả các thanh ghi sau khi thực hiện xong chương trình
MOV AX, 05ABh
MOV BX, 1
XCHG BH, BL
MOV CX, BX
XCHG AL, CL
Chú ý trong debug, mặc định là số hệ 16 nên giá trị hằng ở hệ 16 không cần
thêm ‘h’ vào cuối.
2. Nhập đoạn chương trình sau bằng chương trình debug, thực thi từng bước
bằng lệnh T, cho biết kết quả các thanh ghi sau khi thực hiện xong chương
trình. Nhận xét tác động của lệnh PUSH và POP lên thanh ghi SP.
MOV AX, 05A0h
PUSH AX
XCHG AH, AL
PUSH AX
POP BX
POP CX
3. Nhập đoạn chương trình trong Debug hoán đổi nội dung hai vùng nhớ gồm 5
byte. Vùng nhớ thứ nhất ở địa chỉ DS:100h, vùng nhớ thứ hai ở địa chỉ
DS:120h
Nhập dữ liệu cho 2 vùng nhớ để chạy thử
4. Viết chương trình hoàn chỉnh dạng COM hoặc EXE cho phép nhập một chuỗi
gồm đúng 5 ký tự. In ra màn hình chuỗi này theo thứ tự đảo ngược.
Dịch chương trình với TASM.
5. Viết chương trình hoàn chỉnh dạng COM hoặc EXE cho phép nhập một chuỗi từ
bàn phím với số lượng ký tự tùy ý không vượt quá 15. In ra màn hình chuỗi này
và cho biết số ký tự thực sự nhập ở dạng số Hex.
Dịch chương trình với TASM.
25
Bài 6: Nhóm lệnh chuyển điều khiển
Bài tập thực hành:
1. Thử nghiệm lệnh CMP left,right tác động lên các bit cờ ZF, CF, SF như
thế nào trong 2 trường hợp và điền vào các ô trống trong bảng tương ứng:
a. So sánh số không dấu
Điều kiện ZF CF
left > right
left = right
left < right
Hướng dẫn: Thử so sánh với các cặp (5,4), (5,5) , (5,6)
Gán trước giá trị của AL giá trị bất kỳ (ví dụ là 5)
MOV AL,5
Lần lượt thử nghiệm với các lệnh:
CMP AL,4
CMP AL,5
CMP AL,6
b. So sánh số có dấu
Điều kiện ZF CF SF
left > right
left = right
left < right
Thử so sánh với các cặp (5,-4) (-5,-5) , (-5,5), (-5,-4) , (-5,-6)
2. Viết chương trình chương trình nhập vào một ký tự, cho biết ký tự này là chữ
hoa, chữ thường hay không là chữ cái.
26
3. Viết chương trình nhập từ bàn phím một ký tự số chỉ thứ (2,3,4,5,6,7,C). In ra
màn hình tên ngày bằng chữ tương ứng (Monday, Tuesday, Wednesday,
Thurday, Friday, Saturday, Sunday)
4. Nhập một chuỗi từ bàn phím, in ra chuỗi này 20 lần liên tiếp nhau trên màn
hình.
5. Viết chương trình nhập vào một chuỗi các ký tự, in ra màn hình chuỗi mới với
các ký tự thường đổi thành các ký tự hoa.
6. Viết chương trình nhập vào một chuỗi các ký tự, in ra màn hình chuỗi này theo
thứ tự đảo ngược.
7. Viết chương trình nhập vào một chuỗi các ký tự, in ra màn hình chuỗi này đã
loại bỏ các khoảng trắng.
8. Viết chương trình nhập vào một chuỗi các ký tự, in ra màn hình chuỗi này đã
loại bỏ các khoảng trắng.
9. Viết chương trình nhập vào một chuỗi các ký tự, in ra màn hình chuỗi này với
các khoảng trắng liền nhau được thay bằng 1 khoảng trắng duy nhất.
10. Viết chương trình con lower đổi chữ hoa sang chữ thường, với AL chứa mã
ASCII của ký tự cần chuyển, kết quả chuyển vào AL.
27
Bài 7: Nhóm lệnh tính toán số học và luận lý
Bài tập thực hành:
1. Viết chương trình nhập vào một ký tự, in ra mã asscii của nó dưới dạng thập
phân
2. Viết chương trình nhập vào một ký tự, in ra mã asscii của nó dưới dạng thập
lục phân
3. Viết chương trình nhập vào một giá trị nguyên không dấu nhỏ hơn 255. In ra
màn hình ký tự có mã ASCII này.
4. Viết chương trình nhập vào một giá trị hex 8bit. In ra màn hình ký tự có mã
ASCII này.
5. Viết chương trình con hiển thị một số word (16bit) ra màn hình dưới dạng thập
phân
6. Viết chương trình con hiển thị một số word (16bit) ra màn hình dưới dạng thập
lục phân
7. Viết chương trình nhập số số nguyên (0..65535) từ bàn phím và in số nguyên
này ra màn hình dưới dạng thập lục phân
8. Viết chương trình nhập vào 1 chuỗi nhị phân gồm tối đa 16 chữ số 0 và 1. In ra
giá trị số nhị phân này dưới dạng:
a. Số thập phân không dấu
b. Số thập phân có dấu
9. Viết chương trình nhập vào 2 số thập phân 16 bit không dấu, tính và in ra màn
hình USCLN của 2 số này.