多一字节也嫌多,多一时钟更嫌慢【转】
为了便于叙述,下面以"T"表「时钟脉冲」; "B"表字符。其中时钟脉冲T = 1 / 振荡频率一、避免浪费速度及空间
汇编语言的效率建立在指令的运用上,如果不用心体会下列指令的有效用法,汇编
语言的优点就难以发挥。
1, CALL ABCD
RET
这种写法,是没有用心的结果,共享了 4B,23T+20T,完全相同的功能,如:
JMP ABCD或
JMP SHORT ABCD
却只要 2-3B,15T。
此外,上述的CALL XXXX 是调用子程序的格式,在直觉认知上,与JMP XXXX完
全不同。对整体设计而言,是不可原谅的错误,侦错的时候,也很难掌握全盘的理念。
尤其是在精简程序的时候,很可能会遇到 ABCD 这个子程序完全独立,是则把
这段程序直接移到 ABCD 前,不仅能节省空间,而且使程序具有连贯性,易读易用。
2, MOV AX,0
同样,这条指令要 3B,4T,如果用:
SUB AX,AX 或
XOR AX,AX
只要 2B,3T, 唯一要注意的是,后者会影响旗号,所以不要用在有旗号判断的指
令前面。
在程序写作中,经常需要将寄存器或缓冲器清为0,有效的方法,是使某寄存
器保持为0,以便随时应用。
因为,MOV [暂存器],[暂存器] 只要 2B,2T, 即使是清缓冲器,也比直接填
0为佳。
只是,如何令寄存器保持0,则要下一番功夫了。
还有一种情况,就是在一回路中,每次都需要将 AH 清0,此时对速度要求很
严,有一个指令 CBW 原为将一 个字符转换为双字符,只需 1B,2T 最有效率。可是应
该注意,此时 AL 必须小于 80H,否则 AH 将成为负数。
3, ADD AX,AX
需要 2B,3T不如用:
SHL AX,1
只要2B,2T。
4, MOV AX,4
除非这时 AH 必为0,否则,应该用:
MOV AL,4
这样会少一个字符。
5, MOV AL,46H
MOV AH,0FFH
为什么不写成:
MOV AX,0FF46H
不仅省了一个字符,四个时钟,而且少打几个字母!
6, CMP CX,0
需要 4B,4T, 但若用:
OR CX,CX
完全相同的功能,但只要 2B,3T。再若用:
JCXZ XXXX
则一条指令可以替代两条,时空都省。不幸这条指令限用于CX ,对其他暂器无效。
7, SUB BX,1
这更不能原谅,4B,4T无端浪费。
DEC BX
现成的指令,1B,2T为何不用?
如果是
SUB BL,1
也应该考虑此时 BH 的情况,若可以用
DEC BX
取代,且不影响后果,亦不妨用之。
8, MOV AX,
INC SI
INC SI
这该挨骂了,一定是没有记熟指令,全部共4B,21T。
LODSW
正是为这个目的设计,却只要 1B,16T。
9, MOV CX,8
MUL CX
写这段程序之时应先养成习惯,每遇到乘、除法,就该打一下算盘。因为它们
太浪费时间。8位的要七十多个时钟,16位则要一百多。所以若有可能,尽量设法用简
单的指令取代。
SHL AX,1
SHL AX,1
SHL AX,1
原来要 5B,137T,现在只要 6B,6T。如果CX能够动用的话,则写成:
MOV CL,3
SHL AX,CL
这样更佳,而且CL之值越大越有利。用CL作为计数专 用暂存器,不仅节省空间,
且因指令系在 CPU中执行,速 度也快。 恩,有时候虽然是一个时间脉冲的差距,但由于迭代却会产生几万倍的效率差~从小处做起! 看不懂 学习了 !!!这个挺有用的!以后要多多运用一下 高手............... 淡定...淡定...淡定... 学习了 !!!这个挺有用的!以后要多多运用一下 这是我见过的最好的论坛!
页:
[1]