XMU汇编实验06:高级汇编程序设计

这一次实验主要考察使用高级语言特性和宏结构来简化和提升汇编程序的效率。总的来说,这一次实验的难度相对上一次是要简单一些的,这是因为有了高级语言特性的辅助,我们可以大幅的减少代码行数了,而且可读性也显著地提高了。

话不多说,直接来看看本次的实验内容。

实验内容

(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

总结

本次实验不难,但是重复汇编和条件汇编的格式比较特殊可以注意一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值