Thực hành Vi xử lý

pdf 42 trang phuongnguyen 7440
Bạn đang xem 20 trang mẫu của tài liệu "Thực hành Vi xử lý", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfthuc_hanh_vi_xu_ly.pdf

Nội dung text: Thực hành Vi xử lý

  1. Thực tập Vi xử lý - 1 PHẦN LÝ THUYẾT : CHƯƠNG TRÌNH GỠ RỐI DEBUG I. Sử dụng chương trình Debug để làm gì ? Chương trình Debug là công cụ đắc lực dùng để trợ giúp cho người học về hợp ngữ. Ta có thể xem nội dung bộ nhớ thật dễ dàng và nhanh chóng, hoặc tham khảo nội dung các thanh ghi khi chúng thay đổi. Debug cũng được dùng để chạy từng bước một chương trình hợp ngữ để kiểm tra hoặc tìm ra các lỗi của giải thuật. Đối với người mới học qua hợp ngữ, Debug giúp họ có được sự tự tin ở lần đầu viết và dịch chương trình trước khi mạnh dạng chạy chương trình từ hệ điều hành. Các tính năng của chương trình Debug là : . Dịch được một chương trình ngắn. . Xem nội dung một chương trình ở dạng mã máy hoặc hợp ngữ. . Xem các thanh ghi và cờ của CPU. . Chạy từng bước, chạy một đoạn chương trình hoặc chạy toàn bộ chương trình. . Xem được sự thay đổi nội dung của các biến. . Đưa trị mới vào một ô nhớ có địa chỉ bất kỳ. . Dò tìm trị ở dạng nhị phân hoặc dạng ASCII trong bộ nhớ . Chuyển một khối dữ liệu từ chỗ này sang chỗ khác trong bộ nhớ. . Lấp đầy trị vào một vùng bộ nhớ. . Nạp và cất tập tin trên đĩa. . Xuất nhập trực tiếp với cổng. II. Dạng lệnh của Debug : Debug là một tập tin chương trình của hệ điều hành MS-DOS vì vậy bạn có thể chạy nó từ hệ điều hành một cách đơn giản là đánh như sau : A>debug [[ :][ ] [ ]]↵ Dấu nhắc của Debug là dấu gạch nối (-). Lệnh có thể đánh theo dạng chữ in hay chữ thường. Một lệnh có thể theo sau bởi một hay nhiều thông số. Dấu phẩy hoặc khoảng trắng được dùng để ngăn cách các thông số. Các thông số thường dùng như sau : Dạng lệnh : trong đó là một chữ (A,C,D, ) còn thay đổi tùy theo lệnh. Các thông số gồm có : Địa chỉ Là một bộ địa chỉ đầy đủ gồm segment:offset hay chỉ cần offset là đủ. Segment có thể dùng tên thanh ghi segment. Ví dụ : F000:100 DS:200 0AF5
  2. Thực tập Vi xử lý - 2 Tập tin Là một tham khảo tập tin đầy đủ, ít nhất phải có tên tập tin. Ví dụ : C:\masm\progs\test file1 b:test.com Danh sách Là một hay nhiều trị byte hay chuỗi, cách nhau bằng dấu phẩy. Ví dụ : 10,20,21,52 'a','B',87 Khoảng Là tham khảo đến một vùng bộ nhớ, được định nghĩa bởi địa chỉ theo một trong hai cách sau : ♣Cách 1 : địa chỉ [,địa chỉ ] Ví dụ : 100,500 CS:200,300 200 ♣Cách 2 : địa chỉ L [trị] Ví dụ : 100 L 20 (tham khảo 20h byte bắt đầu từ vị trí 100h) Trị Là số hệ 16 có tối đa 4 chữ số VÈ dÖ : 3A 5d0e Các lệnh của Debug : A Dịch một chương trình ra mã máy. Cách gọi như sau : A [ ] Ví dụ : -a 100 Dịch ở địa chỉ CS:100h -a Dịch ở địa chỉ hiện tại theo CS -A DS:2000 Dịch ở địa chỉ DS:2000h Bạn phải nhập lệnh vào theo từng dòng một và kết thúc bằng ENTER. Debug sẽ nhắc bạn ở đầu mỗi dòng mới bằng địa chỉ segment:offset của ô nhớ hiện tại. Để kết thúc nhập, bạn đánh ENTER ở dòng trống. Ví dụ : -a 100 5514:0100 mov ah,2 5514:0102 mov dl,41 5514:0104 int 21 5514:0100 - (Chữ nghiêng đậm là do bạn đánh vào.)
  3. Thực tập Vi xử lý - 3 C So sánh 2 vùng bộ nhớ và liệt kê các ô nhớ có nội dung khác nhau. Cách gọi như sau : C , Ví dụ : -C 100,200,3000:1000 là so sánh ô nhớ DS:100h với ô nhớ 3000h:1000h, ô nhớ DS:101h với ô nhớ 3000h:1001h, , cho đến ô nhớ DS:200h với ô nhớ 3000h:1100h. So sánh 101h byte. -C CS:100 L 10 2000:1000 là so sánh ô nhớ CS:100h với ô nhớ 2000h:1000h, ô nhớ CS:101h với ô nhớ 2000h:1001h, , cho đến ô nhớ CS:10Fh với ô nhớ 3000h:100Fh. So sánh 10h byte. D Hiện nội dung bộ nhớ theo dạng số hệ 16 và ASCII nếu có thể. Cách gọi như sau : D [ ] Ví dụ : -D F000:0 -D ES:100 -D 100 Segment hiểu ngầm là DS. Dạng trình bày trên màn hình như sau : -d100 0B4E:0100 0F 00 B9 8A FF F3 AE 47-61 03 1F 8B C3 48 12 B1 Ga H 0B4E:0110 04 8B C6 54 68 69 73 20-69 73 20 61 6E 20 65 78 This is an ex 0B4E:0120 61 6D 70 6C 65 20 66 6F-72 20 44 55 4D 50 20 63 ample for DUMP c 0B4E:0130 6F 6D 6D 61 6E 64 20 6F-66 20 44 65 62 75 67 20 ommand of Debug 0B4E:0140 70 72 6F 67 72 61 6D 2E-F3 AA A0 0A EB 06 3C B2 program Dùng để đưa dữ liệu byte vào bộ nhớ ngay tại địa chỉ mong muốn. Cách gọi như sau : E [ ] Trị nhập vào theo dạng số hệ 16, từng byte một. Dấu trừ (-) dùng để lui lại một địa chỉ. SPACE BAR dùng để tới một địa chỉ. ENTER để kết thúc. Nếu có dùng danhsách thì Debug sẽ đưa cả danhsách vào bộ nhớ bắt đầu từ địa chỉ chỉ định. Ví dụ : -E 106 -E CS:200 "Đây là chuỗi." -E 300 10,af,3d F Lấp đầy trị vào một vùng bộ nhớ. Cách gọi như sau : F Các trị được liệt kê trong danh sách sẽ được đưa vào vùng bộ nhớ xác định bởi khoảng. Nếu trị trong danh sách ít hơn vùng bộ nhớ chỉ định thì Debug sẽ lấy trị lặp lại từ đầu danh sách. Nếu trị trong danh sách nhiều hơn vùng bộ nhớ chỉ định thì Debug sẽ bỏ bớt phần dư. Ví dụ : -F ES:200 L 300 'Anh' -F 100 400 10,2B,5C,45
  4. Thực tập Vi xử lý - 4 G Chạy chương trình. Cách gọi như sau : G [= ] [ [ ]] Chương trình được chạy từ địa chỉ 1 hoặc từ địa chỉ hiện tại (nếu không có địa chỉ 1) cho đến địa chỉ 2 hoặc địa chỉ 3. Địa chỉ 2 và địa chỉ 3 được gọi là các điểm dừng chương trình. Ví dụ : -G =100 108 123 chạy từ CS:100 cho đến CS:108 hoặc CS:123 -G 500 chạy từ CS:IP cho đến CS:500. H Thực hiện phép cộng và trừ trong hệ 16. Cách gọi như sau : H Hiện ra tổng và hiệu của trị1 và trị2. Ví dụ : -H 1A 10 002A 000A I Nhập một byte từ cổng xuất nhập và hiện ra màn hình. Cách gọi như sau : I địa chỉ cổng là số hệ 16 tối đa 4 chữ số. Ví dụ : -I 37E EC L Nạp tập tin hoặc nạp sector luận lý từ đĩa vào bộ nhớ. Cách gọi như sau : L [ ] ♣Dạng 1 : Nếu chỉ có duy nhất địa chỉ, dùng để nạp tập tin. Tên tập tin phải được gán trước bằng lệnh Name của debug. Tập tin có thuộc tính .COM luôn luôn được nạp vào địa chỉ offset 100h. ♣Dạng 2 : Nếu có đầy đủ các thông số, dùng để đọc sector luận lý trên đĩa vào bộ nhớ đĩa : = 0 : ì A; =1 : ì B; = 2 : ì C; sector : là số sector luận lý bắt đầu (từ 0 trở đi) số : số lượng sector cần đọc vào Ví dụ : -L 1000 đọc tập tin -L 1000 0 0 1 đọc 1 sector thứ tự 0 từ đĩa A.
  5. Thực tập Vi xử lý - 5 M Chép nội dung một vùng bộ nhớ đến địa chỉ khác. Cách gọi như sau : M Ví dụ : -M 100 105 200 chép 5 byte từ DS:100 đến DS:200. -M CS:100 L 50 ES:300 chép 50 byte từ CS:100 đến ES:300. N Khai báo tên tập tin trên đĩa để đọc vào hoặc ghi lên. Cách gọi như sau : N [ ] tên tập tin có thể có tên ổ đĩa, tên thư mục. Ví dụ : -N C:\DOS\DEBUG.EXE -N THU -s8 O Xuất một byte ra cổng xuất nhập. Cách gọi như sau : O Ví dụ : -O 378 5e P Chạy từng bước chương trình. Cách gọi như sau : P [= ] [ ] Khi chạy từng bước bằng lệnh P, các lệnh gọi chương trình con hoặc lặp vòng được xem như một lệnh duy nhất. Sau mỗi lần chạy, Debug sẽ hiện ra nội dung các thanh ghi. Q Thoát khỏi chương trình Debug và trở về Hệ điều hành. Cách gọi như sau : Q R Xem hoặc sửa nội dung thanh ghi. Cách gọi như sau : R [ ] Nếu không có tên thanh ghi thì Debug hiện nội dung tất cả các thanh ghi. Dạng trình bày như sau : -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0FA5 ES=0FA5 SS=0FA5 CS=0FA5 IP=0100 NV UP EI PL NZ NA PO NC 0FA5:0100 0F DB 0F Nếu chỉ định tên thanh ghi là sửa nội dung thanh ghi. Ví dụ : -R CX CX 0000 : 1234 - S Tìm kiếm trị trong một vùng bộ nhớ. Cách gọi như sau : S Tìm kiếm các trị có trong danh sách xem có hiện diện trong vùng bộ nhớ chỉ định hay không. Nếu có thì Debug hiện các địa chỉ đầu của những nơi có chứa danh sách. Ví dụ : -S 100 L 1000 'DOS' 18AF:0154
  6. Thực tập Vi xử lý - 6 18AF:0823 -S 2000 2200 13,15,8A,8 T Chạy từng bước chương trình như lệnh P. Cách gọi như sau : T [= ] [ ] Lệnh T chạy từng bước cả các lệnh của chương trình con. Debug cũng hiện nội dung các thanh ghi sau mỗi bước chạy. U Dịch ngược từ mã máy ra mã gợi nhớ. Cách gọi như sau : U [ ] Ví dụ : -U 100 -U 1000 L 200 W Ghi một vùng bộ nhớ lên đĩa. Cách gọi như sau : W [ ] ♣Dạng 1 : Nếu chỉ có duy nhất địa chỉ, dùng để ghi một vùng bộ nhớ lên tập tin. Tên tập tin phải được khai báo trước đó bằng lệnh Name của Debug, còn số byte ghi (trị 32 bit) chứa trong thanh ghi BX-CX. Trong đó, BX chứa 16 bit cao còn CX chứa 16 bit thấp. Ví dụ : -R BX BX 0012 : 0000 -R CX CX 5A08 : 200 -n thu.cod -W 100 ♣Dạng 2 : Nếu có đầy đủ các thông số, dùng để ghi một vùng bộ nhớ trực tiếp lên đĩa. đĩa : = 0 : ì A; =1 : ì B; = 2 : ì C; sector : là số sector luận lý bắt đầu (từ 0 trở đi) số : số lượng sector cần ghi lên đĩa. Ví dụ : -W 1000 0 f 10 ghi dữ liệu ở vùng địa chỉ DS:1000 lên đĩa A, bắt đầu từ sector luận lý 15, liên tiếp 16 sectors.
  7. Thực tập Vi xử lý - 7 PHẦN THỰC HÀNH : VDeb1 Debug 1 - Thanh ghi và bộ nhð VDeb2 Debug 2 - Lệnh và chương trình VDeb3 Debug 3 - Cất và nạp tập tin VChDl Lệnh 8086 - Chuyển dữ liệu VSoHo Lệnh 8086 - Số học VLuLy Lệnh 8086 - Luận lý VCh}k Lệnh 8086 - Chuyển ₫iều khiển VChuo Lệnh 8086 - Xử lý chuỗi VHNg1 Hợp ngữ 86 - Dịch và liên kết VHNg2 Hợp ngữ 86 - Các ví dụ lập trình
  8. Thực tập Vi xử lý - 8
  9. Thực tập Vi xử lý - 9 VDeb1 Debug 1 - Thanh ghi và bộ nhð Mục đích : - Sử dụng lệnh R để xem và sửa nội dung các thanh ghi của 8086. - Sử dụng lệnh D để xem nội dung bộ nhớ. - Sử dụng lệnh E và lệnh F để sửa nội dung bộ nhớ. - Sử dụng lệnh M để chép nội dung bộ nhớ. - Sử dụng lệnh Q để kết thúc. Chuẩn bị : - Đọc trước phần lý thuyết về các lệnh của Debug. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Khởi động chương trình Debug : Từ windows chuyển ra DOS PROMPT để chạy. Cách 1 : Chọn Start - Programs - MS-DOS Prompt Cách 2 : Chọn Start - Run - đánh vào COMMAND Sau khi ra DOS, đánh vào : C>debug Lúc đó trên màn hình sẽ xuất hiện dấu nhắc của chương trình Debug như sau : C>debug - Dấu nh ắc của debug kể từ lúc này bạn có thể đánh vào các lệnh của Debug để chạy. 2. Xem nội dung thanh ghi : Mục đích : Sử dụng thành thạo lệnh R của debug để xem nội dung các thanh ghi của CPU 8086. Bước 1 : Chạy chương trình Debug. Bước 2 : từ dấu nhắc của debug đánh lệnh R -r quan sát cách trình bày màn hình của debug : vị trí, tên và nội dung các thanh ghi. Tên thanh ghi Nội dung thanh ghi -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1070 ES=1070 SS=1070 CS=1070 IP=0100 NV UP EI PL NZ NA PO NC 1070:0100 03F1 ADD SI,CX Offset Lệnh tại địa chỉ CS:IP Các cờ Segment
  10. Thực tập Vi xử lý - 10 chú ý cách thể hiện các cờ bằng chữ : OF (cờ tràn) : NV (OF=0) hoặc OV (OF=1) DF (cờ hướng) : UP (DF=0) hoặc DN (DF=1) IF (cờ ngắt) : DI (IF=0) hoặc EI (IF=1) SF (cờ dấu) : PL (SF=0) hoặc NG (SF=1) ZF (cờ zero) : NZ (ZF=0) hoặc ZR (ZF=1) AF (cờ nhớ nửa) : NA (AF=0) hoặc AC (AF=1) PF (cờ parity) : PO (PF=0) hoặc PE (PF=1) CF (cờ nhớ) : NC (CF=0) hoặc CY (CF=1) 3. Sửa nội dung thanh ghi : Mục đích : Sử dụng thành thạo lệnh R của debug để sửa nội dung các thanh ghi của CPU 8086. Bước 1 : đánh lệnh R theo sau là tên thanh ghi cần sửa nội dung là AX -r ax trên màn hình sẽ hiện ra tên thanh ghi AX cùng với nội dung đang có -r ax AX 0000 : Nội dung cũ của thanh ghi Tên thanh ghi Nội dung mới sẽ đánh vào lúc này cursor nằm sau dấu hai chấm và bạn có thể đánh trị mới vào theo dạng số hệ 16 :1234 Bước 2 : dùng lệnh R để xem lại toàn bộ nội dung các thanh ghi, chú ý quan sát nội dung thanh ghi vừa sửa. Bước 3 : bạn thực hiện lại bước 1 và 2 để thực hiện gán các trị theo yêu cầu sau : ax=abab bx=cdcd cx=e5e5 dx=7833 si=1234 di=9865 bp=1a5f Bước 4 : xem lại nội dung các thanh ghi. Bước 5 : đánh lệnh R để sửa nội dung thanh ghi cờ như sau : -r f NV UP EI PL NZ NA PO NC - Giá trị cờ Trị mới đánh vào đây lÒc n¿y ₫iểm nh¾y m¿n hÉnh nằm sau dấu trừ v¿ bạn cÍ thể ₫¾nh trị mới của c¾c cờ bằng c¾c chữ như ở trãn NV UP EI PL NZ NA PO NC -ZR CY Cờ C = 1 Cờ Z = 1
  11. Thực tập Vi xử lý - 11 4. Xem nội dung bộ nhớ : Mục đích : Sử dụng thành thạo lệnh D của debug để xem nội dung của một vùng bộ nhớ dưới dạng số hex Bước 1 : Đánh vào lệnh D theo một trong hai dạng sau để xem nội dung của 30h byte bộ nhớ từ địa chỉ luận lý 0000:0040 đến địa chỉ 0000:006F (địa chỉ cuối không cần segment): -d 0000:0040 006f Địa chỉ bắ t đầu Địa chỉ cuối -d 0000:0040 L 30 Địa ch ỉ bắt đầu Số byte lúc đó trên màn hình sẽ hiện ra như sau : Nội dung ô nhớ dạng ASCII Nội dung ô nhớ dạng Hexa -d 0000:0040 006f 0000:0040 07 00 70 C8 4D F8 00 F0-41 F8 00 F0 15 25 A4 FD p.M A % 0000:0050 39 E7 00 F0 40 02 84 02-2D 04 70 00 28 0A 87 03 9 @ -.p.( 0000:0060 61 7D 00 F0 2F 00 65 06-6E FE 00 F0 04 06 87 03 a} /.e.n Địa chỉ segment Offset Offset Offset Offset Offset Offset Địa chỉ offset Bước 2 : Quan sát xem trên màn hình hiện ra nội dung bộ nhớ như thế nào. Vùng đầu là địa chỉ luận lý của các ô nhớ , vùng giữa là nội dung của các ô nhớ theo dạng số hex và vùng cuối là nội dung của các ô nhớ theo dạng mã ASCII. Bước 3 : Tiếp tục đánh lệnh D mà không cần địa chỉ theo sau để xem tiếp : -d quan sát địa chỉ của vùng bộ nhớ , và số byte mà debug hiện ra. Bước 4 : Bạn thực hiện lại các bước trên để xem nội dung bộ nhớ ở các địa chỉ khác nhau mà bạn muốn xem. Thử sử dụng cả hai dạng lệnh D. Một vài địa chỉ bộ nhớ mà bạn không nên bỏ qua như : bảng vector ngắt quãng (0000:0000), ROM BIOS (F000:0000), RAM màn hình (B800:0000), . . . Bước 5 : Bây giờ bạn đánh vào lệnh D với địa chỉ chỉ có offset mà không có segment và tìm hiểu xem debug lấy segment mặc nhiên theo thanh ghi đoạn nào trong các thanh ghi đoạn DS, ES, SS và CS. 5. Sửa nội dung bộ nhớ : Mục đích : Sử dụng thành thạo lệnh E của debug để sửa nội dung của một byte hay một vùng bộ nhớ dưới dạng số hex hay mã ASCII. Bước 1 : Trước khi thực hiện bài này, bạn đánh vào lệnh R để xem giá trị các thanh ghi trước. Điều này cần thiết cho các bài thực hành sửa nội dung bộ nhớ vì bạn cần xác định khoảng địa chỉ bộ nhớ dành cho người sử dụng. Đó chính là các địa chỉ segment lớn hơn hoặc bằng nội dung các thanh ghi đoạn DS, ES, SS và CS mà bạn thấy trên màn hình.
  12. Thực tập Vi xử lý - 12 -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1070 ES=1070 SS=1070 CS=1070 IP=0100 NV UP EI PL NZ NA PO NC 1070:0100 03F1 ADD SI,CX địa chỉ segment dành cho người sử dụng Như vậy, bạn chỉ nên sửa nội dung bộ nhớ trong vùng bộ nhớ dành cho người sử dụng vì như vậy sẽ không xâm phạm vào vùng bộ nhớ của hệ thống mà điều đó có thể gây ra đứng máy hoặc thoát trở về windows. Bước 2 : Đánh vào lệnh E theo sau là địa chỉ bắt đầu của vùng nhớ cần sửa nội dung. -e 2000:1000 2000:1000 06._ Trị mới đánh vào đây Nội dung cũ của ô nhớ Bước 3 : Đánh trị vào ngay vị trí con trỏ theo hệ 16. Trong khi nhập trị, bạn có thể sử dụng các phím sau : . Phím KHOẢNG TRẮNG cho phép bạn chuyển sang ô nhớ kế tiếp mà không phải thoát trở ra dấu nhắc của debug. . Tương tự, phím DẤU TRỪ dùng để chuyển sang ô nhớ trước đó. . Phím ENTER dùng để kết thúc nhập và trở về dấu nhắc của debug. Trong ví dụ này bạn có thể chọn một chuỗi mã ASCII của tên bạn để đánh vào. Chẳng hạn như 4d 69 6e 68 ( Bạn lần lượt đánh vào chuỗi phím : 4, d, khoảng trắng, 6, 9, khoảng trắng, 6, e, khoảng trắng, 6, 8, Enter ). Trên màn hình sẽ như sau : -e 2000:1000 2000:1000 06.4d 3a.69 17.6e 55.68 Bước 3 : Dùng lệnh D để xem lại nội dung 4 ô nhớ mà bạn vừa sửa trị. -d 2000:1000 l 4 Bước 4 : Thực hiện lại bước 1 và 2 nhưng không nhập trị mà chỉ dùng phím khoảng trắng để lần lượt chuyển sang địa chỉ kế và xem nội dung từng ô nhớ. Dùng Enter để kết thúc. Bước 5 : Thực hiện lại bước 1 và 2 nhưng không nhập trị mà chỉ dùng phím dấu trừ để lần lượt chuyển sang địa chỉ trước và xem nội dung từng ô nhớ. Dùng Enter để kết thúc. Bước 6 : Thử thực hiện sửa nội dung bộ nhớ ROM ở địa chỉ F000:0000 xem có được hay không. Bước 7 : Đánh vào dạng lệnh E theo sau là địa chỉ và dữ liệu như sau : -e 2000:1200 12 34 56 78 sau đó xem lại nội dung bộ nhớ và rút ra kết luận. Bước 8 : Đánh vào dạng lệnh E theo sau là địa chỉ và dữ liệu là chuỗi ASCII như sau : -e 2000:1200 'I love you !' sau đó xem lại nội dung bộ nhớ và rút ra kết luận. Bước 9 : Sinh viên tự thử lệnh F (xem phần lý thuyết) và so sánh với lệnh E. Bước 10 : Sinh viên tự thử lệnh M để chép nội dung bộ nhớ (xem phần lý thuyết).
  13. Thực tập Vi xử lý - 13 VDeb2 Debug 2 - Lệnh và chương trình Mục đích : - Sử dụng lệnh A để đánh lệnh của 8086 vào bộ nhớ. - Sử dụng lệnh U để xem các lệnh đã có trong bộ nhớ. - Sử dụng lệnh T và lệnh P để chạy từng lệnh trong bộ nhớ. - Sử dụng lệnh G để chạy chương trình đã có trong bộ nhớ. Chuẩn bị : - Đọc trước phần lý thuyết về các lệnh của Debug. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Xem nội dung bộ nhớ dưới dạng chương trình : Mục đích : Sử dụng thành thạo lệnh U của debug để xem nội dung bộ nhớ dưới dạng các lệnh hợp ngữ. U [ ] Bước 1 : Đánh vào lệnh U theo sau là vùng địa chỉ để xem nội dung vùng nhớ dưới dạng các lệnh hợp ngữ. -u f000:300 30e F000:0300 FA CLI F000:0301 B080 MOV AL,80 F000:0303 E680 OUT 80,AL F000:0305 8CC8 MOV AX,CS F000:0307 8ED0 MOV SS,AX F000:0309 BC0F03 MOV SP,030F F000:030C E93101 JMP 0440 Địa chỉ lệnh Offset 30C Dạng mã máy Dạng lệnh hợp ngữ Offset 30D Offset 30E Bước 2 : Chú ý cách trình bày, các vùng từ trái sang phải : . Địa chỉ bộ nhớ gồm có segment và offset. . Nội dung bộ nhớ ở dạng mã máy số hex của lệnh, 2 số tương ứng 1 byte (1 địa chỉ). Như vậy, nếu vùng này có 6 số có nghĩa là lệnh tương ứng dài 3 byte. . Nội dung bộ nhớ ở dạng lệnh hợp ngữ. Bước 3 : Đánh vào lệnh U như sau để xem tiếp các lệnh kế : -u Bước 4 : Bây giờ bạn đánh vào lệnh U với địa chỉ chỉ có offset mà không có segment và tìm hiểu xem debug lấy segment mặc nhiên theo thanh ghi đoạn nào trong các thanh ghi đoạn DS, ES, SS và CS.
  14. Thực tập Vi xử lý - 14 2. Nhập lệnh vào bộ nhớ : Mục đích : Sử dụng thành thạo lệnh A của debug để nhập lệnh vào địa chỉ bộ nhớ chỉ định. A [ ] Bước 1 : Trước khi thực hiện bài này, bạn đánh vào lệnh R để xem giá trị các thanh ghi trước để xác định bộ nhớ dành cho người sử dụng (nội dung của các thanh ghi đoạn DS, ES, SS và CS). Bạn chỉ nên nhập lệnh từ sau địa chỉ segment đó trở đi. Bước 2 : Đánh lệnh A theo sau là địa chỉ bộ nhớ nơi bắt đầu chương trình . -a 2000:100 bạn sẽ thấy trên màn hình hiện ra như sau : -a 2000:100 2000:0100 _ Địa chỉ bắt đầu Bắt đầu đánh lệnh hợp ngữ vào đây lúc này bạn đánh đoạn chương trình sau vào bộ nhớ 2000:0100 mov al,32 2000:0102 mov ah,4f 2000:0104 mov cx,[200] 2000:0108 mov word ptr [1800],1 2000:010E mov byte ptr [1800],1 2000:0113 Đánh ENTER ở đầu dòng để kết thúc nhập khi bạn nhập lệnh vào sai cú pháp, debug sẽ báo lỗi ngay và bạn phải nhập lại. -a 2000:100 Nhập lệnh sai cú pháp 2000:0100 move al,1 ^ Error 2000:0100 mov al,1 Debug báo lỗi 2000:0102 Lệnh nhập lại ở cùng địa chỉ Bước 3 : Xem lại đoạn chương trình vừa đánh vào bằng lệnh U. Chú ý quan sát phần mã máy. Tìm xem các toán hạng tức thời và các địa chỉ xuất hiện ở đâu trong phần mã máy của lệnh. Phần mã máy của 2 lệnh cuối có gì khác nhau khi dùng các toán tử WORD PTR và BYTE PTR.
  15. Thực tập Vi xử lý - 15 3. Chạy từng bước chương trình : Mục đích : Sử dụng thành thạo lệnh T và P của debug để chạy một hoặc nhiều lệnh trong bộ nhớ. T [= ] [ ] P [= ] [ ] Bước 1 : Dùng lệnh A để nhập các lệnh cần chạy sau đây vào vùng bộ nhớ chỉ định là 3000:100. mov al,12 mov ah,f add ah,al mov cx,facd mov word ptr [200],7 mov byte ptr [201],37 mov bx,100 mov si,100 mov ax,[si][bx] Bước 2 : dùng lệnh U để kiểm tra lại xem bạn nhập chương trình có chính xác không. Chú ý quan sát địa chỉ bắt đầu của mỗi lệnh. Bước 3 : dùng lệnh T để chạy từng bước chương trình trên theo dạng sau : -t = 3000:100 sau khi thi hành xong một lệnh, debug tự động hiện ra nội dung các thanh ghi để bạn xem sự thay đổi nội dung của các thanh ghi hoặc của các cờ trạng thái. Nếu lệnh vừa thi hành có liên quan đến bộ nhớ, bạn phải dùng lệnh D để xem nội dung ô nhớ liên quan. Bước 4 : để thi hành lệnh kế, bạn chỉ cần đánh lệnh T mà không cần địa chỉ lệnh -t lúc đó debug sẽ thi hành lệnh tại địa chỉ mặc nhiên là CS:IP. Bước 5 : bạn đánh vào địa chỉ 2000:200 các lệnh sau : mov bx,2233 mov cx,4455 ret đánh tiếp vào địa chỉ 2000:100 các lệnh sau : mov ax,0 add al,11 call 200 mov dx,6677 Bước 6 : dùng lệnh R để xóa nội dung các thanh ghi AX, BX, CX, DX về 0. Bước 7 : dùng lệnh T để chạy từ địa chỉ 2000:100 và quan sát sự thi hành các lệnh (ghi lại địa chỉ các lệnh mà CPU chạy qua) cũng như các tác động trên nội dung các thanh ghi AX, BX, CX, DX. Bước 8 : dùng lệnh R để xóa nội dung các thanh ghi AX, BX, CX, DX về 0. Bước 9 : bây giờ làm lại bước 7 nhưng không dùng lệnh T mà thay vào đó là sử dụng lệnh P. Quan sát và cho nhận xét xem dùng lệnh T phải chạy bao nhiêu lần ? Còn lệnh P thì cần bao nhiêu lần ? Tại sao ? Bước 10 : dùng lệnh R để xóa nội dung các thanh ghi AX, BX, CX, DX về 0. Bước 11 : dùng lệnh T hay P có kèm theo số lần đã xác định trong bước 9. -t=2000:100 hoặc -p=2000:100
  16. Thực tập Vi xử lý - 16 4. Chạy chương trình : Mục đích : Sử dụng thành thạo lệnh G của debug để chạy một đoạn chương trình trong bộ nhớ. G [= ] [ [ ]] Bước 1 : làm lại bước 5 và bước 6 của mục 2. Bước 2 : dùng lệnh G để thi hành các lệnh như sau : -g=2000:100 2000:10b bạn thấy kết quả thế nào ? chuyện gì sẽ xảy ra nếu bạn dùng lệnh G như sau : -g=2000:100 Bước 3 : Nếu bị đứng máy hay trở về windows thì bạn khởi động lại và làm lại các thao tác cho đến hết bước 1. Bước 4 : dùng lệnh A thêm vào địa chỉ 2000:10B lệnh int 3 . Bước 5 : đánh vào lệnh G như sau : -g=2000:100 cho nhận xét về tác dụng của việc thêm vào lệnh int 3 ở cuối. Bước 6 : bây giờ bạn có thể thực hiện các yêu cầu sau được không ? - Nạp vào địa chỉ 2000:100 đoạn chương trình sau : mov ah,9 mov dx,200 int 21 - Đưa chuỗi ASCII 'Chao ban !$' vào địa chỉ 2000:200. - Sửa nội dung thanh ghi đoạn DS thành 2000. - Chạy chương trình bắt đầu từ địa chỉ 2000:100. Bạn phải nhớ đừng để bị đứng máy hoặc trả về windows nhé. Bạn thấy gì trên màn hình ? Bước 7 : Bạn có chương trình ngắn ngắn nào mà bạn muốn thử hay không ? Hãy thử đi !
  17. Thực tập Vi xử lý - 17 VDeb3 Debug 3 - Cất và nạp tập tin Mục đích : - Sử dụng lệnh N để đặt tên tập tin muốn làm việc. - Sử dụng lệnh W để cất nội dung bộ nhớ lên tập tin trên đĩa. - Sử dụng lệnh L để nạp tập tin trên đĩa vào bộ nhớ. Chuẩn bị : - Đọc trước phần lý thuyết về các lệnh của Debug. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Lưu dữ liệu trong bộ nhớ lên đĩa : Mục đích : Sử dụng thành thạo lệnh N và lệnh W của debug để lưu dữ liệu trong bộ nhớ lên đĩa. N [ ] W [ ] Bước 1 : Dùng lệnh R để xác định vùng địa chỉ dành cho người sử dụng. Bước 2 : Dùng lệnh E để đưa câu thông báo 'I love you more than I can say' vào bộ nhớ ở địa chỉ 2000:1000 ( 1EH byte ). -e 2000:1000 'I love you more than I can say' Bước 3 : Dùng lệnh D để kiểm tra lại địa chỉ 2000:1000. Bước 4 : Dùng lệnh N để đặt tên tập tin trên đĩa như sau : -n love.txt Bước 5 : Dùng lệnh R để định số byte cần ghi lên đĩa trong hai thanh ghi BX và CX (đây là giá trị 32 bit mà trong đó BX chứa 16 bit cao, còn CX chứa 16 bit thấp). Cụ thể trong trường hợp này số byte cần ghi là 1EH nên nội dung các thanh ghi BX và CX như sau: 0000001E Chiều dài tập tin 32 bit Vào CX Vào BX -r bx BX 0000 :0 -r cx CX 0000 :1e Bước 6 : Dùng lệnh R để kiểm tra lại nội dung các thanh ghi BX, CX. Bước 7 : Bây giờ bạn có thể dùng lệnh W để ghi câu thông báo đã nhập vào ở địa chỉ bộ nhớ 2000:1000 lên tập tin love.txt như sau : -w 2000:1000 Writing 0001E bytes Bước 8 : Thoát khỏi Debug (lệnh Q), kiểm tra lại tên tập tin love.txt trên đĩa và dùng lệnh type của hệ điều hành để xem nội dung tập tin đó.
  18. Thực tập Vi xử lý - 18 2. Lưu chương trình trong bộ nhớ lên đĩa : Mục đích : Sử dụng thành thạo lệnh N và lệnh W của debug để lưu một chương trình đơn giản dạng .COM trong bộ nhớ lên đĩa. N W [ ] Bước 1 : Dùng lệnh R để xác định vùng địa chỉ dành cho người sử dụng. Bước 2 : Dùng lệnh A để nhập đoạn chương trình sau vào địa chỉ 2000:100. -a 2000:100 2000:0100 mov ah,2 2000:0102 mov dl,40 2000:0104 int 21 2000:0106 int 20 2000:0108 Bước 3 : Dùng lệnh U để kiểm tra lại chương trình đã nhập ở địa chỉ 2000:100. -u 2000:100 l a Địa chỉ bắt đầu Lệnh đầu 2000:0100 B402 MOV AH,02 2000:0102 B240 MOV DL,40 2000:0104 CD21 INT 21 Lệ nh cu ố i 2000:0106 CD20 INT 20 2000:0108 1400 ADC AL,00 Địa chỉ kết thúc Lệnh có sẳn trong bộ nhớ không thuộc chương trình Chiều dài chương trình = Địa chỉ kết thúc - Địa chỉ bắt đầu Bước 4 : Dùng lệnh N để đặt tên tập tin trên đĩa như sau : -n atsign.com Bước 5 : Dùng lệnh R để nạp chiều dài của chương trình cần ghi lên đĩa vào hai thanh ghi BX và CX. Bước 6 : Dùng lệnh R để kiểm tra lại nội dung các thanh ghi BX, CX. Bước 7 : Bây giờ bạn có thể dùng lệnh W để ghi chương trình đã nhập vào ở địa chỉ bộ nhớ 2000:100 lên tập tin atsign.com như sau : -w 2000:100 Writing 00008 bytes Bước 8 : Dùng lệnh P hoặc G để chạy thử chương trình trên. Bước 9 : Thoát khỏi Debug (lệnh Q), kiểm tra lại xem đã có tập tin atsign.com trên đĩa hay chưa và gọi atsign để chạy chương trình này. Đối chiếu với kết quả chạy chương trình trong debug. Bước 10 : Bây giờ bạn có thể thay giá trị 40 trong chương trình bằng một số khác và cho biết ý nghĩa của nó trong chương trình. Bước 11 : Bạn có chương trình nào ngắn ngắn để chạy thử và cất lên đĩa hay không ?
  19. Thực tập Vi xử lý - 19 3. Nạp tập tin đĩa từ đĩa vào bộ nhớ : Mục đích : Sử dụng thành thạo lệnh N và lệnh L của debug để nạp một tập tin từ đĩa vào bộ nhớ. N [ ] L [ ] Bước 1 : Dùng lệnh R để xác định vùng địa chỉ dành cho người sử dụng. Bước 2 : Dùng lệnh N để khai báo tên tập tin trên đĩa : -n love.txt Bước 3 : Dùng lệnh L để đọc tập tin vào địa chỉ 2000:3000 như sau : -l 2000:3000 Bước 4 : Dùng lệnh R để xem nội dung hai thanh ghi BX và CX xem chiều dài tập tin là bao nhiêu byte. Bước 5 : Dùng lệnh D để xem nội dung vùng đệm chứa tập tin đã đọc. -d 2000:3000 Bước 6 : Thoát khỏi Debug và gọi lại theo cách sau : F > debug love.txt Tìm xem debug đã nạp tập tin love.txt vào chỗ nào trong bộ nhớ. Bước 7 : Bạn có thể nạp tập tin atsign.com trên đĩa vào vùng bộ nhớ có địa chỉ offset bất kỳ được không ? Nếu không thì tìm hiểu xem chương trình .COM chỉ cho phép nạp vào và chạy bắt đầu từ địa chỉ offset bao nhiêu ? Bước 8 : Bây giờ bạn đã có thể nạp bất kỳ tập tin nào trên đĩa vào bộ nhớ và xem nội dung của tập tin theo hai dạng khác nhau : dữ liệu hoặc chương trình. Bạn thử xem.
  20. Thực tập Vi xử lý - 20 VChDl Lệnh 8086 - Chuyển dữ liệu Mục đích : - Hiểu các lệnh trong nhóm lệnh chuyển dữ liệu của 8086. Chuẩn bị : - Đọc trước phần lý thuyết về nhóm lệnh chuyển dữ liệu của 8086. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Lệnh MOV : Mục đích : Sử dụng thành thạo lệnh MOV của vi xử lý 8086. MOV thđ,thn Bước 1 : Dùng lệnh A để nhập vào các lệnh sau vào địa chỉ 2000:0100. Trong quá trình nhập, tìm xem lệnh nào không hợp lệ (sẽ bị báo lỗi) và giải thích tại sao : mov al,34 mov ah,12 mov bx,12 mov 1234,ax mov cx,1234 mov ds,1234 mov bh,bl mov cx,ax mov si,bx mov ax,es Bước 2 : Dùng lệnh U xem lại các lệnh đã nhập. Chú ý phần mã lệnh của các lệnh định vị toán hạng tức thời. Các giá trị tức thời cung cấp trong câu lệnh cũng sẽ xuất hiện trong phần mã lệnh. Bước 3 : Dùng lệnh T hoặc P để chạy từng lệnh trên và quan sát kết quả trong các thanh ghi. Bước 4 : Lặp lại quá trình trên để thử các lệnh sau tại địa chỉ 2000:1000. Chú ý tác dụng của toán tử PTR đối với việc dịch và chạy chương trình. Các lệnh nào không đúng cú pháp ? mov [1000],1 mov byte ptr [1000],1 mov word ptr [1002],1 mov si,2000 mov di,3000 mov word ptr [si+2],2 mov bx,100 mov dx,bx mov byte ptr [dx+18],e mov byte ptr [si+bx+18],1c mov word ptr [si],[2000] mov byte ptr [si+di],2a mov word ptr [di+bx],3b đối với các ô nhớ có địa chỉ hiệu dụng trong lệnh phải dùng lệnh D để xem sự thay đổi nội dung của chúng.
  21. Thực tập Vi xử lý - 21 Bước 5 : Tìm các lệnh để làm các công việc sau : si ← 800 [si+200] ← al [2000] ← cx bx ← [si+202] [bx+si] ← ds dl ← [si+1800] 2. Lệnh PUSH, POP : Mục đích : Sử dụng thành thạo lệnh PUSH và POP của vi xử lý 8086. PUSH thn POP thđ Bước 1 : Dùng lệnh A để nhập vào các lệnh sau vào địa chỉ 2000:0100. Trong quá trình nhập, tìm xem lệnh nào không hợp lệ (sẽ bị báo lỗi) và giải thích tại sao : push ax push [200] push cl push [si+3] pop es pop cx pop dx Bước 2 : Dùng lệnh T hoặc lệnh P để chạy các lệnh trên. Chú ý quan sát sự thay đổi của thanh ghi SP và nội dung của stack. 3. Lệnh XLAT : Mục đích : Sử dụng thành thạo lệnh tra bảng XLAT của vi xử lý 8086. XLAT Bước 1 : Dùng chương trình debug nạp chương trình XLAT.COM từ đĩa vào bộ nhớ. Bước 2 : Dùng lệnh R, lệnh U và lệnh D xem lại chương trình XLAT.COM trong bộ nhớ. Kích thước chương trình Segment nạpchương trình Offset nạp chương trình -r AX=0000 BX=0000 CX=0090 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1092 ES=1092 SS=1092 CS=1092 IP=0100 NV UP EI PL NZ NA PO NC 1092:0100 A04001 MOV AL,[0140] DS:0140=00 -u 1092:0100 A04001 MOV AL,[0140] ;nạp biến bộ nhớ vào thanh ghi AL 1092:0103 240F AND AL,0F ;xóa 4 bit cao 1092:0105 BB8001 MOV BX,0180 ;BX chứa địa chỉ đầu bảng 1092:0108 D7 XLAT ;thực hiện AL [BX+AL] 1092:0109 B402 MOV AH,02 ;thúc hièn xuÞt kû tú trong AL ra 1092:010B 8AD0 MOV DL,AL ; màn hình bằng chức năng 02h1092:010D CD21 INT 21 ; của ngắt 21h 1092:010F CD20 INT 20 ;ngắt 20h để kết thúc chương trình. -d 140 l 10 1092:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 -d 180 l 10 1092:0180 30 31 32 33 34 35 36 37-39 38 41 42 43 44 45 46 0123456798ABCDEF Bước 3 : Dùng lệnh P thi hành từng lệnh của chương trình trên và quan sát kết quả trong các thanh ghi. Bước 4 : Dùng lệnh E thay đổi giá trị của ô nhớ 140h và chạy lại chương trình. Cho nhận xét.
  22. Thực tập Vi xử lý - 22 VSoHo Lệnh 8086 - Số học Mục đích : - Hiểu các lệnh trong nhóm lệnh số học của 8086. Chuẩn bị : - Đọc trước phần lý thuyết về nhóm lệnh số học của vi xử lý 8086 Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Lệnh cộng : Mục đích : Sử dụng thành thạo các lệnh cộng ADD và cộng có nhớ ADC của vi xử lý 8086. ADD thđ,thn ADC thđ,thn Bước 1 : Nạp chương trình cộng nhiều byte ADD.COD vào bộ nhớ để thực hiện phép cộng hai số 4 byte. Bước 2 : Xem lại chương trình đã nạp vào -u 100 12A 1078:0100 BE8001 MOV SI,0180 1078:0103 BB8401 MOV BX,0184 1078:0106 BF8801 MOV DI,0188 1078:0109 8A04 MOV AL,[SI] 1078:010B 0207 ADD AL,[BX] 1078:010D 8805 MOV [DI],AL 1078:010F 8A4401 MOV AL,[SI+01] 1078:0112 124701 ADC AL,[BX+01] 1078:0115 884501 MOV [DI+01],AL 1078:0118 8A4402 MOV AL,[SI+02] 1078:011B 124702 ADC AL,[BX+02] 1078:011E 884502 MOV [DI+02],AL 1078:0121 8A4403 MOV AL,[SI+03] 1078:0124 124703 ADC AL,[BX+03] 1078:0127 884503 MOV [DI+03],AL 1078:012A CC INT 3 -d 180 l 10 1078:0180 66 F7 18 0C 12 5F 1B 06-00 00 00 00 00 00 00 00 f _ chương trình này sẽ thực hiện cộng hai số 4 byte với nhau. Số thứ nhất chứa trong bộ nhớ ở địa chỉ từ 180 đến 183. Số thứ hai chứa trong bộ nhớ ở địa chỉ từ 184 đến 187. Kết quả là số 4 byte được cất vào bộ nhớ ở địa chỉ từ 188 đến 18B. Bước 3 : Dùng lệnh T của debug để chạy từng bước và quan sát sự thay đổi của thanh ghi AL. Bước 4 : Dùng lệnh D của debug để xem lại kết quả phép cộng cất tại bộ nhớ có địa chỉ 188. 2. Lệnh trừ : Mục đích : Sử dụng thành thạo các lệnh trừ SUB và trừ có nhớ SBB của vi xử lý 8086. SUB th½,thn SBB th½,thn Bước 1 : Nạp chương trình SUB.COD từ đĩa vào. Bước 2 : Dùng lệnh U của debug để xem lại nội dung chương trình. -u 100 10d 1078:0100 B81800 MOV AX,0018 1078:0103 2D1200 SUB AX,0012 1078:0106 F8 CLC 1078:0107 BB1800 MOV BX,0018 1078:010A 83DB12 SBB BX,+12 1078:010D CC INT 3 Bước 2 : Dùng lệnh T hoặc G để chạy đoạn chương trình trên và so sánh nội dung hai thanh ghi AX và BX.
  23. Thực tập Vi xử lý - 23 Bước 3 : Bây giờ bạn thay lệnh CLC trong đoạn chương trình trên bằng lệnh STC. Sau đó chạy lại chương trình và cho biết nhận xét của bạn về sự khác nhau giữa hai lệnh SUB và SBB. 3. Lệnh nhân : Mục đích : Sử dụng thành thạo lệnh nhân MUL của vi xử lý 8086. MUL thn Bước 1 : Nạp chương trình MUL.COD từ đĩa vào. Bước 2 : Dùng lệnh U của debug để xem lại nội dung chương trình. -u 100 108 1078:0100 B400 MOV AH,00 1078:0102 B052 MOV AL,52 1078:0104 B304 MOV BL,04 1078:0106 F6E3 MUL BL 1078:0108 CC INT 3 -u 120 12b 1078:0120 BA3412 MOV DX,1234 1078:0123 B85201 MOV AX,0152 1078:0126 BB0400 MOV BX,0004 1078:0129 F7E3 MUL BX 1078:012B CC INT 3 -u 140 14d 1078:0140 B400 MOV AH,00 1078:0142 B052 MOV AL,52 1078:0144 C606300104 MOV BYTE PTR [0130],04 1078:0149 F6263001 MUL BYTE PTR [0130] 1078:014D CC INT 3 Bước 3 : Dùng lệnh T hoặc G của debug để chạy chương trình ở địa chỉ 100. Bước 4 : Dùng lệnh T hoặc G của debug để chạy chương trình ở địa chỉ 120. Bước 5 : Dùng lệnh T hoặc G của debug để chạy chương trình ở địa chỉ 140. 4. Lệnh chia : Mục đích : Sử dụng thành thạo lệnh chia DIV của vi xử lý 8086. DIV thn Bước 1 : Nạp chương trình DIV.COD từ đĩa vào. Bước 2 : Dùng lệnh U của debug để xem lại nội dung chương trình. -u 100 107 1078:0100 B88500 MOV AX,0085 1078:0103 B105 MOV CL,05 1078:0105 F6F1 DIV CL 1078:0107 CC INT 3 -u 120 127 1078:0120 B81603 MOV AX,0316 1078:0123 B102 MOV CL,02 1078:0125 F6F1 DIV CL 1078:0127 CC INT 3 -u 140 14b 1078:0140 BA0000 MOV DX,0000 1078:0143 B81603 MOV AX,0316 1078:0146 B90200 MOV CX,0002 1078:0149 F7F1 DIV CX 1078:014B CC INT 3 Bước 3 : Dùng lệnh T hoặc G của debug để chạy chương trình ở chỉ 100. Bước 4 : Dùng lệnh T hoặc G của debug để chạy chương trình ở chỉ 120. Có gì xảy ra ? Bạn có thể giải thích tại sao không ? Bước 5 : Dùng lệnh T hoặc G của debug để chạy chương trình ở chỉ 140. So sánh hai đoạn chương trình ở địa chỉ 120 và địa chỉ 140.
  24. Thực tập Vi xử lý - 24 5. Lệnh tăng và lệnh giảm : Mục đích : Sử dụng thành thạo lệnh tăng INC và lệnh giảm DEC của vi xử lý 8086. INC thđ DEC thđ Bước 1 : Nạp chương trình INCDEC.COD từ đĩa vào. Bước 2 : Dùng lệnh U của debug để xem lại nội dung chương trình. -u 100 106 1078:0100 BEFEFF MOV SI,FFFE 1078:0103 46 INC SI 1078:0104 46 INC SI 1078:0105 46 INC SI 1078:0106 CC INT 3 -u 120 131 1078:0120 C606100102 MOV BYTE PTR [0110],02 1078:0125 FE0E1001 DEC BYTE PTR [0110] 1078:0129 FE0E1001 DEC BYTE PTR [0110] 1078:012D FE0E1001 DEC BYTE PTR [0110] 1078:0131 CC INT 3 Bước 3 : Dùng lệnh T của debug để chạy chương trình ở chỉ 100. Quan sát cờ CF và ZF. Bước 4 : Dùng lệnh T của debug để chạy chương trình ở chỉ 120. Quan sát cờ CF và ZF. 6. Lệnh so sánh : Mục đích : Sử dụng thành thạo lệnh so sánh CMP của vi xử lý 8086. CMP thđ,thn Bước 1 : Nạp chương trình CMP.COD từ đĩa vào. Bước 2 : Dùng lệnh U của debug để xem lại nội dung chương trình. -u 100 108 1078:0100 B012 MOV AL,12 1078:0102 3C11 CMP AL,11 1078:0104 3C12 CMP AL,12 1078:0106 3C13 CMP AL,13 1078:0108 CC INT 3 Bước 3 : Dùng lệnh T của debug để chạy chương trình ở chỉ 100. Quan sát sự thay đổi các cờ sau mỗi lần vi xử lý thực hiện một lệnh.
  25. Thực tập Vi xử lý - 25 VLuLy Lệnh 8086 - Luận lý Mục đích : - Hiểu các lệnh trong nhóm lệnh luận lý, dịch và quay của 8086. Chuẩn bị : - Đọc trước phần lý thuyết về nhóm lệnh luận lý, dịch và quay của vi xử lý 8086. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Lệnh luận lý : Mục đích : Sử dụng thành thạo các lệnh AND của vi xử lý 8086 để xóa bit, lệnh OR để lập bit và lệnh XOR để đảo bit. AND thđ,thn OR thđ,thn XOR thđ,thn Bước 1 : Nạp chương trình ANDORXOR.COD từ đĩa vào bộ nhớ. Bước 2 : Dùng lệnh U để xem lại chương trình đã nạp vào. -u100 10e 1071:0100 B401 MOV AH,01 ;nhập ký tự từ bàn phím 1071:0102 CD21 INT 21 ;vào thanh ghi AL 1071:0104 B320 MOV BL,20 ;mặt nạ để đổi ra chữ nhỏ 1071:0106 08D8 OR AL,BL ;or với 20h là lập bit 5 1071:0108 88C2 MOV DL,AL ;xuất ký tự ra màn hình 1071:010A B402 MOV AH,02 1071:010C CD21 INT 21 1071:010E CC INT 3 -u120 130 1071:0120 B401 MOV AH,01 1071:0122 CD21 INT 21 1071:0124 B320 MOV BL,20 1071:0126 F6D3 NOT BL ;tạo mặt nạ để đổi ra chữ lớn 1071:0128 20D8 AND AL,BL ;and với not 20h là xóa bit 5 1071:012A 88C2 MOV DL,AL 1071:012C B402 MOV AH,02 1071:012E CD21 INT 21 1071:0130 CC INT 3 -u140 14e 1071:0140 B401 MOV AH,01 1071:0142 CD21 INT 21 1071:0144 B320 MOV BL,20 ;mặt nạ để đổi ra chữ nhỏ 1071:0146 30D8 XOR AL,BL ;xor với 20h là đảo bit 5 1071:0148 88C2 MOV DL,AL 1071:014A B402 MOV AH,02 1071:014C CD21 INT 21 1071:014E CC INT 3 Bước 3 : Dùng lệnh P hoặc G của debug để chạy chương trình ở địa chỉ 100. Khi đó máy sẽ chờ bạn nhập vào một ký tự. Lúc đó bạn chỉ đánh vào một chữ lớn hoặc chữ nhỏ để thấy kết quả đổi ra của đoạn chương trình. Bước 4 : Thực hiện lại tương tự ở bước 3 nhưng với chương trình ở địa chỉ 120. Cho nhận xét của bạn về kết quả nhận được. Bước 5 : Thực hiện lại tương tự ở bước 3 nhưng với chương trình ở địa chỉ 140. Cho nhận xét của bạn về kết quả nhận được.
  26. Thực tập Vi xử lý - 26 2. Lệnh dịch và quay : Mục đích : Sử dụng thành thạo các lệnh dịch và quay của vi xử lý 8086 để xử lý trên các bit của dữ liệu. SHL / SHR / SAR / ROL / ROR / RCL / RCR thđ,1 SHL / SHR / SAR / ROL / ROR / RCL / RCR thđ,CL Bước 1 : Nạp chương trình SHIFT.COD từ đĩa vào bộ nhớ. Bước 2 : Dùng lệnh U để xem lại chương trình đã nạp vào. SAR -u100 112 CF 1070:0100 B0AB MOV AL,AB 1070:0102 D0E8 SHR AL,1 SHR 1070:0104 D0E8 SHR AL,1 0 1070:0106 D0E8 SHR AL,1 1070:0108 D0E8 SHR AL,1 CF 1070:010A D0E8 SHR AL,1 1070:010C D0E8 SHR AL,1 SHL / SAL 1070:010E D0E8 SHR AL,1 0 1070:0110 D0E8 SHR AL,1 CF 1070:0112 CC INT 3 -u120 128 1070:0120 B0AB MOV AL,AB ROR CF 1070:0122 B104 MOV CL,04 1070:0124 D2E8 SHR AL,CL 1070:0126 D2E8 SHR AL,CL 1070:0128 CC INT 3 -u140 156 CF ROL 1070:0140 B8FF00 MOV AX,00FF 1070:0143 D1C0 ROL AX,1 1070:0145 D1C0 ROL AX,1 1070:0147 D1C0 ROL AX,1 1070:0149 D1C0 ROL AX,1 RCR CF 1070:014B F9 STC 1070:014C D1D0 RCL AX,1 1070:014E D1D0 RCL AX,1 1070:0150 D1D0 RCL AX,1 RCL 1070:0152 D1D0 RCL AX,1 CF 1070:0154 D1D0 RCL AX,1 1070:0156 CC INT 3 Bước 3 : Dùng lệnh T của debug để chạy chương trình ở địa chỉ 100. Chú ý quan sát sự thay đổi giá trị của thanh ghi AL và cờ nhớ CF. Bước 4 : Thực hiện lại tương tự ở bước 3 nhưng với chương trình ở địa chỉ 120. So sánh kết quả nhận được với kết quả khi chạy đoạn chương trình ở địa chỉ 100. Cho biết nhận xét của bạn về cách sử dụng hai lệnh SHR AL,1 và SHR AL,CL. Bước 5 : Chạy từng bước chương trình ở địa chỉ 140 và cho biết nhận xét của bạn về cách sử dụng hai lệnh ROL và RCL. 3. Làm thêm : Bạn có thể dùng debug để nạp và chạy thử chương trình SHR.COM trên đĩa và cho biết chương trình đã làm gì. Bạn cần phải sửa chương trình như thế nào để xuất được nội dung ô nhớ có địa chỉ offset 102 ra màn hình ?
  27. Thực tập Vi xử lý - 27 VChĐk Lệnh 8086 - Chuyển ₫iều khiển Mục đích : - Hiểu các lệnh trong nhóm lệnh chuyển điều khiển của 8086. Chuẩn bị : - Đọc trước phần lý thuyết về nhóm lệnh chuyển điều khiển của vi xử lý 8086. Phương tiện : - Máy vi tính có hệ điều hành MSDOS, win95 hoặc win98. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Lệnh nhảy trực tiếp không điều kiện gần (trong một đoạn): Mục đích : Sử dụng thành thạo lệnh nhảy trực tiếp không điều kiện gần JMP của vi xử lý 8086. JMP địa_chỉ_gần Bước 1 : Dùng lệnh A của debug nhập các lệnh sau vào các địa chỉ yêu cầu. -a 100 jmp 2800 -a 2800 jmp 1000 -a 1000 jmp 100 Bước 2 : Dùng lệnh T của debug để chạy từ địa chỉ 100. Chú ý quan sát xem nội dung của thanh ghi nào thay đổi sau mỗi lần thi hành lệnh nhảy. Bước 3 : Bây giờ ta thử tính toán một chút trên địa chỉ nơi đến của lệnh nhảy để hiểu rõ hơn cách nhảy trực tiếp không điều kiện gần của vi xử lý 8086. Trước tiên bạn dùng lệnh U của debug để xem lại phần mã máy của lệnh nhảy. Mã máy của lệnh JMP 2 byte độ dời (26FD) -u100 103 1077:0100 E9FD26 JMP 2800 1077:0103 D4BA AAM BA Đ ị a ch ỉ lệ nh k ế 2 byte độ dời (E7FD) -u2800 2803 1077:2800 E9FDE7 JMP 1000 1077:2803 8CCD MOV BP,CS Địa chỉ lệnh kế Bước 4 : Địa chỉ nơi đến được tính theo công thức sau : Địa chỉ nơi đến = địa chỉ lệnh kế + độ dời Bạn kiểm ta lại xem có đúng như vậy không đối với hai lệnh nhảy trên. Như vậy theo bạn, các lệnh nhảy trên là nhảy trực tiếp hay nhảy tương đối (so với vị trí thi hành lệnh) ?
  28. Thực tập Vi xử lý - 28 2. Lệnh nhảy trực tiếp không điều kiện xa (từ đoạn này sang đoạn khác): Mục đích : Sử dụng thành thạo lệnh nhảy trực tiếp không điều kiện xa JMP của vi xử lý 8086. JMP địa_chỉ_xa Bước 1 : Dùng lệnh A của debug nhập các lệnh sau vào các địa chỉ yêu cầu. -a 2000:100 jmp 3000:0000 -a 3000:0000 jmp 4192:1000 -a 4192:1000 jmp 2000:100 Bước 2 : Dùng lệnh T của debug để chạy từ địa chỉ 2000:100. Chú ý quan sát xem nội dung của thanh ghi nào thay đổi sau mỗi lần thi hành lệnh nhảy. Tác động của lệnh nhảy trong phần này có gì khác tác động của lệnh nhảy trong phần 1 ? Địa chỉ gần khác địa chỉ xa chỗ nào. 3. Lệnh nhảy có điều kiện: Mục đích : Sử dụng thành thạo các lệnh nhảy có điều kiện của vi xử lý 8086. Jcond độ_dời_8bit Bước 1 : Nạp chương trình JCOND.COD từ đĩa vào bộ nhớ. Bước 2 : Dùng lệnh U để xem lại chương trình đã nạp vào. -u100 104 1078:0100 3C01 CMP AL,01 1078:0102 751C JNZ 0120 ;nhảy nếu khác đến 120 1078:0104 EBFA JMP 0100 -u120 126 1078:0120 3C02 CMP AL,02 1078:0122 751C JNZ 0140 ;nhảy nếu khác đến 140 1078:0124 FEC8 DEC AL 1078:0126 EBD8 JMP 0100 -u140 142 1078:0140 FEC8 DEC AL 1078:0142 EBBC JMP 0100 Bước 3 : Dùng lệnh R của debug để nạp giá trị 4 vào thanh ghi AX (tức AL=4). Bước 4 : Dùng lệnh T của debug để chạy từng lệnh và ghi các nội dung cần thiết vào bảng sau : Lần chạy IP ZF Lần chạy IP ZF 1 13 2 14 3 15 4 16 5 17 6 18 7 19 8 20 9 21 10 22 11 23 12 24
  29. Thực tập Vi xử lý - 29 Bước 6 : Với bảng địa chỉ trên bạn có thể dùng các mũi tên để vẽ lại quá trình thi hành của đoạn chương trình trên. Từ đó bạn có được cái nhìn tổng quát hơn về sự thi hành một chương trình có các lệnh chuyển điều khiển trong đó. Bước 7 : Bạn cũng có thể tính địa chỉ nơi đến theo công thức ở phần 1. Tuy nhiên trong trường hợp này độ dời là số chỉ có 8 bit nên phải thực hiện mở rộng dấu thành số 16 bit trước khi cộng với địa chỉ lệnh kế. Khoảng nhảy của các lệnh nhảy có điều kiện chỉ từ -128 đến +127 địa chỉ so với vị trí thi hành lệnh. Điều này bạn có thể kiểm tra bằng cách thử đánh vào lệnh sau đây xem có được hay không : -a 100 jz 181 jc 182 4. Lệnh lặp vòng: Mục đích : Sử dụng thành thạo lệnh lặp vòng LOOP của vi xử lý 8086. LOOP độ_dời_8bit Bước 1 : Dùng lệnh A của debug đánh vào đoạn chương trình sau : -a 100 1078:0100 mov cx,5 1078:0103 loop 103 1078:0105 int 3 1078:0106 Bước 2 : Dùng lệnh T của debug để chạy từng lệnh và quan sát sự thay đổi trên nội dung các thanh ghi. Cho biết lệnh LOOP tác động lên thanh ghi nào và điều kiện kết thúc lặp là gì ? Bước 3 : Nạp chương trình tính tổng 10 số nguyên từ 1 đến 8 trên đĩa có tên là LOOP1.COD vào bộ nhớ. Bước 4 : Dùng lệnh A của debug để xem lại nội dung chương trình : -u100 10d 1078:0100 B91000 MOV CX,0008 1078:0103 B000 MOV AL,00 1078:0105 B401 MOV AH,01 1078:0107 00E0 ADD AL,AH 1078:0109 FEC4 INC AH 1078:010B E2FA LOOP 0107 1078:010D CC INT 3 Bước 5 : Dùng lệnh T hoặc G để chạy chương trình trên và quan sát nội dung thanh ghi AH, AL và CX. Bước 6 : Lệnh LOOP được dùng rất nhiều trong vấn đề xử lý dãy hoặc bảng như trong chương trình LOOP2.COD trên đĩa. Bạn hãy nạp vào, xem và chạy thử. -u100 10d 1078:0100 BB2001 MOV BX,0120 1078:0103 B90800 MOV CX,0008 1078:0106 B000 MOV AL,00 1078:0108 0207 ADD AL,[BX] 1078:010A 43 INC BX 1078:010B E2FB LOOP 0108 1078:010D CC INT 3 -d120 127 1078:0120 01 02 03 04 05 06 07 08 địa chỉ đầu dãy Dãy dữ liệu
  30. Thực tập Vi xử lý - 30 5. Lệnh gọi chương trình con và lệnh trở về: Mục đích : Sử dụng thành thạo lệnh gọi chương trình con CALL và lệnh trở về RET của vi xử lý 8086. CALL ½Ìa chÊ RET Bước 1 : Nạp chương trình CALL.COD từ đĩa vào bộ nhớ. Bước 2 : Dùng lệnh U của debug để xem lại nội dung chương trình trong bộ nhớ : -u100 106 1078:0100 E81D00 CALL 0120 ;gọi chương trình con 1 1078:0103 E83A00 CALL 0140 ;gọi chương trình con 2 1078:0106 CC INT 3 -u120 124 1078:0120 B002 MOV AL,02 ; Chương trình con 1 1078:0122 B303 MOV BL,03 1078:0124 C3 RET ; trở về chương trình chính -u140 142 1078:0140 F6E3 MUL BL ; Chương trình con 2 1078:0142 C3 RET ; trở về chương trình chính Bước 3 : Dùng lệnh T của debug để chạy từng bước từ địa chỉ 100. Quan sát các thanh ghi CS, IP, SS, SP và dùng lệnh D của debug để xem nội dung của stack (địa chỉ trong SS:SP) sau mỗi lần thi hành lệnh CALL hay lệnh RET.
  31. Thực tập Vi xử lý - 31 VChuo Lệnh 8086 - Xử lý chuỗi Mục đích : - Hiểu các lệnh trong nhóm lệnh xử lý chuỗi của 8086. Chuẩn bị : - Đọc trước phần lý thuyết về nhóm lệnh xử lý chuỗi của vi xử lý 8086. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. Thời gian : 2 tiết. 1. Lệnh chép chuỗi : Mục đích : Sử dụng thành thạo lệnh chuyển bộ nhớ MOVS của vi xử lý 8086 để chép các chuỗi dữ liệu từ chỗ này sang chỗ khác trong bộ nhớ. Dùng kết hợp với tiếp đầu lệnh REP để chuyển nhiều byte liên tiếp trong bộ nhớ. REP MOVSB REP MOVSW Bước 1 : Dùng lệnh E của debug để đưa chuỗi ký tự vào bộ nhớ có địa chỉ 180 như sau : -e180 "I don't want to miss a thing !" Bước 2 : Đếm số ký tự của chuỗi trên và dùng lệnh A của debug để đánh đoạn chương trình sau vào bộ nhớ có offset 100. mov ax,3000 mov es,ax Số ký tự của chuỗi đã nhập vào địa chỉ 180 mov si,180 mov di,3200 mov cx,???? MOVSB cld [ES:DI]←[DS:SI] rep movsb Xóa cờ DF để xử lý tăng địa chỉ SI←SI+1 DI←DI+1 int 3 Bước 3 : Dùng lệnh D của debug để xem lại nội dung bộ nhớ tại địa chỉ DS:180 và tại địa chỉ 3000:3200. Bước 4 : Dùng lệnh T hoặc P của debug để chạy từng lệnh của đoạn chương trình trên. Theo dõi kết quả thay đổi trên các thanh ghi và cờ. Bước 5 : Lệnh REP MOVSB trong chương trình được dùng để chuyển (hay chép) cả chuỗi văn bản đã nhập vào từ vùng bộ nhớ có địa chỉ bắt đầu là DS:180 đến vùng bộ nhớ có địa chỉ bắt đầu là 3000:3200. Vì vậy nên sau khi chạy xong chương trình trên, bạn có thể kiểm tra lại kết quả thi hành bằng cách dùng lệnh D của debug để xem lại nội dung bộ nhớ ở địa chỉ 3000:3200. Bước 6 : Bạn có thể sửa lại chương trình để chép chuỗi trên sang vùng bộ nhớ có địa chỉ bắt đầu là 4000:1400 hay không ? Bước 7 : Bạn có thể sửa lại chương trình để chép một chuỗi do bạn nhập vào hay không ?
  32. Thực tập Vi xử lý - 32 2. Lệnh tìm ký tự trong chuỗi : Mục đích : Sử dụng thành thạo lệnh tìm ký tự trong chuỗi SCAS của vi xử lý 8086 để xác định vị trí xuất hiện của ký tự trong chuỗi (nếu có). Dùng kết hợp với tiếp đầu lệnh REPNE để dò tìm từ đầu đến cuối chuỗi. REPNE SCASB REPNE SCASW Bước 1 : Nạp chương trình SCASB.COD từ đĩa vào bộ nhớ. Bước 2 : Dùng lệnh U của debug để kiểm tra lại đoạn chương trình tìm ký tự ở địa chỉ 120. -u120 12c 1078:0120 BF8001 MOV DI,0180 1078:0123 B061 MOV AL,61 ;tìm ký tự 'a’ 1078:0125 B91E00 MOV CX,001E 1078:0128 FC CLD 1078:0129 F2 REPNZ SCASB 1078:012A AE SCASB AL - [ES:DI] 1078:012B 4F DEC DI DI ← DI+1 1078:012C CC INT 3 Bước 3 : Dùng lệnh P của debug để chạy các lệnh và theo dõi các thanh ghi CX, DI và cờ ZF ngay sau khi thi hành xong lệnh REPNE SCASB. Bước 4 : Dùng lệnh D của debug để xem lại vị trí xuất hiện của ký tự trong chuỗi bắt đầu từ địa chỉ 180. 3. Xử lý dãy : Mục đích : Sử dụng thành thạo lệnh nạp chuỗi LODS và cất chuỗi STOS của vi xử lý 8086 để xử lý một dãy, bảng hay vùng dữ liệu trong bộ nhớ. Dùng kết hợp với lệnh lặp vòng LOOP để làm nhiều lần. LODSB / STOSB LODSW / STOSW Bước 1 : Nạp chương trình LODSTO.COD từ đĩa vào bộ nhớ. Bước 2 : Dùng lệnh U và D của debug để kiểm tra lại nội dung chương trình trong bộ nhớ. -u100 10f 1078:0100 BE2001 MOV SI,0120 1078:0103 89F7 MOV DI,SI Đầu vòng lặp 1078:0105 B91000 MOV CX,0010 LODSB 1078:0108 FC CLD AL ← [DS:SI] 1078:0109 AC LODSB SI ← SI+1 1078:010A FEC0 INC AL Thân vòng l ặp 1078:010C AA STOSB STOSB 1078:010D E2FA LOOP 0109 [ES:DI] ←AL 1078:010F CC INT 3 DI ← DI+1 -d120 12f 1078:0120 30 31 32 33 34 35 36 37-38 39 41 42 43 44 45 46 0123456789ABCDEF Địa chỉ đầu dãy Bước 3 : Dùng lệnh T của debug để chạy chương trình từ địa chỉ 100. Quan sát sự thay đổi của các thanh ghi AL, SI, DI, CX. Bước 4 : Kiểm tra lại kết quả xem các phần tử của dãy có được tăng lên 1 hay không. Dùng lệnh D của debug để xem nội dung của dãy ở địa chỉ 120. 4. Làm thêm : Cho dãy số 1 byte bắt đầu ở địa chỉ bộ nhớ 180 gồm có 8 phần tử. Dùng lệnh xử lý chuỗi để tính tổng của dãy trên. Kết quả cất trong thanh ghi AH.
  33. Thực tập Vi xử lý - 33 VHNg1 Hợp ngữ 86 - Dịch và liên kềt Mục đích : - Dịch chương trình hợp ngữ. Chuẩn bị : - Đọc trước phần lý thuyết về hợp ngữ MASM. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. - Chương trình soạn thảo văn bản (EDIT, NC, TURBO, ). - Tạo thư mục lảm việc \MASM chứa phần mềm hợp ngữ MASM 5.0 . Thời gian : 2 tiết. 1. Tạo chương trình thực thi .EXE : Mục đích : Sử dụng thành thạo các chương trình : - MASM.EXE để dịch chương trình nguồn ra chương trình mã đối tượng. MASM ; - LINK.EXE để liên kết các chương trình mã đối tượng và các thư viện (nếu có) thành ra chương trình thực thi có thuộc tính .EXE. LINK ; Bước 1 : Dùng chương trình MASM.EXE để dịch một chương trình nguồn CHAO.ASM có sẵn trên đĩa như sau : Chương trình dịch MASM.EXE Tên chương trình nguồn chao.asm C:\MASM>masm chao; Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. 49252 Bytes symbol space free Số lỗi cảnh báo 0 Warning Errors 0 Severe Errors Số lỗi cú pháp nghiêm trọng Bước 2 : Khi bạn gọi như trên có nghĩa là yêu cầu MASM dịch chương trình nguồn CHAO.ASM ra thành tập tin mã đối tượng có tên là CHAO.OBJ. Với tập tin mã đối tượng CHAO.OBJ, bạn tiếp tục dùng chương trình LINK.EXE để liên kết thành ra chương trình thực thi như sau : Chương trình dịch LINK.EXE Tên tập tin mã đối tượng chao.obj C:\MASM>link chao; Microsoft (R) Segmented-Executable Linker Version 5.10 Copyright (C) Microsoft Corp 1984-1990. All rights reserved. Bước 3 : Khi bạn gọi như trên có nghĩa là yêu cầu LINK liên kết tập tin mã đối tượng CHAO.OBJ ra thành chương trình thực thi CHAO.EXE. Bạn có thể kiểm tra lại bằng lệnh DIR của DOS như sau :
  34. Thực tập Vi xử lý - 34 C:\MASM>dir chao Volume in drive C is WINDOWS Volume Serial Number is 0C5A-1508 Directory of C:\Masm CHAO OBJ 171 06-25-99 3:31p CHAO.OBJ CHAO ASM 298 06-25-99 3:24p CHAO.ASM CHAO EXE 557 06-25-99 3:31p CHAO.EXE 3 file(s) 1,026 bytes 0 dir(s) 1,998,938,112 bytes free Bước 4: Như vậy chương trình thực thi CHAO.EXE đã được tạo ra trên đĩa và bạn chỉ cần đánh tên của chương trình thực thi này để chạy như sau : C:\MASM>chao Chao ban ! Ban da dich thanh cong chuong trinh .EXE . Bước 5: Bây giờ bạn xem thử trên đĩa của bạn còn chương trình nguồn nào khác (thuộc tính .ASM) hay không ? Hãy thử dịch chúng ra chương trình thực thi và chạy xem thế nào. Nếu bạn không biết bắt đầu từ đâu thì hãy dùng lệnh DIR *.ASM /W thử xem. Nếu trong khi bạn thực hiện lại quá trình trên mà có chương trình nào chạy sai hoặc có rác trên màn hình thì bạn đừng sợ. Bạn cứ tiếp tục cho đến hết và ghi nhớ lại tên của các chương trình chạy sai để dùng ở phần tiếp theo. Chúc bạn thành công. 2. Tạo chương trình thực thi .COM : Mục đích : Sử dụng thành thạo các chương trình : - MASM.EXE để dịch chương trình nguồn ra chương trình mã đối tượng. MASM ; - LINK.EXE để liên kết các chương trình mã đối tượng và các thư viện (nếu có) thành ra chương trình thực thi có thuộc tính .COM. LINK /t ; Bước 1 : Dùng chương trình MASM.EXE để dịch một chương trình nguồn CHAO2.ASM có sẵn trên đĩa như sau : C:\MASM>masm chao2; Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981, 1988. All rights reserved. 49252 Bytes symbol space free 0 Warning Errors 0 Severe Errors
  35. Thực tập Vi xử lý - 35 Bước 2 : Khi bạn gọi như trên có nghĩa là yêu cầu MASM dịch chương trình nguồn CHAO2.ASM ra thành tập tin mã đối tượng có tên là CHAO2.OBJ. Với tập tin mã đối tượng CHAO.OBJ, bạn tiếp tục dùng chương trình LINK.EXE để liên kết thành ra chương trình thực thi như sau : Yêu cầu tạo ra tập tin .COM C:\MASM>link /t chao2; Microsoft (R) Segmented-Executable Linker Version 5.10 Copyright (C) Microsoft Corp 1984-1990. All rights reserved. LINK : warning L4045: name of output file is 'chao2.com' Dòng thông báo đã tạo ra tập tin .COM Bước 3 : Khi bạn gọi như trên có nghĩa là yêu cầu LINK liên kết tập tin mã đối tượng CHAO2.OBJ ra thành chương trình thực thi CHAO2.COM. Bạn có thể kiểm tra lại bằng lệnh DIR của DOS như sau : C:\MASM>dir chao2 Volume in drive C is WINDOWS Volume Serial Number is 0C5A-1508 Directory of C:\Masm CHAO2 ASM 350 07-03-99 9:29a CHAO2.ASM CHAO2 COM 72 07-03-99 9:29a CHAO2.COM CHAO2 OBJ 188 07-03-99 9:29a CHAO2.OBJ 3 file(s) 610 bytes 0 dir(s) 2,030,878,720 bytes free Bước 4: Như vậy chương trình thực thi CHAO2.COM đã được tạo ra trên đĩa và bạn chỉ cần đánh tên của chương trình thực thi này để chạy như sau : C:\MASM>chao2 Chao ban ! Ban da dich thanh cong chuong trinh .COM . Bước 5: Trong bước này bạn tìm xem có bao nhiêu chương trình nguồn trên đĩa có thể dịch ra dạng tập tin .COM.
  36. Thực tập Vi xử lý - 36 3. Xem nội dung chương trình nguồn và nội dung chương trình thực thi : Mục đích : Tìm hiểu xem MASM dịch một chương trình nguồn ra dạng .COM như thế nào. Bước 1 : Dùng một trong các chương trình soạn thảo văn bản như EDIT, NC, TURBO . . . để nạp chương trình nguồn CHAO2.ASM vào C:\MASM>edit chao2.asm Bước 2 : Chú ý xem cách khai báo dạng chương trình, các khai báo chương trình con, các khai báo dữ liệu. Bước 3 : Bây giờ bạn thoát ra khỏi chương trình soạn thảo văn bản và dùng debug nạp chương trình thực thi CHAO2.COM vào. Bước 4 : Dùng lệnh R,U và D của debug để xem lại nội dung của chương trình trong bộ nhớ. Nội dung các thanh ghi đoạn có cùng giá trị -r AX=0000 BX=0000 CX=0048 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=1092 ES=1092 SS=1092 CS=1092 IP=0100 NV UP EI PL NZ NA PO NC 1092:0100 BA1001 MOV DX,0110 -u100 10e 1092:0100 BA1001 MOV DX,0110 1092:0103 B409 MOV AH,09 1092:0105 CD21 INT 21 1092:0107 B408 MOV AH,08 1092:0109 CD21 INT 21 1092:010B B8004C MOV AX,4C00 1092:010E CD21 INT 21 -d110 147 1092:0110 43 68 61 6F 20 62 61 6E-20 21 20 42 61 6E 20 64 Chao ban ! Ban d 1092:0120 61 20 64 69 63 68 20 74-68 61 6E 68 20 63 6F 6E a dich thanh con 1092:0130 67 20 63 68 75 6F 6E 67-20 74 72 69 6E 68 20 2E g chuong trinh . 1092:0140 43 4F 4D 20 2E 0D 0A 24 COM $ Bước 5 : So sánh với chương trình nguồn CHAO2.ASM, bạn có nhận xét gì về các lệnh sử dụng trong chương trình nguồn và trong chương trình thực thi. Bước 6 : Bạn có thể dùng lệnh P hoặc G để chạy chương trình trên. Bước 7 : Bạn có thể làm lại các bước trên với những chương trình mà bạn đã dịch ở phần 2. Bước 8 : Bạn làm lại quá trình trên với một chương trình thực thi .EXE (CHAO.EXE chẳng hạn) và chú ý quan sát giá trị ban đầu của các thanh ghi đoạn xem có gì khác so với trường hợp chương trình thực thi .COM không.
  37. Thực tập Vi xử lý - 37 VHNg2 Hợp ngữ 86 - Các ví dụ lập trình Mục đích : - Viết các chương trình ví dụ bằng hợp ngữ. Chuẩn bị : - Đọc trước các ví dụ hợp ngữ MASM ở chương 3, phần đọc ghi tập tin. Phương tiện : - Máy vi tính có DOS prompt. - Chương trình DEBUG.EXE của hệ điều hành. - Chương trình soạn thảo văn bản (EDIT, NC, TURBO, ). - Phần mềm hợp ngữ MASM 5.0 trở lên. Thời gian : 2 tiết. 1. Tạo chương trình nguồn để dịch ra tập tin thực thi .COM : Mục đích : Viết được một chương trình nguồn hợp ngữ 86 để dịch ra tập tin thực thi dạng .COM Bước 1 : Dùng chương trình soạn thảo văn bản nạp tập tin MAUCOM.ASM trên đĩa vào. Bước 2 : Bổ sung các phần còn thiếu để hoàn tất chương trình đọc ghi tập tin trong phần ví dụ của chương 3. Bước 3 : Sau khi hoàn tất chương trình nguồn, cất lên đĩa thành tập tin TAPTIN2.ASM và thoát ra khỏi chương trình soạn thảo văn bản. Bước 4 : Dùng chương trình MASM để dịch chương trình nguồn ra thành tập tin mã đối tượng. Nếu trong quá trình dịch có lỗi, bạn phải sửa lỗi chương trình nguồn và dịch lại có nghĩa là bạn phải làm lại từ bước 1 đến bước 4 cho đến khi nào hết lỗi cú pháp nghiêm trọng thì mới chuyển sang bước liên kết. Bước 5 : Dùng chương trình LINK để liên kết chương trình mã đối tượng ra thành tập tin thực thi dạng .COM (xem bài VHNg1). Bước 6 : Sau khi dịch và liên kết thành công, bạn có thể chạy thử chương trình thực thi (chạy trực tiếp hay bằng debug) và theo dõi kết quả. 2. Tạo chương trình nguồn để dịch ra tập tin thực thi .EXE : Mục đích : Viết được một chương trình nguồn hợp ngữ 86 để dịch ra tập tin thực thi dạng .EXE Bước 1 : Dùng chương trình soạn thảo văn bản nạp tập tin MAUEXE.ASM trên đĩa vào. Bước 2 : Bổ sung các phần còn thiếu để hoàn tất chương trình đọc ghi tập tin trong phần ví dụ của chương 3. Trong trường hợp này bạn phải sửa đổi nội dung chương trình trong ví dụ cho phù hợp với dạng chương trình nguồn .EXE. Bước 3 : Sau khi hoàn tất chương trình nguồn, cất lên đĩa thành tập tin TAPTIN.ASM và thoát ra khỏi chương trình soạn thảo văn bản. Bước 4 : Dùng chương trình MASM để dịch chương trình nguồn ra thành tập tin mã đối tượng. Nếu trong quá trình dịch có lỗi, bạn phải sửa lỗi chương trình nguồn và dịch lại có nghĩa là bạn phải làm lại từ bước 1 đến bước 4 cho đến khi nào hết lỗi cú pháp nghiêm trọng thì mới chuyển sang bước liên kết. Bước 5 : Dùng chương trình LINK để liên kết chương trình mã đối tượng ra thành tập tin thực thi dạng .EXE (xem bài VHNg1). Bước 6 : Sau khi dịch và liên kết thành công, bạn có thể chạy thử chương trình thực thi (chạy trực tiếp hay bằng debug) và theo dõi kết quả.
  38. Thực tập Vi xử lý - 38 3. Mẫu chương trình nguồn dạng .COM : Tên chương trình title Chuong trinh . . . code segment para public 'code' assume cs:code,ds:code,ss:code org 100h start: jmp main ; vung khai bao du lieu Thêm vào các chỉ thị khai báo dữ liệu ; bien db 0 ; ; vung khai bao chuong trinh con ; ctc1 proc Thêm vào các chương trình con (nếu có) ret ctc1 endp ; . . . ; Chương trình chính ; Chuong trinh chinh main proc call ctc1 ; ; ket thuc thi hanh chuong trinh chinh va tro ve DOS mov ax,4c00h int 21h main endp ; ket thuc khai bao doan code code ends ; ket thuc khai bao chuong trinh end start Vị trí bắt đầu thi hành chương trình Chỉ thị kết thúc chương trình nguồn
  39. Thực tập Vi xử lý - 39 4. Mẫu chương trình nguồn dạng .EXE : Title chuong trinh . . . . . ; doan du lieu data segment para public 'data' ; cac chi thi khai bao du lieu (hang, bien, cau truc,mau tin) bien db 0 ; data ends Thêm vào các chỉ thị khai báo dữ liệu ; ; doan chong stack segment stack 'stack' db 100h DUP (0) stack ends ; ; doan chuong trinh code segment para public 'code' assume cs:code,ds:data,ss:stack ; Khai bao cac chuong trinh con ctc1 proc ret Thêm vào các chương trình con (nếu có) ctc1 endp ; . . . ; ; Chuong trinh chinh main proc Khởi động thanh ghi đoạn DS mov ax,data mov ds,ax call ctc1 ; ; ket thuc thi hanh chuong trinh va tro ve DOS mov ax,4c00h int 21h main endp ; dong doan code code ends ; ket thuc khai bao chuong trinh end main Vị trí bắt đầu thi hành chương trình Chỉ thị kết thúc chương trình nguồn
  40. Thực tập Vi xử lý - 40 Tóm tắt các lệnh 8086 / 8088 1. Nhóm lệnh chuyển dữ liệu : MOV reg,reg MOV reg,immed MOV mem,reg MOV mem,immed MOV reg,mem MOV mem16,segreg MOV reg16,segreg MOV segreg,mem16 MOV segreg,reg16 PUSH reg16 PUSH segreg PUSH mem16 POP reg16 POP segreg POP mem16 XCHG reg,reg XCHG mem,reg XCHG accum,reg16 XCHG reg,mem IN accum,immed8 IN accum,DX OUT immed8,accum OUT DX,accum XLAT LEA reg16,mem LDS reg16,mem32 LES reg16,mem32 LAHF SAHF PUSHF POPF 2. Nhóm lệnh số học : ADD reg,reg ADD reg,immed ADD mem,reg ADD mem,immed ADD reg,mem ADD accum,immed ADC reg,reg ADC reg,immed ADC mem,reg ADC mem,immed ADC reg,mem ADC accum,immed INC reg INC mem AAA DAA SUB reg,reg SUB reg,immed SUB mem,reg SUB mem,immed SUB reg,mem SUB accum,immed SBB reg,reg SBB reg,immed SBB mem,reg SBB mem,immed SBB reg,mem SBB accum,immed DEC reg DEC mem NEG reg NEG mem CMP reg,reg CMP reg,immed CMP mem,reg CMP mem,immed CMP reg,mem CMP accum,immed AAS DAS MUL reg MUL mem IMUL reg IMUL mem AAM DIV reg DIV mem IDIV reg IDIV mem AAD CBW CWD NOT reg NOT mem
  41. Thực tập Vi xử lý - 41 3. Nhóm lệnh luận lý : SHL reg,1 SHL mem,1 SHL reg,CL SHL mem,CL SHR reg,1 SHR mem,1 SHR reg,CL SHR mem,CL SAR reg,1 SAR mem,1 SAR reg,CL SAR mem,CL ROL reg,1 ROL mem,1 ROL reg,CL ROL mem,CL ROR reg,1 ROR mem,1 ROR reg,CL ROR mem,CL RCL reg,1 RCL mem,1 RCL reg,CL RCL mem,CL RCR reg,1 RCR mem,1 RCR reg,CL RCR mem,CL AND reg,reg AND reg,immed AND mem,reg AND mem,immed AND reg,mem AND accum,immed TEST reg,reg TEST reg,immed TEST mem,reg TEST mem,immed TEST reg,mem TEST accum,immed OR reg,reg OR reg,immed OR mem,reg OR mem,immed OR reg,mem OR accum,immed XOR reg,reg XOR reg,immed XOR mem,reg XOR mem,immed XOR reg,mem XOR accum,immed 5. Xử lý chuỗi : REP lệnh xử lû chuỗi REPE/REPZ lệnh xử lû chuỗi REPNE/REPNZ lệnh xử lû chuỗi MOVSB / MOVSW CMPSB / CMPSW SCASB / SCASW LODSB / LODSW STOSB / STOSW 6. Chuyển điều khiển : CALL nearlabel CALL mem16 CALL farlabel CALL mem32 CALL reg16 JMP shortlabel JMP mem16 JMP nearlabel JMP mem32 JMP farlabel JMP reg16 RET RETF RET immed8 RETF immed8
  42. Thực tập Vi xử lý - 42 Jcond shortlabel Jcond Giải thÈch Điều kiện JE/JZ Nhảy nếu bằng/khéng ZF = 1 JL/JNGE Nhảy nếu nhỏ hơn/khéng lớn hơn hoặc bằng (SF xor OF) = 1 JLE/JNG Nhảy nếu nhỏ hơn hoặc bằng /khéng lớn hơn ((SF xor OF) or ZF) = 1 JB/JNAE/JC Nhảy nếu dưới /khéng trãn hoặc bằng/nhớ CF = 1 JBE/JNA Nhảy nếu dưới hoặc bằng /khéng trãn (CF or ZF) = 1 JP/JPE Nhảy nếu kiểm tra / kiểm tra chẳn PF = 1 JO Nhảy nếu tr¿n OF = 1 JS Nhảy nếu dấu SF = 1 JNE/JNZ Nhảy nếu khéng bằng/kh¾c khéng ZF = 0 JNL/JGE Nhảy nếu khéng nhỏ hơn/lớn hơn hoặc bằng (SF xor OF) = 0 JNLE/JG Nhảy nếu khéng nhỏ hơn hoặc bằng /lớn hơn ((SF xor OF) or ZF) = 0 JNB/JAE/JNC Nhảy nếu khéng dưới /trãn hoặc bằng/khéng nhớ CF = 0 JNBE/JA Nhảy nếu khéng dưới hoặc bằng /trãn (CF or ZF) = 0 JNP/JPO Nhảy nếu khéng kiểm tra / kiểm tra lẻ PF = 0 JNO Nhảy nếu khéng tr¿n OF = 0 JNS Nhảy nếu khéng dấu SF = 0 LOOP shortlabel LOOPE/LOOPZ shortlabel LOOPNE/LOOPNZ shortlabel JCXZ shortlabel INT immed8 INT 3 INTO IRET 7. Điều khiển bộ xử lû : CLC STC CMC NOP CLD STD CLI STI HLT WAIT LOCK lệnh ESC immed,reg ESC immed,mem -C¾c chữ viết tắt dÓng trong c¾c nhÍm lệnh : reg : thanh ghi tổng qu¾t. reg16 : thanh ghi 16 bit. segreg : thanh ghi ₫oạn. accum : thanh ghi bộ tÈch lũy AX hoặc AL. mem : bộ nhớ (₫ịa chỉ hiệu dụng). mem16 : bộ nhớ 2 byte liãn tiếp (₫ịa chỉ hiệu dụng). mem32 : bộ nhớ 4 byte liãn tiếp (₫ịa chỉ hiệu dụng). immed : số tức thời. immed8 : số tức thời 8 bit. shortlabel : nhÁn ngắn (-128 byte ÷ +127 byte). nearlabel : nhÁn trong ₫oạn (2 byte offset). farlabel : nhÁn ngo¿i ₫oạn (4 byte : 2 byte segment v¿ 2 byte offset).