匯編語言——宏匯編與重復匯編和條件匯編


宏匯編

意義:避免了重復編寫,使源程序更加簡潔、易讀。

1.宏定義

宏指令:將在源程序中多次使用到同一個程序段定義成一個“指令”

格式:

 1 ;無參數
 2 宏名 macro
 3 
 4   宏體
 5 
 6 endm
 7 
 8 ;有參數
 9 宏名 macro 形參1,形參2,形參...
10 
11   宏體
12 
13 endm

例子:

1 ;將兩個內存單元的內容相互交換
2 exchange macro mem1,mem2,reg
3     mov reg,mem1
4     xchg reg,mem2  ;xchg為交換指令,用於兩個寄存器,寄存器和內存之間的內容的交換
5     mov mem1,reg
6 endm

 

2.宏調用

含義:用宏指令名來代替原來的程序段

格式:

1 ;不帶參數
2 宏名
3 
4 
5 ;帶參數
6 宏名 實參1,實參2,實參....

 

3.宏展開

含義:宏匯編程序在匯編源程序時自動用宏指令的內容代替宏指令 。

 1 ;宏定義
 2   push4     macro
 3      push ax
 4           push bx
 5      push cx
 6      push dx
 7      endm
 8 
 9 exchange macro mem1,mem2,reg
10      mov reg,mem1
11      xchg reg,mem2
12      mov mem1,reg
13      endm; 設置數據段
14 
15 data    segment
16     da_w01    dw 1234h
17     da_w02    dw 5678h
18 data    ends; 設置堆棧段
19 
20 stack1   segment stack
21     dw 20h dup(?)
22 stack1    ends
23 
24 ;設置代碼段
25 coseg segment
26       assume cs:coseg,ds:data,ss:stack1
27 start:mov ax,data
28       mov ds,ax
29 30       push4             
31 ;宏指令語句
32   +   push ax
33   +   push bx
34   +   push cx
35   +   push dx
36 37      exchange da_w01,da_w02,cx ;宏指令語句
38   +  mov cx, da_w01
39   +  xchg cx, da_w02
40   +  mov da_w01,cx
41 42 coseg  ends
43        end start

 

連接操作符&

含義:宏展開時,對應形參的實參就與它前后的符號連接在一起

用途:修改某些符號

例子:

shift_var marco r_m,direct,count
                  mov cl,count
                  s&direct r_m,cl
                  endm

shift_var ax,hl,2的宏展開為: +
mov cl,2 + shl ax,cl

 

表達式操作符%

含義:告訴宏匯編程序獲取表達式的值,而不是獲取表達式文本本身

格式:%表達式

注意:這個操作符一般是出現在宏調用中,不允許出現在形參的前面

;宏定義
shif0 macro cnt
      mov cl,cnt
      endm
shif1 macro reg,direct,count
      shif0 %count
      s&direct reg,cl
      endm          


;宏調用
  shif1 ax,hl,2
  shif1 bl,ar,3
;宏展開
  shif1 ax,hl,2
  +   mov cl,2
  +   shl ax,cl
  shif1 bl,ar,3
  +    mov cl,3
  +    sar bl,cl

 

文本操作符<>

含義:把一個完整的實參括起來,作為一個單一的實參

注意:文本操作符還可以用來處理某些特殊的字符:如“;”和“&”。

exchange <byte ptr da_word1>,<byte ptr da_word2>,al
    宏展開時,替換的三條指令是:
    mov al,byte ptr da_word1
    xchg al,byte ptr da_word2
    mov byte ptr word1,al 
endm

 

字符操作符!

含義:“!”后的字符不作特別的操作符使用,而是以字符本身的意義進行處理。

如: “!&”表示&不作連接操作符用,只作符號&使用。“!%”表示%不作表達式操作符使用,只作百分號用。

prompt macro num,text
promp&num db '&text&'
endm

assume cs:code,ds:data

data segment
prompt 23,<expression !> 255>
data ends

code segment
start: mov ax,data
       mov ds,ax
       mov ax,4c00h
       int 21h
code ends
end start
;test_p.asm

 

 

宏解釋符

含義:說明后面的文本是注解

注意:宏注解符;;僅出現在宏定義中。

例子:

prompt macro num,text
promp&num db ‘&text&’  ;; prompt宏的定義
endm

assume cs:code,ds:data

data segment
prompt 23,<expression !> 255>
data ends

code segment
start: mov ax,data
       mov ds,ax
       mov ax,4c00h
       int 21h
code ends
end start
;test_p.asm

 

 local偽指令

意義:在宏定義中使用變量名和標號,為了避免在宏展開時產生多個相同的變量名或標號。

格式:local <符號表>

注意:宏展開時,local偽指令指定的變量、標號自動生成格式為“??XXXX”的符號,其中后四位順序使用0000~FFFF的十六進制數字。

delay macro reg  ;; reg為16位寄存器
local lop
push cx
mov cx,reg
lop: nop
     loop lop
pop cx
endm

assume cs:code
code segment
start: mov ax,5000
       delay ax
       mov ax,1000
       delay ax
       mov bx,2000
       delay bx
       mov ax,4c00h
       int 21h
code ends
end start

 

宏嵌套

1.宏定義嵌套

含義:一個宏定義中包含另一個宏定義。

應用:常常用這種宏定義嵌套來產生一些新的宏定義

jump  macro cond   ;;外層宏定義
J&cond&s macro dest ;;內層宏定義
         local next,exit
         J&cond next
         jmp exit
next:  jmp dest
exit:   
         endm
         endm
assume cs:code
code segment
start: mov ax,5
        cmp ax,5
        jump e ;;調用外層宏,生成內層宏定義
        jes disp  ;;調用內層宏,實現功能
        jmp finish 
       db 256 dup(0)
disp:  mov ax,0b800h
         mov es,ax
         mov al,'Y’
         mov es:[12*160+40*2],al
finish: mov ax,4c00h
         int 21h
code ends
end start  ;利用嵌套宏定義,實現長條件轉移。

 

2.宏定義內嵌套宏調用

含義:在一個宏定義的宏體內有宏調用

注意:被調用的宏指令必須是已定義的

delay_s macro reg
     local lop
     push cx
     mov cx,reg
lop: nop
     loop lop
     pop cx
endm
delay_m macro reg
     local s
     push cx
     mov cx,reg
s:  delay_s reg
     loop s
     pop cx
endm
assume cs:code
code segment
start: mov ax,500
        delay_m ax
        mov ax,4c00h
        int 21h
code ends
end start

 

宏定義與子程序的區別

相同點:1)簡化源程序的書寫。
        (2)節省編程工作量。

不同點: (1)宏指令並不節省目標程序,子程序節省目標代碼和存儲空間
         (2)宏指令的功能靈活,執行速度快;子程序的靈活性差些,執行
           速度也不如宏指令快   

 

重復匯編

rept偽指令

含義:將重復語句序列重復匯編,表達式的值為重復匯編的次數

格式:

rept 表達式
    重復語句序列
endm

例子:

 

 

irp偽指令

含義:將重復語句序列重復匯編,次數由實參的個數決定。

格式:

irp 形參,<實參1,實參2,...>
重復語句序列
endm

例子:

 

 

 

條件匯編

含義:匯編程序根據條件的不同匯編不同的程序段。

格式:

if xx 表達式
條件語句塊
else 
條件語句塊
endif

例子:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM