这一次实验主要考察使用高级语言特性和宏结构来简化和提升汇编程序的效率。总的来说,这一次实验的难度相对上一次是要简单一些的,这是因为有了高级语言特性的辅助,我们可以大幅的减少代码行数了,而且可读性也显著地提高了。
话不多说,直接来看看本次的实验内容。
实验内容
(1)针对下述条件汇编代码,将之转换为正常的汇编指令,并采用 debug 进行调试,并结合不同的数据,进行结果展示。
.if(x==5) && (ax!=bx)
inc ax
.endif
(2) 实现下述程序段,比较汇编程序生成的代码序列有何不同:
.while ax!=10
mov [bx], ax
inc bx
inc bx
inc ax
.endw
.repeat
mov [bx], ax
inc bx
inc bx
inc ax
.until ax==10
(3) 定义一个宏 LOGICAL,代表 4 条逻辑运算指令:AND、OR、XOR、TEST,注意:
需要利用 3 个形式参数,并给出一个宏调用和展开的例子,编写代码,并调
试,展示结果。
(4) 定义一个宏 MOVESTR strN、 DSTR、SSTR,将 strN 个字符从一个字符区 SSTR传送到另一个字符区 DSTR,编写代码,并给出具体调用实例。
(5) 利用重复汇编方法定义一个数据区,数据区有 100 个双字,每个双字的高字部分依次是 2,4,6,….200,低字部分都是 0,展示结果。
(6) 利用宏结构完成以下功能:如果名为 byteX 的数据大于 5 时,指令“ADD AX,AX”将汇编 10 次,否则什么也不汇编。
(7) 将例 4.7 的大写字母转换为小写字母用宏完成。原程序如下:
对应程序和主要问题
(2) 直接观察生成的.LST文件有什么区别即可。
(3)注意到汇编宏结构有一个非常好的地方:指令也可以作为赞数传递,所以该宏如下定义即可:
logical macro op,r1,r2
op r1,r2
endm
因为汇编的宏在这里和高级语言的宏一样,只是单纯把参数放在他们对应的位置而已。
(4)这个宏可以使用串操作指令来实现等价于C中strcpy()的操作。
movestr macro strN,dstr,sstr
.repeat
movsb dstr,sstr
dec strN
.until strN==0
(5)这里的重复汇编比较特殊,给出一个低字部分依次为2,4,6,……,200的例子。
.data
n=2
rept 100
dd n
n=n+2
n=n<<8
endm
(6)使用条件判断嵌套重复汇编即可。注意,这里不能使用条件汇编,除非bytex是一个在运行前可以确定的量。
myMacro MACRO byteX
.IF (BYTEX>5)
REPT 10
add ax, ax
ENDM
.ENDIF
ENDM
(7)注意事项都在注释之中。
Change macro buffer
lea bx,buffer
again: mov al,[bx]
cmp al,'$' ;若到达字符串结尾,退出
je done
cmp al,'A' ;判断是否大于A
jae next1
jmp done1
next1: cmp al,'Z' ;判断是否小于Z
ja done1
add al,20h ;满足,大写转小写
mov byte ptr [bx],al
done1: inc bx ;进入下一个字符
jmp again
done:
endm
总结
本次实验不难,但是重复汇编和条件汇编的格式比较特殊可以注意一下。