|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
为了便于叙述,下面以"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,[SI]
- 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中执行,速 度也快。
复制代码 |
评分
-
查看全部评分
|