【课后习题】
  1 编写一条宏指令CLRB,完成用空格符将一字符区中的字符取代的工作。字符区首地址及其长度为变元。

  

2 某工厂计算周工资的方法是每小时的工资率RATE乘以工作时间HOUR,另外每工作满十小时加奖金3元,工资总数存放在WAG中。请将月工资的计算编写成一条宏指令WAGES,并展开宏调用:

  

3 给定宏定义如下:
DIF MACRO X,Y
MOV AX,X
SUB AX,Y
ENDM
ABSDIF MACRO V1,V2,V3
LOCAL CONT
PUSH AX
DIF V1,V2
CMP AX,0
JGE CONT
NEG AX
CONT: MOV V3,AX
POP AX
ENDM
试展开以下调用,并判定调用是否有效。
(1) ABSDIF P1,P2,DISTANCE
(2) ABSDIF [BX],[SI],X[DI],CX
(3) ABSDIF [BX][SI],X[BX][SI],240H
(4) ABSDIF AX,AX,AX

  

4 试编制宏定义,要求把存储器中的一个用EOT字符结尾的字符串传送到另一个存储区中去。

  

5 宏指令BIN_SUB完成多个字节数据连减的功能:
   RESULT (A-B-C-D-L)
要相减的字节数据顺序存放在首地址为OPERAND的数据区中,减数的个数存放在COUNT单元中,最后结果存入RESULT单元。请编写此宏指令。

  

6 下面的宏指令CNT和INC1完成相继字存储:
CNT MACRO A,B
A&B DW ?
ENDM
INC1 MACRO A,B
CNT A,% B
B = B + 1
ENDM
请展开下列宏调用:
C = 0
INC1 DATA,C
INC1 DATA,C

  

7 宏指令STORE定义如下:
STORE MACRO X,N
MOV X+I,I
I = I + 1
IF I-N
STORE X,N
ENDIF
ENDM
试展开下列调用:
I = 0
STORE TAB,7


  

8 试编写非递归的宏指令,使其完成的工作与7.7题的STORE相同。

  

9 定义宏指令FINSUM:比较两个数X和Y (X、Y为数,而不是地址。),若 X>Y则执行SUMX+2*Y;否则执行SUM2*X+Y。

  

10 对于DOS功能调用,所有的功能调用都需要在AH寄存器中存放功能码,而其中有一些功能需要在DX中放一个值。试定义宏指令DOS21,要求只有在程序中定义了缓冲区时,汇编为:
MOV AH,DOSFUNC
MOV DX,OFFSET BUFF
INT 21H
否则,无MOV DX,OFFSET BUFF 指令,并展开以下宏调用:
DOS21 01
DOS21 0AH,IPFIELD