Để minh hoạ cho phần này ta sẽ sử dụng chương trình Vidu1.ASM, đây là chương trình hiển thị lời chào "HELLO!" trên màn hình.
Chương trình nguồn Vidu1.ASM:
TITLE Vidu1 .MODEL SMALL .STACK 100H .DATA MSG DB 'HELLO!$' .CODE MAIN PROC
MOV AX, @DATA
MOV DS, AX ; khởi tạo DS LEA DX, MSG ; lấy thông báo MOV AH, 09 ; hàm hiển thị
INT 21H ; hiển thị thông báo
MOV AH, 4CH
INT 21H ; trở về DOS
MAIN ENDP
Sau khi dịch sang file EXE ta sẽ thi hành chương trình trong môi trường DEBUG bằng cách gõ lệnh sau ở cửa sổ Run:
DEBUG C:\ASM\Vidu1.exe
(giả sử file Vidu1.exe được cất trong thư mục ASM trên ổđĩa C)
Cửa sổ DEBUG xuất hiện với dấu nhắc lệnh "-". Để xem các thanh ghi chúng ta gõ lệnh: R.
Màn hình trình bày nội dung của các thanh ghi dưới dạng hex. Tại dòng thứ 3 chứa địa chỉ segment:offset của lệnh đầu tiên trong chương trình kèm theo nó là lệnh ở dạng mã máy và dạng hợp ngữ. Các cặp chữ ở cuối dòng thứ 2 là trạng thái hiện thời của các cờ (bao gồm cả cờ trạng thái và cờ điều khiển). Dưới đây là các ký hiệu được sử dụng trong DEBUG để hiển thị trạng thái của các cờ: Cờ Ký hiệu xoá (0) Ký hiệu thiết lập (1) Cờ tràn (overfow Flag) NV OV Cờđịnh hướng (Direction Flag) UP DN Cờ ngắt (Interrupt Flag) DI EI
Cờ dấu (sign Flag) PL NG
Cờ Zero (Zero Flag) NZ ZR
Cờ nhớ phụ (Auxiliary Flag) NA AC Cờ chẵn lẻ (Parity Flag) PO PE Cờ nhớ (Carry Flag) NC CY
Đểđổi nội dung của một thanh ghi - ví dụ DX với 1ABCh chúng ta gõ lệnh: R DX
DEBUG đáp lại bằng việc hiển thị nội dung hiện thời của DX, sau dó nó hiển thị dấu 2 chấm và đợi chúng ta đánh vào nội dung mới của DX. Chúng ta đánh vào 1ABC và đánh phím ENTER (DEBUG ngầm định rằng tất cả các số người sử dụng đánh vào đều biểu diễn dưới dạng hex nên ở đây không cần phải đánh thêm chữ "h"). Để giữ nguyên nội dung của DX chúng ta chỉ việc đánh ENTER ngay sau dấu hai chấm. Để kiểm chứng lại việc thay đổi chúng ta có thể hiển thị lại một lần nữa nội dung của các thanh ghi.
Ta dùng lệnh T để lần lượt thực hiện các lệnh tiếp theo trong chương trình:
Nếu bây giờ chúng ta lại đánh T lần nữa thì DEBUG sẽ tiến hành từng lệnh trong thường trình phục vụ ngắt 21h mà đó là điều chúng ta không mong muốn.
Từ lần hiển thị thanh ghi cuối cùng chúng ta thấy rằng INT 21h là một lệnh 2 byte. Do giá trị hiện nay của IP là 000Bh, lệnh tiếp theo nằm tại địa chỉ 000Dh, và chúng ta có thể tạo điểm ngắt tại đó: Hàm 09 của ngắt 21h hiển thị "HELLO!" và việc thực hiện dừng lại ở điểm gẫy 000Dh. Để kết thúc việc thực hiện chương trình chúng ta chỉ việc đánh 'G': -G
Program terminate normally
Dòng nhắc này thông báo cho ta biết rằng chương trình đã hoàn thành. Chương trình phải được nạp để có thể chạy lại do đó chúng ta hãy thoát khỏi DEBUG.
-Q
Để thử lệch U hãy quay lại DEBUG và dùng nó để liệt kê chương trình của chúng ta: (Gõ DEBUG C:\ASM\Vidu1.exe trong cửa sổ Run)
DEBUG đã dịch ngược khoảng 32 bytes; nó đã dịch nội dung của các byte này như là các lệnh. Chương trình kết thúc tại 000Fh và phần còn lại là các ký tự đi kèm theo mã assemby do chương trình dịch DEBUG tạo ra. Để hiển thị chương trình đánh:
- U 0000 000F ( hoặc viết gọn là U 0 F)
Trong phần liệt kê chưa biên dịch DEBUG thay thế những tên bằng các địa chỉ segment và offset được gán cho những tên đó. Chẳng hạn thay vì lệnh MOV AX, @DATA chúng ta có MOV AX, 13B4, lệnh LEA DX, MSG trở thành LEA DX, [0002] vì 0002h chính là offset gán cho MSG trong đoạn dữ liệu DATA.
Để biểu diễn lệnh D chúng ta hãy liệt kê nội dung vùng nhớ có chứa lời chào "HELLO!". Trước tiên chúng ta thực hiện 2 lệnh khởi tạo DS:
Bây giờ chúng ta hãy hiển thị nội dung của bộ nhớ bắt đầu từ DS:0000 -D 0
DEBUG hiển thị 128 byte bộ nhớ. Nội dung của mỗi ô nhớ được biểu diễn bằng 2 chữ số hex. Chẳng hạn nội dung hiện thời của ô nhớ 0002h là 48h. Dọc theo hàng thứ nhất chúng ta thấy nội dung của các byte từ 0 đến 7, dấu gạch ngang rồi đến nội dung của các byte từ 8 đến 0Fh. Nội dung của các byte từ 10 đến 1Fh được trình bày ở dòng thứ 2 và cứ như vậy. Phần bên phải của hiển thị là nội dung của ô nhớ được dịch thành các ký tự (các ký tự không in ra được thì đánh dấu bằng một chấm).
Để hiển thị chỉ riêng lời chào "HELLO!" chúng ta đánh: -D 0002 0008
(xem hình bên dưới)
Trước khi tiếp tục chúng ta hãy chú ý đến một đặc trưng của nội dung bộ nhớ. Chúng ta thường viết nội dung của một word theo trình từ byte cao rồi đến byte thấp. Thế nhưng DEBUG lại hiển thị nội dung của ô nhớ theo trình tự byte thấp rồi đến byte cao, chẳng hạn word tại địa chỉ DS:0002 có nội dung là 4548h nhưng DEBUG hiển thị nó thành 48 45. Điều này có thể gây ra nhầm lẫn khi chúng dịch nội dung của ô nhớ như các từ.
Bây giờ hãy đổi thông báo "HELLO!" thành "GOODBYE!" bằng lệnh E: -E 0002 'GOODBYE!$'
Để kiểm chứng lại sự thay đổi chúng ta hãy hiển thị nội dung bộ nhớ: -D 0000 000F
Dùng lệnh G để chạy thử chương trình xem kết quả có thay đổi gì không: -G
Như vậy kết quả của chương trình đã bị thay đổi do có sự tác động trực tiếp vào nội dung của đoạn dữ liệu DATA.
PHỤ LỤC 2: BẢNG MÃ ASCII
Mã ASCII (American Standard Code for Information Interchange) dùng 8 bít để biểu diễn 1 kí tự. Tuy nhiên trên thực tế chỉ dùng 7 bít cuối (còn bít Msb luôn bằng 0). Do đó số lượng kí tự trong bảng là 27=128.
Dec Hex Char Dec Hex Char Dec Hex Char Dec Hex Char
0 00 NUL 32 20 SP 64 40 @ 96 60 ` 1 01 SOH 33 21 ! 65 41 A 97 61 a 2 02 STX 34 22 " 66 42 B 98 62 b 3 03 ETX 35 23 # 67 43 C 99 63 c 4 04 EOT 36 24 $ 68 44 D 100 64 d 5 05 ENQ 37 25 % 69 45 E 101 65 e 6 06 ACK 38 26 & 70 46 F 102 66 f 7 07 BEL 39 27 ' 71 47 G 103 67 g 8 08 BS 40 28 ( 72 48 H 104 68 h 9 09 HT 41 29 ) 73 49 I 105 69 i 10 0A LF 42 2A * 74 4A J 106 6A j 11 0B VT 43 2B + 75 4B K 107 6B k 12 0C FF 44 2C , 76 4C L 108 6C l 13 0D CR 45 2D - 77 4D M 109 6D m 14 0E SO 46 2E . 78 4E N 110 6E n 15 0F SI 47 2F / 79 4F O 111 6F o 16 10 DLE 48 30 0 80 50 P 112 70 p 17 11 DC1 49 31 1 81 51 Q 113 71 q 18 12 DC2 50 32 2 82 52 R 114 72 r 19 13 DC3 51 33 3 83 53 S 115 73 s 20 14 DC4 52 34 4 84 54 T 116 74 t 21 15 NAK 53 35 5 85 55 U 117 75 u 22 16 SYN 54 36 6 86 56 V 118 76 v 23 17 ETB 55 37 7 87 57 W 119 77 w 24 18 CAN 56 38 8 88 58 X 120 78 x 25 19 EM 57 39 9 89 59 Y 121 79 y 26 1A SUB 58 3A : 90 5A Z 122 7A z 27 1B ESC 59 3B ; 91 5B [ 123 7B { 28 1C FS 60 3C < 92 5C \ 124 7C | 29 1D GS 61 3D = 93 5D ] 125 7D } 30 1E RS 62 3E > 94 5E ^ 126 7E ~ 31 1F US 63 3F ? 95 5F _ 127 7F DEL Khi sử dụng nốt bít còn lại để biểu diễn kí tự (Msb = 1) ta sẽ có thêm 128 kí tự nữa, gọi là bẳng mã ASCII mở rộng (không trình bày ở đây).
TÀI LIỆU THAM KHẢO
[1] Ytha Yu & Charles Marut - Ngôn ngữ lập trình Assembly và máy vi tính IBM-PC - Nhà xuất bản Giáo dục 1996.
[2] Văn Thế Minh - Kỹ thuật vi xử lí – Nhà xuất bản Giáo dục 1997.
[3] Micheal Tischer - Cẩm nang lập trình hệ thống – Nhà xuất bản giáo dục 1996. [4] Computer Architecture - Genetic Computer School 2003.
THÔNG TIN TÁC GIẢ
• Họ tên: Phạm Thanh Bình
• Năm sinh: 1976
• Cơ quan: Bộ môn Kỹ thuật máy tính và mạng – Khoa Công nghệ thông tin - Đại học Thuỷ Lợi
• Địa chỉ:175 –Tây Sơn -Đống Đa –Hà Nội
• Ảnh:
Phạm vi và đối tượng sử dụng:
• Ngành: Công nghệ thông tin
• Trường: Đại học Thuỷ Lợi
• Từ khoá tra cứu: Hợp ngữ, Assembly, vi xử lý, nhị phân, bộ nhớ, bus, thanh ghi, ngắt, ngăn xếp, debug.
• Yêu cầu kiến thức: sinh viên đã được học các môn Tin học đại cương, Mạch điện tử số.