(Gợi ý, dùng lệnh F để điền nội dung lên vùng nhớ trước).[r]
(1)1 THỰC HÀNH LẬP TRÌNH HỢP NGỮ
(2)2 Bài 1: Giới thiệu công cụ debug
Debug công cụ gỡ rối, cho phép nạp file chương trình thực thi bước, xem sửa nội dung vùng nhớ, ghi, sector đĩa, nhập đoạn chương trình mã gợi nhớ hay mã máy vào vị trí nhớ
1.1 Khởi động cơng cụ debug
Cơng cụ Debug.EXE có sẵn hệđiều hành Microsoft MS-DOS, Windows 9x, 2000, XP, Vista Tùy thuộc vào hệđiều hành mà file Debug.EXE nằm vị trí đường dẫn khác Trên hệđiều hành Windows khởi động cơng cụ cách gõ vào
Debug.EXE vào hộp TextBox Run (hoặc “Start Search” với Windows Vista)
Khởi động Debug từ Windows XP và Vista
Sau khởi động Debug, cửa sổ giao diện có dạng sau:
1.2 Cấu trúc dạng tham số của lệnh debug
Debug công cụ sử dụng chếđộ dòng lệnh, người sử dụng gõ lệnh từ dấu nhắc trỏ xem kết sau thực thi lệnh hình Danh sách lệnh mà công cụ hỗ trợ:
Lệnh Ý nghĩa
(3)3
C range address compare - so sánh vùng nhớ
D [range] dump - in nội dung vùng nhớ hình E address [list] enter - nhập nội dung vùng nhớ
F range list fill - điền nội dung vùng nhớ
G [=address] [addresses] go - thực thi đoạn chương trình H value1 value2 hex - tính tổng tích hai số hệ 16 I port input - nhập giá trị từ cổng L [address] [drive]
[firstsector] [number]
load – nạp nội dung file sector M range address move – chép vùng nhớ
N [pathname] name – đặt tên cho file đọc/ghi O port byte output – xuất liệu cổng
P [=address] [number] proceed – thực thi lệnh Q quit – chương trình debug R [register] register – thao tác ghi S range list search – tìm kiếm nhớ
T [=address] [number] trace – thực thi lệnh
U [range] unassemble – xem nội dung vùng nhớ
dạng lệnh gợi nhớ
W [address] [drive] [firstsector] [number]
write – ghi nội dung vùng nhớ lên file sector
Lưu ý: Tham sốở cặp dấu [ ] tùy chọn có khơng, tham số khơng có dấu [ ] bắt buộc phải có
1.3 Các thao tác cơ bản với công cụ debug: 1.3.1 Xem sửa nội dung ghi (lệnh R)
Cú pháp: R [register]
Ý nghĩa: Với tham sốregister tên ghi (AX, BX, CX, DX, CS, DS, …), lệnh hiển thị giá trị 16 bit ghi hình dấu nhắc để nhập giá trị cho ghi vào Nếu không muốn thay đổi gõ Enter để giữ ngun giá trị cũ
Nếu khơng có tham sốregister nội dung tất ghi sẽđược hiển thị
Ví dụ:
Hiển thị nội dung ghi AX sửa thành giá trị 00FF :
-R AX AX 1065 :00FF
Kiểm tra lại nội dung AX:
-R AX AX 00FF :
-
(4)4 Các ghi đa dụng: AX,BX,CX,DX
Các ghi đoạn: CS, DS, ES, SS
Các ghi trỏ số: SI, DI, SP, BP Thanh ghi trỏ chương trình: IP
Thanh ghi trạng thái hiển thị dạng cờ sau:
Bit 15 14 13 12 11 10
OF DF IF TF SF ZF AF PF CF
FLAGS FLAGS FLAGS
FLAGS SET (a 1-bit) CLEARed (a 0-bit)
Overflow (OF) OV NV [No Overflow]
Direction (DF) DN (decrement) UP (increment) Interrupt (IF) EI (enabled) DI (disabled) Sign (SF) NG (negative) PL (positive) Zero (ZF) ZR [zero] NZ [ Not zero] Auxiliary Carry (AF) AC NA [ No AC ] Parity (PF) PE (even) PO (odd) Carry (CF) CY [Carry] NC [ No Carry] Ví dụ thay đổi giá trị cờ DF thành DN giá trị cờ SF thành NG:
-r F
NV UP EI PL NZ NA PO NC -DN NG
Xem lại thay đổi chưa:
-r F
NV DN EI NG NZ NA PO NC -
1.3.2 Xem nội dung vùng nhớ (lệnh D)
Cú pháp: D [range]
Ý nghĩa: Hiển thị nội dung vùng nhớ xác định range
Ví dụ:
Hiển thị vùng nhớ từ C010:0000 đến C010:0050
-d c010:0000 0050
C010:0000 14 07 00 02 0C 64 1B 14-07 00 04 30 64 1C 14 07 .d 0d C010:0010 00 00 03 64 1C 14 07 00-02 0C 64 1C 14 07 00 04 .d d C010:0020 30 24 1C 14 07 00 06 C0-24 1D 14 07 00 00 03 64 0$ $ d C010:0030 1D 14 07 00 02 0C D6 09-80 90 20 E0 1D 10 08 60 ` C010:0040 22 00 00 00 00 08 08 18-4E 0C 80 C8 20 E0 14 10 " N C010:0050 10
(5)5 Hiển thị vùng nhớ 24 (18h) byte C000:0010
-d C000:0010 L 18
C000:0010 30 30 1C 22 E9 35 21 9D-40 00 E0 0A 30 30 49 42 00.".5!.@ 00IB C000:0020 4D 20 56 47 41 20 43 6F M VGA Co
Hiển thị vùng nhớ từ DS:0150 đến DS:0180
-r
AX=01FF BX=1008 CX=0507 DX=0516 SP=FFEE BP=0000 SI=0000 DI=0000 DS=17E1 ES=17E1 SS=17E1 CS=17E1 IP=0105 NV DN EI NG NZ NA PO NC
17E1:0105 0000 ADD [BX+SI],AL DS:1008=00 -d 150 180
17E1:0150 48 65 6C 6C 6F 20 41 73-73 65 6D 62 6C 79 21 00 Hello Assembly! 17E1:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:0180 00
Hiển thị vùng nhớ 128 byte địa DS:0150
-d 150
17E1:0150 48 65 6C 6C 6F 20 41 73-73 65 6D 62 6C 79 21 00 Hello Assembly! 17E1:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:0180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:0190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:01A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:01B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 17E1:01C0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
Lệnh d khơng có tham số: hiển thị 128 byte lần hiển thị trước
-d C700:0000 18
C700:0000 33 C9 B6 A0 E8 59 F7 B8-02 01 9D 75 02 33 C0 89 Y u.3 C700:0010 46 16 C7 46 12 00 02 B4-00 F F
-d
C700:0010 66 5A 5B C3 53 51 66 fZ[.SQf C700:0020 52 B7 A0 B9 80 00 66 81-E2 FF FF 00 00 E8 6D 00 R f m C700:0030 72 02 EB 04 B4 00 EB 02-B4 01 66 5A 59 5B C3 01 r fZY[ C700:0040 10 04 40 08 80 02 20 50-51 52 56 83 F9 00 74 0B @ PQRV t C700:0050 B2 08 83 F9 02 74 1B 8A-D5 EB 17 E8 3C B8 8A E5 .t < C700:0060 B9 08 00 BE 3F 70 2E AC-84 E0 E1 FA B2 01 E3 02 ?p C700:0070 8A D0 E8 05 00 5E 5A 59-58 C3 52 56 2E F6 06 1A .^ZYX.RV C700:0080 0C 01 74 0C 80 FA 01 75-07 2E 8A 1E 41 0C EB 09 t u A C700:0090 E8 CA EA 72 05 2E 8A 5C-13 .r \
Bài tập: Hiển thị ngày tháng BIOS hình debug biết thông tin chứa byte vùng nhớ bắt đầu ởđịa FFFF:0005
1.3.3 Tìm kiếm nội dung vùng nhớ (lệnh S)
Cú pháp: S range list
Ý nghĩa: Tìm kiếm vùng nhớrange chuỗi byte cung cấp tham sốlist
Tham sốlist danh sách giá trị byte chuỗi ký tự bao đóng dấu nháy đơn kép
Ví dụ:
(6)8
-m 0b17:500 507 0b17:0530 -d 0b17:500
0B17:0500 41 73 73 65 6D 62 6C 79-00 00 00 00 00 00 00 00 Assembly 0B17:0510 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0520 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0530 41 73 73 65 6D 62 6C 79-00 00 00 00 00 00 00 00 Assembly 0B17:0540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1.3.7 So sánh hai vùng nhớ (lệnh C)
Cú pháp: C range address
Ý nghĩa: So sánh nội dung vùng nhớrange vùng nhớ bắt đầu ởđịa chỉaddress
Ví dụ:
So sánh hai vùng nhớ byte địa 0B17:500 0B17:530
-C 0b17:500 507 0b17:530 0B17:0502 73 01 0B17:0532 -d 0b17:500
0B17:0500 41 73 73 65 6D 62 6C 79-00 00 00 00 00 00 00 00 Assembly 0B17:0510 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0520 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0530 41 73 01 65 6D 62 6C 79-00 00 00 00 00 00 00 00 As.embly 0B17:0540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1.3.8 Các thao tác đọc ghi file (lệnh N, L, W)
Cú pháp: N [pathname]
Ý nghĩa: Khai báo tên file muốn đọc ghi
Cú pháp: L [address] [drive]
Ý nghĩa: Nạp file/ ổđĩa lên nhớ, sau nạp, giá trị 32bit chứa cặp ghi [BX|CX] cho biết kích thước file
Cú pháp: W [address] [drive]
Ý nghĩa: Ghi vùng nhớ vào file Lưu ý, số byte cần ghi giá trị 32bit chứa sẳn cặp ghi [BX|CX]
Chú ý: Không nên sử dụng lệnh W tùy tiện mà khơng biết tác động của như thế có thể tạo file không mong muốn hoặc hư hỏng dữ liệu đĩa
Ví dụ: Giả sử có file Text C:\aaa.txt có nội dung lớn 30 ký tự.Đọc file text aaa.txt lên vùng nhớ 0B17:0200 sửa ký tựđầu tiên thành ‘*’ ghi lại với tên file bbb.txt với nội dung 20 ký tựđầu tiên file aaa.txt
Khai báo tên file C:\aaa.txt :
-N C:\aaa.txt
Nạp file lên vị trí 0B17:0200 :
-L 0B17:0200
Xem lại nội dung file nạp 0B17:0200 :
-D 0b17:0200
(7)9
0B17:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
Xem kích thước file cặp ghi [BX|CX] :
-R
AX=0000 BX=0000 CX=001A DX=0516 SP=FFEE BP=0000 SI=0000 DI=0000 DS=17E1 ES=17E1 SS=17E1 CS=17E1 IP=0105 NV DN EI NG NZ NA PO NC
17E1:0105 0000 ADD [BX+SI],AL DS:0000=CD
Sửa ký tự :
-E 0B17:0200 '*'
Xem lại :
-D 0b17:0200
0B17:0200 2A 65 73 74 0D 0A 31 32-33 0D 0A 48 65 6C 6C 6F *est 123 Hello 0B17:0210 0D 0A 41 73 73 65 6D 62-6C 79 00 00 00 00 00 00 Assembly 0B17:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0B17:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
Khai báo tên file C:\bbb.txt :
-N C:\bbb.txt
Khai báo kích thước file ghi 14h (20byte) :
-R BX BX 0000 :
-R CX CX 001A :14
Ghi nội dung vùng nhớ bắt đầu địa 0B17:0200 :
-W 0B17:0200
Writing 00014 bytes -