汇编语言的艺术-基本认识(二)
2007-04-25 09:30:09 来源:WEB开发网核心提示:若ABCD一定与EFGH连用,应将ABCD放在EFGH之前: ABCD: .. EFGH: .. 像这样,汇编语言的艺术-基本认识(二)(6),只要调用ABCD就够了,但这种情形多半是程式师的疏忽所致,更简单有效的方法,则是说明本段程式中某些暂存器将被破坏,如两个子程式必需独立使用,而上述连续调用的机会超过两次以上
若ABCD一定与EFGH连用,应将ABCD放在EFGH之前:
ABCD:
..
EFGH:
..
像这样,只要调用ABCD就够了,但这种情形多半是程式师的疏忽所致,如两个子程式必需独立使用,而上述连续调用的机会超过两次以上,则应该改为:
CALL ABCDEF
而ABCDEF则应为:
ABCDEF:
CALL ABCD
EFGH:
..
这样的写法速度不会变慢,而空间的节省则与调用的次数成正比。
12,常有些程式,当从缓冲器中取资料时,必须将暂存器高位置为0。如:
SUB AH,AH
MOV AL,BUFFER
这时应该将 BUFFER 先设为:
BUFFER DB ?,0
然后用:
MOV AX,WORD PTR BUFFER
如此,不但速度快了,空间也省了。
13,有时看来多了一个指令,但因为指令的特性,反而更为精简。如:
OR ES:[DI],BH
OR ES:[DI+1],BL
这样需要8B,32T,如果改用下面的指令:
XCHG BL,BH
OR ES:[DI],BX
XCHG BH,BL
则需7B,28T。
14,PUSH 及 POP 是保存暂存器原值的指令,都只需一个字元,但却很费时间。
PUSH 占 15T,POP 占12T,除非不得已,不可随便使用。有时由于子程式说明不清楚,程式师为了安全,又懒得检查,便把暂存器统统堆在堆栈上。尤其是在系统程式或子程式中,经常有到堆栈上堆、取的动作。实际上,花点功夫,把暂存器应用查清楚,就可以增进不少效率。
要知道,系统程式及某些子程式常常应用,有关速度的效率甚大,如果掉以轻心,就是不负责任!
保存原值的方法很多,其中较有效率的是放到一些不用的暂存器里。以我的经验,堆栈器用途最少,正好用作临时仓库。但最好的办法,还是把程式中暂存器的应用安排得合情合理,不要浪费,以免堆得太多。
还有一种方法,是在该子程式中,不用堆栈的手续,但另设一个入口,先将暂存器堆起,再来调用不用堆栈的子程式。这两个不同的入口,可以分别提供给希望快速处理,或需要保留暂存器原值者调用。
当然,更简单有效的方法,则是说明本段程式中某些暂存器将被破坏,而由调用者自行保存之。
更多精彩
赞助商链接