- US E: chỉ có từ thế hệ 80386 và chỉ được dùng với chỉ dẫn hướng 386 use16 ASM 16 bit (default): Độ dài đoạn cực đại là 64Kbyte
a) AX chứa số nguyên dương Thuật toán:
4.2.5.1. Khai báo (xác lập) MACRO
Cú pháp:
Bảo vệ các thanh ghi mà thân Macro phá vỡ Các lệnh ASM trong thân Macro
Hồi phục các thanh ghi mà thân Macro đã phá vỡ ENDM
Ví dụ: Hãy khai báo 1 Macro tạo 1 lệnh mới cho phép xoá toàn bộ màn hình Cơ chế màn hình ở chế độ text, mỗi lần đặt mode cho màn hình thì màn hình sẽ bị xoá và con trỏ đứng ở góc trên bên trái.
Set mode:
mov al, số mode mov ah,0
int 10h Get mode: mov ah, 0fh int 10h
MACRO sẽ được xây dựng như sau: Clrscr MACRO
push ax
mov ah,0fh; get mode int 10h
mov ah,0
int 10h; set mode pop ax
ENDM
Ví dụ 2: Khai báo 1 Macro cho phép hiện 1 xâu lên màn hình Hienstring MACRO xau
push ax dx lea dx, xau mov ah,9 int 21h pop dx ax ENDM 4.2.5.2. Cách dùng MACRO đã được xác lập
Việc sử dụng MACRO đã được khai báo chỉ đơn giản là gọi tên MACRO. Ví dụ muốn gọi MACRO xóa màn hình ta chỉ cần gỗ lệnh:
MACRO và chương trình con khá giống nhau, tuy nhiên MACRO được khai bao ở đầu chương trình chính, trong khi đó chương trình con thường được khai báo ở cuối chương trình chính.
MACRO thường được sử dụng vì các nguyên nhân sau:
• Thực hiện MACRO nhanh hơn là dùng chương trình con vì tránh được hai lệnh là CALL và RET.
• MACRO linh hoạt hơn chương trình con vì nó có thể sử dụng các lệnh điều khiển điều kiện dịch và sự trao đổi thông số hình thức, chúng ta có thể tạo ra các mã lệnh khác nhau nhằm thực hiện các công việc gần giống nhau. Mà điều này thì chương trình con không làm được
• MACRO có thể lồng nhau Chú ý:
Cơ chế của chương trình dịch khi gặp lệnh mới Clrscr
Hienstring M1
- Điều gì xẩy ra nếu có lệnh nhảy trong Macro? Phải dùng Directive LOCAL
Ví dụ: X Macro LOCAL L1 L1: LOOP L1 ENDM 4.2.5.3. Ví dụ
Phần trên bạn đã tạo ra lib.asm để sử dụng chương trình con nhập xuất trong các chương trình ASM bạn tạo ra. Tuy nhiên, một chương trình không thể là hoàn thiện nếu thiếu đi các chỉ thị của chương trình, ví dụ “mời bạn nhập”, hay “kết quả là”. Để thay vì việc phải viết lại macro hiens, chúng ta sẽ tạo ra file lib2.asm chứa macro này, và mỗi khi cần dùng, bạn chỉ cần include lib2.asm.
Dưới đây chúng ta sẽ cùng làm lại ví dụ về tính tổng hai số: Tạo ra lib2.asm có nội dung như sau:
hiens macro s push ax push dx lea dx,s
mov ah,9 int 21h pop dx pop ax endm
Viết chương trình tính tổng 2 số nhập vào từ bàn phím sử dụng lib.asm và lib2.asm: .model small .stack 100h .data x1 db 10,"moi nhap: $" x2 db 10,"ket qua : $" .code include lib2.asm begin: mov ax,@data mov ds,ax ;hien xau moi nhap hiens x1 ;goi ctr nhap call vsn
;luu lai gtri nhap ;trong thanh ghi bx mov bx,ax ;hien xau moi nhap ;lan 2
hiens x1 ;goi ctr nhap call vsn ;ket qua nhap da ;nam trong ax ;ta tien hanh cong add ax,bx ;hien thi ket qua hiens x2
mov ah,4ch int 21h
include lib.asm end begin