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 <đường dẫn đến các file TASM.EXE, TLINK.EXE> ↵ 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. . 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. 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: . 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