鱼C论坛

 找回密码
 立即注册
查看: 3221|回复: 7

多一字节也嫌多,多一时钟更嫌慢【转】

[复制链接]
发表于 2011-2-10 18:53:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为了便于叙述,下面以"T"表「时钟脉冲」; "B"表字符。其中时钟脉冲T = 1 / 振荡频率


  1. 一、避免浪费速度及空间

  2.     汇编语言的效率建立在指令的运用上,如果不用心体会下列指令的有效用法,汇编
  3. 语言的优点就难以发挥。
  4.   1,    CALL    ABCD
  5.         RET
  6.     这种写法,是没有用心的结果,共享了 4B,23T+20T,完全相同的功能,如:
  7.         JMP     ABCD  或
  8.         JMP     SHORT ABCD
  9.     却只要 2-3B,15T。
  10.         此外,上述的CALL XXXX 是调用子程序的格式,在直觉认知上,与JMP XXXX完
  11. 全不同。对整体设计而言,是不可原谅的错误,侦错的时候,也很难掌握全盘的理念。
  12.         尤其是在精简程序的时候,很可能会遇到 ABCD 这个子程序完全独立,是则把
  13. 这段程序直接移到 ABCD 前,不仅能节省空间,而且使程序具有连贯性,易读易用。

  14.   2,    MOV     AX,0
  15.     同样,这条指令要 3B,4T,如果用:
  16.         SUB     AX,AX 或
  17.         XOR     AX,AX
  18.     只要 2B,3T, 唯一要注意的是,后者会影响旗号,所以不要用在有旗号判断的指
  19. 令前面。
  20.         在程序写作中,经常需要将寄存器或缓冲器清为0,有效的方法,是使某寄存
  21. 器保持为0,以便随时应用。
  22.         因为,MOV [暂存器],[暂存器] 只要 2B,2T, 即使是清缓冲器,也比直接填
  23. 0为佳。
  24.         只是,如何令寄存器保持0,则要下一番功夫了。
  25.         还有一种情况,就是在一回路中,每次都需要将 AH 清0,此时对速度要求很
  26. 严,有一个指令 CBW 原为将一 个字符转换为双字符,只需 1B,2T 最有效率。可是应
  27. 该注意,此时 AL 必须小于 80H,否则 AH 将成为负数。
  28.   3,    ADD     AX,AX
  29.     需要 2B,3T不如用:
  30.         SHL     AX,1
  31.     只要2B,2T。

  32.   4,    MOV     AX,4
  33.     除非这时 AH 必为0,否则,应该用:
  34.         MOV     AL,4
  35.     这样会少一个字符。

  36.   5,    MOV     AL,46H
  37.         MOV     AH,0FFH
  38.     为什么不写成:
  39.         MOV     AX,0FF46H
  40.     不仅省了一个字符,四个时钟,而且少打几个字母!

  41.   6,    CMP     CX,0
  42.     需要 4B,4T, 但若用:
  43.      OR      CX,CX
  44.     完全相同的功能,但只要 2B,3T。再若用:
  45.         JCXZ    XXXX
  46.     则一条指令可以替代两条,时空都省。不幸这条指令限用于CX ,对其他暂器无效。

  47.   7,    SUB     BX,1
  48.     这更不能原谅,4B,4T无端浪费。
  49.         DEC     BX
  50.     现成的指令,1B,2T为何不用?
  51.         如果是
  52. SUB     BL,1
  53. 也应该考虑此时 BH 的情况,若可以用
  54.   DEC     BX
  55. 取代,且不影响后果,亦不妨用之。

  56.   8,    MOV     AX,[SI]
  57.         INC     SI
  58.         INC     SI
  59.     这该挨骂了,一定是没有记熟指令,全部共4B,21T。
  60.         LODSW
  61.     正是为这个目的设计,却只要 1B,16T。

  62.   9,    MOV     CX,8
  63.         MUL     CX
  64.         写这段程序之时应先养成习惯,每遇到乘、除法,就该打一下算盘。因为它们
  65. 太浪费时间。8位的要七十多个时钟,16位则要一百多。所以若有可能,尽量设法用简
  66. 单的指令取代。
  67.         SHL     AX,1
  68.         SHL     AX,1
  69.         SHL     AX,1
  70.      原来要 5B,137T,现在只要 6B,6T。如果CX能够动用的话,则写成:
  71.    MOV     CL,3
  72.    SHL     AX,CL
  73.      这样更佳,而且CL之值越大越有利。用CL作为计数专 用暂存器,不仅节省空间,
  74. 且因指令系在 CPU中执行,速 度也快。
复制代码

评分

参与人数 2荣誉 +2 鱼币 +5 收起 理由
LinuxDeepin + 5 谢谢楼主,这些很有用,以后写代码会写两遍.
nofriend + 2 我很赞同

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-2-13 13:44:02 | 显示全部楼层
恩,有时候虽然是一个时间脉冲的差距,但由于迭代却会产生几万倍的效率差~从小处做起!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-2-13 16:17:24 | 显示全部楼层
看不懂
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-3-7 12:14:05 | 显示全部楼层
学习了 !!!这个挺有用的!以后要多多运用一下
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-3-8 11:15:47 | 显示全部楼层
高手...............
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-9-15 10:48:57 | 显示全部楼层
淡定...淡定...淡定...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-15 22:44:30 | 显示全部楼层
学习了 !!!这个挺有用的!以后要多多运用一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-4 16:02:32 | 显示全部楼层
这是我见过的最好的论坛!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 17:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表