Bài giảng Lập trình Hợp ngữ - Chương 9: Macro
* Định nghĩa Macro và gọi Macro
* Vấn đề truyền thông số trong Macro.
* Macro lồng nhau.
* Sử dụng Macro để gọi chương trình con.
* Các toán tử Macro.
* Thư viện Macro
* So sánh việc dùng Macro với Procedure
* Một số Macro mẫu.
MACRO Định nghĩa Macro và gọi Macro Vấn đề truyền thông số trong Macro. Macro lồng nhau. Sử dụng Macro để gọi chương trình con. Các toán tử Macro. Thư viện Macro So sánh việc dùng Macro với Procedure Một số Macro mẫu.1CHUONG 9 MACROĐỊNH NGHĨA MACRO Macro là 1 ký hiệu được gán cho 1 nhóm lệnh ASM – Macro là tên thay thế cho 1 nhóm lệnh. Trong lập trình nhiều lúc ta cần phải viết những lệnh na ná nhau nhiều lần mà ta không muốn viết dưới dạng hàm vì dùng hàm tốn thời gian thực thi, thay vì ta phải viết đầy đủ nhóm lệnh này vào CT, ta chỉ cần viết Macro mà ta đã gán cho chúng. Tại sao cần có Macro :2CHUONG 9 MACROLÀM QUEN VỚI MACROKhi ta cĩ nhiều đoạn code giống nhau, chúng ta cĩ thể dùng macro để thay thế, giống như ta dùng define trong C. Thí dụ chúng ta thay thế đọan lệnh sau bằng macro để in dấu xuống dịng. MOV DL,13 ; về đầu dịngMOV AH,2INT 21HMOV DL,10 ; xuống dịng mớiMOV AH,2INT 21H3CHUONG 9 MACROThay vì phải viết lại 6 dịng lệnh trên, ta cĩ thể tạo 1 macro cĩ tên @Newline để thay thế đoạn code này :@NewLine Macro MOV DL,13 MOV AH,2 INT 21H MOV DL,10 MOV AH,2 INT 21HENDMSau đĩ, bất kỳ chỗ nào cần xuống dịng, ta chỉ cần gọi macro @NewLine. @NewLine4CHUONG 9 MACROMACRO (tt) Khi hợp dịch nội dung nhóm lệnh này mà ta đã gán cho macro sẽ được thay thế vào những nơi có tên macro trước khi CT được hợp dịch thành file OBJ. Ex1 : nhiều khi ta phải viết lại nhiều lần đoạn lệnh xuất ký tự trong DL ra màn hình. MOV AH, 2 INT 21HThay vì phải viết cả 1 cặp lệnh trên mỗi khi cần xuất ký tự trong DL, ta có thể viết Macro PUTCHAR như sau : PUTCHAR MACRO MOV AH,2 INT 21H ENDM5CHUONG 9 MACROMỞ RỘNG CỦA MACRO CÓ THỂ XEM TRONG FILE.LIST.3 DIRECTIVE BIÊN DỊCH SAU SẼ QUYẾT ĐỊNH MỞ RỘNG MACRO NHƯ THẾ NÀO..SALL (SUPRESS ALL) PHẦN MỞ RỘNG MACRO KHÔNG ĐƯỢC IN. SỬ DỤNG KHI MACRO LỚN HAY MACRO ĐƯỢC THAM CHIẾU NHIỀU LẦN TRONG CT..XALL CHỈ NHỮNG DÒNG MACRO TẠO MÃ NGUỒN MỚI ĐƯỢC IN RA.THÍ DỤ CÁC DÒNG CHÚ THÍCH ĐƯỢC BỎ QUA. ĐÂY LÀ TUỲ CHỌN DEFAULT..LALL (LIST ALL) TOÀN BỘ CÁC DÒNG TRONG MACRO ĐƯỢC IN RA TRỪ NHỮNG CHÚ THÍCH BẮT ĐẦU BẰNG 2 DẤU ;;6CHUONG 9 MACROĐỊNH NGHĨA MACRO CÚ PHÁP KHAI BÁO MACRO : MACRO_NAME MACRO [ ] STATEMENTS ENDM GỌI MACRO : MACRO_NAME [, ...] THÔNG SỐ HÌNH THỨC CHỈ CÓ TÁC DỤNG ĐÁNH DẤU VỊ TRÍCỦA THÔNG SỐ TRONG MACRO. QUAN TRỌNG NHẤT LÀ VỊ TRÍ CÁC THÔNG SỐ.7CHUONG 9 MACROMACRO TRUYỀN THAM SỐ.MODEL SMALL .STACK 100H PUTCHAR MACRO KT MOV DL,KT MOV AH,2 INT 21H ENDM.CODE MAIN PROC MOV DL, ‘A’ PUTCHAR MOV DL, ‘*” PUTCHAR MOV AH,4CH INT 21HMAIN ENDPEND MAIN8CHUONG 9 MACROSWAP MACRO BIẾN1, BIẾN2 MOV AX, BIEN1 XCHG AX, BIEN2 MOV BIEN1, AX ENDMGỌI : SWAP TRI1, TRI2 9CHUONG 9 MACROTRAO ĐỔI THAM SỐ CỦA MACROMỘT MACRO CÓ THỂ CÓ THÔNG SỐ HOẶC KHÔNG CÓ THÔNG SỐ.PUTCHAR MACRO CHAR MOV AH, 2 MOV DL, CHAR INT 21HENDM. CODE .. ... PUTCHAR ‘A’ PUTCHAR ‘B’ PUTCHAR ‘C’...MACRO CÓ THÔNG SỐSỬ DỤNG MACRO10CHUONG 9 MACROMACRO TRUYỀN THƠNG SỐThí dụ : macro @PrintstrViết chương trình in 2 chuổi ‘Hello’ và ‘Hi”..DATAMSG1 DB ‘Hello’,13,10 MSG2 DB‘Hi’,13,10.CODE.MOV DX, OFFSET MSG1 MOV AH,9INT 21HMOV DX, OFFSET MSG2MOV AH,9INT 21H..Ta thấy đoạn 1 và đoạn 2 gần giống nhau cĩ thể tạo macro cĩ tham số như sau :;1;1;1;2;2;211CHUONG 9 MACROTHÍ DỤ VỀ MACRODISPLAY MACRO STRING PUSH AX PUSH DX LEA DX, STRING MOV AH,9 INT 21H POP DX POP AX ENDM GỌI : DISPLAY CHUOI12CHUONG 9 MACROTRAO ĐỔI THAM SỐ CỦA MACRO MACRO LOCATE : ĐỊNH VỊ CURSOR MÀN HÌNHLOCATE MACRO ROW, COLUMN PUSH AX PUSH BX PUSH DX MOV BX, 0 MOV AH, 2 MOV DH, ROW MOV DL, COLUMN INT 10H POP DX POP BX POP AXENDMTA CÓ CÁC DẠNG SỬ DỤNG SAU :LOCATE 10,20LOCATE ROW, COLLOCATE CH, CLSỬ DỤNG MACROCHÚ Ý : KHÔNG DÙNG CÁC THANH GHI AH,AL,BH,BL VÌ SẼ ĐỤNG ĐỘ VỚI CÁC THANH GHI ĐÃ SỬ DỤNG TRONG MACRO13CHUONG 9 MACROMACRO LỒNG NHAUMỘT CÁCH ĐƠN GIẢN ĐỂ XÂY DỰNG MACRO LÀ XÂY DỰNG 1 MACRO MỚI TỪ MACRO ĐÃ CÓ.EX : HIỂN THỊ 1 CHUỔI TẠI 1 TOẠ ĐỘ CHO TRƯỚC DISPLAY_AT MACRO ROW, COL, STRING LOCATE ROW, COL ;Gọi macro định vị cursor DISPLAY STRING ; Gọi Macro xuất stringENDM MỘT MACRO CÓ THỂ THAM CHIẾU ĐẾN CHÍNH NÓ, NHỮNG MACRO NHƯ VẬY GỌI LÀ MACRO ĐỆ QUI.14CHUONG 9 MACROĐỊNH NGHĨA NHÃN BÊN TRONG MACROTRONG MACRO CÓ THỂ CÓ NHÃN.GỌI MACRO NHIỀU LẦN NHIỀU NHÃN ĐƯỢC TẠO RA LÀM SAO GIẢI QUYẾT VẤN ĐỀ NHẢY ĐIỀU KHIỂN?ASSEMBLY GIẢI QUYẾT VẤN ĐỀ NÀY BẰNG CHỈ THỊ LOCAL CƯỠNG BỨC MASM TẠO RA 1 TÊN DUY NHẤT CHO MỖI MỘT LABEL KHI MACRO ĐƯỢC GỌI..CÚ PHÁP : LOCAL LABEL_NAME15CHUONG 9 MACROMột số Macro yêu cầu user định nghĩa các thành phần dữ liệu và các nhãn bên trong định nghĩa của Macro.Nếu sử dụng Macro này nhiều hơn 1 lần trong cùng một chương trình, trình ASM định nghĩa thành phần dữ liệu hoặc nhãn cho mỗi lần sử dụng các tên giống nhau lặp lại khiến cho ASM báo lỗi.Để đảm bảo tên nhãn chỉ được tạo ra 1 lần, ta dùng chỉ thị LOCAL ngay sau phát biểu MacroKhi ASM thấy 1 biến được định nghĩa là LOCAL nó sẽ thay thế biến này bằng 1 ký hiệu có dạng ??n, trong đó n là 1 số có 4 chữ số. Nếu có nhiều nhãn có thể là ??0000, ??0001, ??0002 ...Ta cần biết điều này để trong CT chính ta không sử dụng các biến hay nhãn đưới cùng 1 dạng.16CHUONG 9 MACROThí dụ minh họa chỉ thị LocalXây dựng Macro REPEAT có nhiệm vụ xuất count lần số ký tự char ra màn hình.REPEAT MACRO CHAR, COUNT LOCAL L1MOV CX, COUNTL1: MOV AH,2 MOV DL, CHAR INT 21H LOOP L1ENDMASM SẼ DÙNG CƠ CHẾ ĐÁNH SỐ CÁC NHÃN (TỪ 0000H ĐẾN FFFFH) ĐỂ ĐÁNH DẤU CÁC NHÃN CÓ CHỈ ĐỊNH LOCAL.GIẢ SỬ GỌI :REPEAT ‘A’, 10REPEAT ‘*’, 20SẼ ĐƯỢC DỊCH RA 17CHUONG 9 MACROThí dụ minh họa chỉ thị LocalMOV CX, 10??0000 : MOV AH,2 MOV DL, ‘A’ INT 21HLOOP ??0000MOV CX, 20??0001 : MOV AH,2MOV DL, ‘*’INT 21HLOOP ??0001GIẢ SỬ GỌI :REPEAT ‘A’, 10REPEAT ‘*’, 2018CHUONG 9 MACROThí dụ minh họaViết 1 macro đưa từ lớn hơn trong 2 từ vào AXGETMAX MACRO WORD1, WORD2 LOCAL EXIT MOV AX, WORD1 CMP AX, WORD2 JG EXIT MOV AX, WORD2 EXIT :ENDMGIẢ SỬ FIRST,SECOND, THIRD LÀ CÁC BIẾN WORD. SỰ THAM CHIẾU MACRO ĐƯỢC MỞ RỘNG NHƯ SAU :MOV AX, FIRSTCMP AX, SECONDJG ??0000 MOV AX, SECOND??0000:19CHUONG 9 MACROThí dụ minh họaViết 1 macro đưa từ lớn hơn trong 2 vào AXLỜI GỌI MACRO TIẾP THEO :GETMAX SECOND, THIRDĐƯỢC MỞ RỘNG NHƯ SAU :MOV AX, SECONDCMP AX, THIRDJG ??0001??0001 : SỰ THAM CHIẾU LIÊN TIẾP MACRO NÀY HAY ĐẾN MACRO KHÁC KHIẾN TRÌNH BIÊN DỊCH CHÈN CÁC NHÃN ??0002, ??0003 VÀ CỨ NHƯ VẬY TRONG CHƯƠNG TRÌNH CÁC NHÃN NÀY LÀ DUY NHẤT. 20CHUONG 9 MACROTHƯ VIỆN MACROCÁC MACRO MÀ CHƯƠNG TRÌNH THAM CHIẾU CÓ THỂ ĐẶT Ở FILE RIÊNG TA CÓ THỂ TẠO 1 FILE THƯ VIỆN CÁC MACRO. DÙNG 1 EDITOR ĐỂ SOẠN THẢO MACRO LƯU TRỮ TÊN FILE MACRO.LIB KHI CẦN THAM CHIẾU ĐẾN MACRO TA DÙNG CHỈ THị INCLUDE TÊN FILE THƯ VIỆNMỘT CÔNG DỤNG QUAN TRỌNG CỦA MACRO LÀ TẠO RACÁC LỆNH MỚI.21CHUONG 9 MACROSO SÁNH GIỮA MACRO & THỦ TỤCTHỜI GIAN BIÊN DỊCH.MACRO ÍT TỐN THỜI GIAN BIÊN DỊCH HƠN PROCEDURE THỜI GIAN THỰC HIỆN : NHANH HƠN PROCEDURE VÌ KHÔNG TỐN THỜI GIAN KHÔI PHỤC TRẠNG THÁI THÔNG TIN KHI ĐƯỢC GỌI TỐC ĐỘ NHANH HƠN. KÍCH THƯỚC : KÍCH THƯỚC CT DÀI HƠN 22CHUONG 9 MACRO CÁC LỆNH LẶP TRONG MACRO REP : ... ENDM TÁC DỤNG : LẶP LẠI CÁC KHỐI LỆNH TRONG MACRO VỚI SỐ LẦN LÀ EX : MSHL MACRO OPER, BITS REPT BITS SHL DEST, 1 ENDMENDMGỌI MSHL BX, 3SẼ ĐƯỢC THAY THẾ BẰNG :SHL BX, 1SHL BX, 1SHL BX, 123CHUONG 9 MACRO CÁC LỆNH LẶP TRONG MACRO IRP , : ... ENDM TÁC DỤNG : LẶP LẠI KHỐI LỆNH TÙY THEO DANH SÁCH TRỊ. SỐ LẦN LẶP CHÍNH LÀ SỐ TRỊ TRONG DANH SÁCH MỖI LẦN LẶP LẠI SẼ THAY BẰNG 1 TRỊ TRONG DANH SÁCH VÀ SẼ LẦN LƯỢT LẤY HẾT CÁC TRỊ TRONG DANH SÁCH.EX : PROCTABLE LABEL WORD IRP PROCNAME, DW PROCNAME ENDM24CHUONG 9 MACRO CÁC LỆNH LẶP TRONG MACRO TUY NHIÊN CÁCH KHAI BÁO NÀY RƯỜM RÀ HƠN LÀ DÙNG : PROCTABLE DW MOVUP, MOVDOWN,MOVLEFT,MOVRIGHT VIỆC SỬ DỤNG CÁC MACRO LẶP VÒNG NÀY CHO CÓ HIỆU QUẢ LÀ ĐIỀU KHÓ, ĐÒI HỎI PHẢI CÓ NHIỀU KINH NGHIỆM25CHUONG 9 MACROBÀI TẬP MACROBài 1 : 1. Viết một MACRO tính USCLN của 2 biến số M và N. Thuật tốn USCLN như sau : WHILE N 0 DO M = M MOD N Hốn vị M và N END_WHILE Bài 2 : MACRO doi tu so chua trong ax sang chuoi tro den boi DI; in : DI =offset chuoi; AX =so can doi; out: khong co(chuoi van do di tro toi)26CHUONG 9 MACROBài 3 :Viết macro chuyen tu chuoi thanh so chua trong ax; in : DI =offset chuoi; out : AX =so da doiBài 4 : Viết MACRO xuất số hecxa chứa trong AL ra màn hình *; INPUT : AL chứa số cần xuất; OUTPUT: nothingBài 5 : Viết Macro in số hecxa chứa trong BL ra dạng binary;Input: BL chứa số cần in;Output: Nothing27CHUONG 9 MACRO
File đính kèm:
- Chuong_09_MACRO.ppt