Các bài tập lập trình bằng ngôn ngữ assembler

303 28 0
Các bài tập lập trình bằng ngôn ngữ assembler

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TS ĐẶNG THÀNH PHU CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ÂSSEMBLER NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT HÀ NÔ I - 2001 Chịu trúi h nhiệm xuất hàn : Biên tập : V ẽ h ìa : PGS TS TÔ ĐÀNG HẢI TIÊN KHANG, KIM ANH H U ^N G L A N 6.6T7 KHKT-2001 In lOTO khổ 14,5x20,5cm Tại X í ngh iệp in 19-8 sô' 3đuờiig Nguyền Phong sắc- Nghĩa Târih- Cầu Giấy - Hà Nội Số giáy f tó p 1380, ngày 11 -1 - 2001 In xong nộp lưu chiéu th án g 11 năm 2001 LỜI NĨI ĐẦU Ngơn ngữ Assembler ngồn ngữ bậc thấp, gần với ngơn ngữ máy tất nhiên râì gán với {Aần cứng máy tính Với đặc điểm nên lập trình ngơn ngữ Assem bler có đặc thù riêng có phán khác với ngơn ngữ bậc cao Những ngưịi bưóc đẩu làm quen với Assembler thường thấy lúng túng Cuốn sách “ Cúc hài tập lập trình băng n^ơn n^ữ Assem hỉer ” nối tiếp sách Turbo Assemhler vá irng dụn^ “ chúng tơi nhằm giúp người lập trình làm quen với cách lập trình ngồn ngữ Assembler thơng qua tập cụ thể Trong mỏi tẠp, tiến hành theo ba bước : nêu yêu cẩu tập; nói (ịua ý tưởng giải (thuật tốn) sau thể chiromg trình (có kèm giải thích) Để dể dàng hiểu giải tập sách đòi hòi người lập trình cắn nắm vồng: • Phần lý thuyết vể lập trình ngơn ngữ Assembler, chế liên kết ngôn ngữ bậc cao (C P a sc al) với ngơn ngữ Assembler • Cấu tróc m áy tính nói chung máy vi tính nói riêng • Cơ chế ngắt ngắt hệ thống (các ngắt BIOS EX)S ) Cuốn sách dành cho người chuyên tin tất có nhu cầu tìm hiểu, sử dụng ngơn ngữ Assembler, đặc biệt người sâu vào hệ thống gần với ỹhẳn cứng, người hoạt động ĩĩnh vực đo lưồ^g, điều khiển nguời ứng dụng tin híK: vào q trình cơng nghê Các tập sách xếp theo hai phần : Phán ì Cái hài tập phần sơ họi Nội dung f^ần I giải mội sơ' tập í^' học thường gặp Phdn // Cáí hải ĩập lién quan đếrt hệ thống Nơi dung phần II giải số tập liẽn quan đến hệ thống thông qua ngắt cua BIOS DOS Tác giả xin chân thành cảm ơn Viện Công nghệ Thông tin thuộc Trung tâm Khoa học Tự nhiên Công nghệ Ọuốc Gia tạo điểu kiện cho việc nghiên cứu hoàn thành sách Tác giả xin chân thành cảm ơn: PGS,TS Nguyẻn Văn Tam, KS Ngô Trần Anh, TS Đặng Văn Đức, TS Vũ Như Lân TS Vũ Chấn Hưng đọc thảo, cổ vũ đóng góp nhiểu ý kiến để sách mắt Hy vọng sách đáp ứng phần nằo nhu cầu bạn đọc học tập, nghiên cứu ứng dụng ngơn ngữ Asseiĩibler vào cịng việc Mặc dù cố gắng cho sách hồn chỉnh, song chắn khịng tránh khỏi sai sót Chúng tơi mong xin chân thành cảm ơn ý kiến đóng góp bạn đọc Hù Nội, tháng năm 2001 TÁ C G IẢ Phầnl CÁC BÀI TẬP PHẦN SỐ HỌC • ■ CHƯƠNG CHƯƠNG TRỈNH THUẦN t ủ y ASSEMBLER TrưcK vào lập trình cụ thể cho ví dụ, nhắc lại sô' phần liên quan đến lập trình thuẩn túy Assembler 1.1 CÁC BƯỚC TIẾN HÀNH MỘT CHƯƠNG TRÌNH ASSEMBLER TRÊN MÁY TÍNH PC Thường gồm bốn bước theo thứ tự sau: Dùng chương trình soạn thảo (ờ chế độ soạn thảo chưcmg trình - programming mode) để soạn thảo chương trình thân chương trình dịch Assembler (TASM-Turbo Assembler Borland MASM M icrosoít) khơng có mơi trường soạn thảo TC TP Cán phải lưu ý ià tệp chương trình cât giữ vào dĩa phải có đuởi ASM Ngôn ngữ Assembler túy mậc định không prfiân biệt chữ hoa chữ thường, Dịch chương trình Assembler, ví dụ với chương trình dịch TASM (Turbo Assembler) theo cú pháp sau : TASM í/option] SOURCEfile [.ASM] (có ASM) (, OBJfile (có đuối OBJ)][, L s r n ie (có LST)]( XRFfi!e (có XRF)] Chú ỷ: Khi dịch có sai vể cú pháp không tạo tệp đuôi OBJ, LST -XRF Cách báo chương trình dịch dịch có l ỗ i : **ERROR** lên_tệp.asm (số dịng lệnh có lỗi) : dang lỗi Vi dụ : **ER RO R **vd.asm (19): Undefined Symbol : slcs (có nghĩa : dịng 19 tệp vd.asm bị sai lồi biến sỉcs chưa xác lập- Ịchai báo) Liên kết theo cú pháp sau : TLINK l/option] OBJfile [,EXEfile (có EXE)! [, M>file (có -MAP))I LlBHle (có LIB)1 Chú ỷ : Nếu liên kếl có lỗi khơng tạo tệp EXE, M A P và.L lB Chương Chương trỉnh thuẩn túy Assem bler Chạy rhử chương trình có sai sửa Khi tạo tệp OBJ EXE có nghĩa vể cú pháp Song chạy chươtig trình khơng cho kết mong muốn Điều có nghĩa chương trình bị sai vể thuật tốn chương trình dịch Turbo Assembler khơng phát điểu Loại sai khó phát nhiều so với loại sai vể cú pháp Người lập trình dùng chức nảng Turbo DEBUG (TD) Turbo Assem bler DEBUG DOS với suy luận thuật toán kinh nghiệm người lập trình để tìm lỗi Một vài ( hú Vkhi soạn ĩhảo dịch chương trình : Mỗi lệnh Assem bler chiếm dịng vói cú pháp tổng quát có dạng sau ; ỉdbelỊ [directive/instruction) [operandsỊ [; comment Mặc định ngơn ngữ Assembler khơng phân biệl chữ hoa chữ Ihưòmg Tất chCr đéu hiểu chữ hoa Muốn có [rfiân biệt chữ hoa chữ thường nhãn phải sử dụng tùy chọn dịch chương trình, ; TASM /ml cho íất ký hiệu (symbol), TASM /m x , cho nhân âxiợc khai báo PUBLIC, EXTRN GLOBAL -V Chương trình dịch TASM tìm tệp INCLUDE ? • Nếu theo sau directìve (lệnh điẻu khiển dịch chương trình) IN Q U D E có chi rõ tên ổ dĩa, đường dẫn, tên tệp lất nhèn chương trình dịch lìm theo xác định trên, • Còn iheo sau directive INCLUDE xấc định có tên tệp thơi chương Irình dịch tìm fệp thư mục hành, khơng thấy ĩhì tìm tên tệp ổ đĩa, thư mục xác lập bời tùy chọn-/ dịch chưcmg trình : TASM -i tên_ổ_đĩa\tên_thư_mục chứồ tệp INCLUDE 1.2 CẨU TRÚC THƯỜNG THÂY CỦA MỘT CHƯƠNG TRÌNH THUẦN TÚY ASSEMBLER V ề tổng thể cấu trúc chương trình túy Assembler thưỀBìg c ó dạng sau : CÁC BÀI TẬP LẬP TRÌNH BẰNG NGƠN NGỮ ASSEMBLER [ Phần khai báo MACRO, STRUC, RECORD UNION (nếu có) Chú ý phần đặt chỗ khác song phải trước sử dụng Phần khai báo segm ent í Khai báo segm ent dạng đơn giản MODEL kiểu STACK độ lốn (tính theo byte) DATA Khai báo biến Khai báo segm ent dạng chuẩn tên_stack_segnient segment kiểu độ ỉớn dup(? giá trị) tên stack segm en t ends tên d ata.segm en t segment CODE Khai báo biến tên_data_segm ent ends Nhãn : mov AX,@DATA mov DS,AX tên cod e.segm en t segment assume tên_thanh_ghi segment: tẽn^segment (cách dấu,) thân chương trinh lệnh trở ỈX)S Nhãn: mov AX,DATA mov DS,AX thân chương trinh {các chương trình con] (nếu có) END Nhàn lệnh trở vể DOS |các chưdng trình con| (nếu có) tên_code_segm ent ends END Nh: C húý: Chúng ta dùng lệnh điểu khiển (directive) IN Q U D E để chèn khối lệnh Assembler có tệp (thường chứa MACRO hoảc chương trình con) vào ncrt chương trình mà ta muốn Phẩn chưcmg trình đặt đầu phẩn code segment (trưóc Nhãn chưomg trình) thay sau phần chương trình Chương Chương trinh thuẩn túy Assembler Bài tậ p l l Hãy xâu ký tự ‘Hello TASM V hình Cách g iả i: Có nhiéu cách giải tập nêu hai cách: Cách ỉ: Dùng chức nâng xâu ký tự kết thúc dấu $ hình Chức thứ hàm ngắt int ìh DOS cho phép xâu ký tự kết thúc $ hình DS:DX chứa địa SEG:OFFSET biến xâu Do chưcmg trình sc sau (dùng khai báo segment dạng đơn giản) : MODEL small STACK lOOh DATA Message db ‘HdloTASM ! $’ ; Khai báo biến xâu ký tự CODE ProgramStart : mov AX,@DATA Đưa phần đia SEGMENT ảia phân mov DS.AX đoạn liệu vào ghi segment DS mov DX,Oh hSET Message DX chíồà phần đỊơ Ohl-SET biến xâu mov AH,9 Chức thứ int 21h hàm ngắt int 21h EX)S mov A H ,1' Chítìc chờ ký tự từ bàn phím int 21h mov AH,4Ch Chức trở DOS int 21h END ProgramStart Cách : Xâu ký tự kết thúc giá trị tuyệt đối (giống cấu trúc xâu ngỏn ngữ lập trình C), Thuật to n : ỏ đày đùng lệnh làm việc với xâu ký tự Q ìúng ta đưa ký tự xâu vào ghi AL so sánh liệu ký tự có ỊÀìãi tuyệt đơi (ký tự kết thúc xâu) hay chưa? Nếu ký tự ỉà giá trị tuyệt đối kết thúc chương trình, cịn khơng ký tự hình- 288 CÁC BẢI TẬP LẬP TRÌNH BẰNG NGƠN NGỮ ASSEMBLER B.4 Nhóm lệnh hàm siêu việt B.4.1 M n h FCOS Chức : ST (0) - c o s (ST (0)) Cú pháp : FCOS B.4.2 Lệnh FPTAN Chức nâng : ST(0) B A 100 101 102 103 104 105 F3 58 59 5a 8D 2^6 _ CÀC BÀI TẬP LẬP TRÌNH BẰNG NGƠN NGỮ ASSEMBLER - F040():I00 Iff 20 trang từ dịa offset lOOh sẽđược nạp dấu trơng 1SPACE có mã ASCII 20h) c.3.6 I.ệnh (ỉ (Go) - Thực chương trình Chửi nủn{Ị : Cho chạy chư í^g trình hiệu chinh Việc thực hien chương trình dừiig lại gặp điểm dừng hiển ihị ghi dừng lệnh thực tiếp iheo chương trình Cú pháp : - G 1= address f í ị ( í ( h ỉ d ấ I dddrẹssl - J u í í i a í h ỉ ( ỉ n i Ị Chú V ; Nếu - G thực chưcmg trình từ lệnh có địa xác định CS:IP hết chươĩìg trình c J l^ n h H (H exaA rithm etic) - Cộng trừ hệ 16 Chức nărìiỊ : Cộng Irừ hai giá Irị Hexa hiển thị kêì lên Cii pháp : H iá trl L stó trị V'/ dụ ; hí Of hlnh hình : 17 07 (Ì7h tổng ()fìì H 07 hiệu cùa hai sị đó) c J Lệnh I (Input) - Ỉ)(K‘ giá trị cổng Chức nâỉiìị : Đọc lìiộn giá trị cùa cổng (port) Củ pháp : Ví lỉụ : I đìa cổng vào - 2F8 68 hình ví dụ giá trị: (giá trị từ cổng có địa chi 2F8h) c J Lệnh L (Load) - Lôi tệp xuống vùng nhớ Chức m h ìịỊ; Q iuyến tệp sector đĩa xuống vùng nhớ Cú phúp : Có ba dạng ; a) - L lởddress Ldriver sectorđ số luợng sectorll Đọc sô liệu iừsectord (sector đầu) ổ dĩa vối sơ lượììg sector cần đọc âược xác định tham số sốJượfiịỊ_secỉor xuống vùng nhớ bắi đầu từ địa chi ưddress Sector sector tương đối ổ đĩa lôgic Ví du : - L 4BA: 100 0F 6D Phụ lục c Chương trình gd rối DEBUG 297 Ỉ X ^ sô liệu cùa 109 sector (6Dh) mà sector đáu 0F ổ đĩa B: xuống vùng nhớ bầl đáu từ địa 4BA: 1(X)) Chú ý : Các ổ đĩa thể sỏ : ổ A: làsố 0, ổ B: sô ỉ ổ C: sô 2, b) Nếu tên tệp đặt tên bời lệnh “ N tện tệp sau lệnh L hoậc L address đưa nội dung tệp xuống vùng nhớ mặc định CS:100 (nếu sau lệnh L không xác định địa chỉ) vào vùng nhớ có địa bắt đáu từ address Ví (lu I : -M iTiQnpxQS sau L Ihì nội dung lộp monprog đưa xuống vùng nhớ có địa chi đầu CS: 100 Vỉ (ht 2; -N mọnprog sau ~ L 300 nội dung cùa tệp monprog đim xuống vùng nhớ có địa đầu CS:300 c 3.10 Lệnh M (M ove) - C huyến vùng sở liệu Chửi n ủ n \Ị: Q ìuyển nội dung từ mội vùng nhớ sang vùng nhớ khác Cú pháp : “ M rânsê* dddtes5 Chú ỷ : Nếu XrongnưìiỊe luhh ess khịng xác định phán địa chi segment ihì sè lấy địa chi segm eat nằm Ihanh ghi DS Vi ihi : - M CS: 100.110.CS 500 ~ M CS IQO L I L CSi50Q song : -M C S :1 0 110 500 17 byte íừ vùng nhớ có địa đầu CS:i(X) chuyển đến vùng nhớ có địa đáu DS:500Ghi ; Lệnh nằy ý đến phần overlap thực đúng, khác với lệnh MOVSB/MOVSV/ c J l I^nh N (Name) - Đặt tên cho tệp Chửi nản^ : Đặt tên cho tệp để sau lệnh 4- (Load) “ W (W rile) dùng tên tệp 298 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÒN NGỮ ASSEMBLER Cú pháp : “ N tẽnJ:ệp EXE(hoặc COM) Vỉ (lụ : N monprog.EXẸ - L c.3.12 Lệnh o (O utput) - Đưa m ột byte sò liệu cổng Chiầ nàng : Gửi byte sô liệu công (port) Củ pháp : Vỉ dụ o địa cổng xâ s iá ừị cần đưa râ cổng Q2F8.4F c J i Lệnh Q (Q uit) - Rời DEBUG đẻ trở DOS Chức nã niỊ: Rời DEBUG để trò DOS Cú pháp : Q C 3.I4 Lệnh R (Kegister) - Hiển thị sừĩà đối nội dung ghi Chức nátỉiỊ;Cho phép hiển thịvà sửa đổi nội Cú pháp : R Ị ghi ỉ F dung ghi Có irường hợp sau ; - R nội dung tất ghi» “ RAX nội dung ghi AX cho phép sửa nội dung ghi đó, ví dụ : AX F1F4 đáy ấn giá trị AX vẩn giữ nguyên Nếu muốn sửa giá trị đánh giá trị vào rổi sau ấn để kết thúc lệnh, cịn thay ấn chúng la ấn SPACE nội dung ghi (BX) q trình tiếp tục RF , hiên sửa đổi nội dung ghi cờ C3.15 I^nh s (Search) - Tìm kiếm Chức nân^ : Tim vùng nhớ xác định range ký tự danh sách Cú pháp : s ĩd nge.dân h sách Phụ lục c Chương trinh gd rối DEBUG 299 C h ii\' : Nốu phạm vi raiiịỊe không xác định thành phần địa chí SEGMENT phầii địa SEGM ENT mậc định nầm ghi DS Vi d ụ i ; s CSilOO 110 41 - S C S :1 0 L 41 tìm nhớ có giá trị 41 h vùng nhớ lừ CS: 100 đến CS: 110, giả thuyết vùng nhớ có hai ó chứa giá trị 4ìhxhìi trẻn hình có thơng báo ví du dạng sau : 04B A 0104 04BA OIOD V'/ iỉu : - s CS; 100 110 41ABE’ tìm bốn liên tiếp vịing nhớ bốn giá trị c.3 Lệnh T (T race) - Chạy bước ctìíũ : Thực hoậc nhiều lệnh bắt đẩu từ địa CS:IP từ địa xác định dấu = , hiển thị trạng thái toàn ghi sau lệnh Cú ph p : T I-a

Ngày đăng: 18/03/2021, 19:58

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan