回 帖 发 新 帖 刷新版面

主题:急!请教一道宏扩展的题目.

写出宏扩展后的等效源程序段

SHIFT MACRO   RR,COUNT 
 MOV  AX,COUNT 
 CMP  RR , 64 
 JG   NEXT 
 MOV  CL,3 
 SHR  AX,CL 
 JMP   NEXT1
NEXT: CMP   RR,96 
 JG  NEXT1 
 MOV  CL,6 
 SHR  AX,CL 
NEXT1: ENDM 
宏调用为:SHIFT  15,7FFFH
          SHIFT  80,9FFFH


mov ax,7fffh
CMP  15 , 64 
 JG   NEXT 
 MOV  CL,3 
 SHR  AX,CL 
 JMP 
NEXT: CMP   15,96 
 JG  NEXT1 
 MOV  CL,6 
 SHR  AX,CL 

mov ax,9fffh
CMP  80, 64 
 JG   NEXT 
 MOV  CL,3 
 SHR  AX,CL 
 JMP NEXT1
NEXT: CMP  80,96 
 JG  NEXT1 
 MOV  CL,6 
 SHR  AX,CL 

这样对吗? 中间CMP句对吗?参数代入后,没执行的语句要写吗?
 

回复列表 (共3个回复)

沙发

.model small
.stack
.data
.code
 SHIFT MACRO   RR,COUNT
 local next,next1     ;主程序多次调用宏,其中的标号必须定义为LOCAL!
 MOV  AX,COUNT
 CMP  RR , 64
 JG   NEXT
 MOV  CL,3
 SHR  AX,CL
 JMP   NEXT1
NEXT: CMP   RR,96
 JG  NEXT1
 MOV  CL,6
 SHR  AX,CL
NEXT1:
 ENDM
.startup
mov bx,15          ;宏展开时用到CMP指令,不允许用两个立即数,所以必须用一个寄存器
SHIFT  bx,7FFFH
mov bx,80
SHIFT  bx,9FFFH
 .exit 0
 end

汇编时产生的列表文件部分内容如下,可以看到宏扩展情况:

0017  BB 000F            mov bx,15
                SHIFT  bx,7FFFH
 001A  B8 7FFF             1     MOV  AX,7FFFH
 001D  83 FB 40             1     CMP  bx , 64
 0020  7F 06             1     JG   ??0000
 0022  B1 03             1     MOV  CL,3
 0024  D3 E8             1     SHR  AX,CL
 0026  EB 09             1     JMP   ??0001
 0028  83 FB 60             1    ??0000: CMP   bx,96
 002B  7F 04             1     JG  ??0001
 002D  B1 06             1     MOV  CL,6
 002F  D3 E8             1     SHR  AX,CL
 0031                 1    ??0001:
 0031  BB 0050            mov bx,80
                SHIFT  bx,9FFFH
 0034  B8 9FFF             1     MOV  AX,9FFFH
 0037  83 FB 40             1     CMP  bx , 64
 003A  7F 06             1     JG   ??0002
 003C  B1 03             1     MOV  CL,3
 003E  D3 E8             1     SHR  AX,CL
 0040  EB 09             1     JMP   ??0003
 0042  83 FB 60             1    ??0002: CMP   bx,96
 0045  7F 04             1     JG  ??0003
 0047  B1 06             1     MOV  CL,6
 0049  D3 E8             1     SHR  AX,CL
 004B                 1    ??0003:

板凳


明白了,谢谢!

3 楼


JXX 标号,与,JMP 标号,以下的某些语句,不管有没执行,宏展开时总要写,
这和IF。。。ELSE。。。END是不一样的,对吧。后一种情况视实际的参数而定。

我来回复

您尚未登录,请登录后再回复。点此登录或注册