6,有段程式,很有规律,但却极无效率: X1: TEST AH,1 JZ X2 MOV BUF1,BL X2: TEST AH,2 JZ X3 MOV BUF2,DX ; 凡双数用DX,单数用BL X3: TEST AH,4 JZ X4 MOV BUF3,BL X4: .. ; 以下各段与上述程式相似 X8: .. 这种金玉其表的程式,最没有实用价值,改的方法应由缓冲器着手,先安排成序列,由小而大如: BUF1 DB ? BUF2 DW ? BUF3 DB ? BUF4 DW ? .. 然后,程式改为: MOV DI,OFFSET BUF1 ; 第一个缓冲器 MOV AL,BL MOV CX,4 X1: SHR AH,1 JZ X2 STOSB X2: SHR AH,1 JZ X3 MOV [DI],DX INC DI INC DI X3: LOOP X1
7,回路最怕千回百转,不畅不顺,如: SUB AH,AH ABCD: CMP AL,BL JB ABCD1 SUB AL,BL INC AH JMP ABCD ABCD1: .. 以上 ABCD1这个入口是多余的,下面就好得多: MOV AH,-1 ABCD: INC AH SUB AL,BL JA ABCD ADD AL,BL ; 还原 ..
8,当处理字码时,需要字母的序数,有这样的写法: CMP AL,60H JA ABCD1 SUB AL,40H ; 大写字母 ABCD: .. ABCD1: SUB AL,60H ; 小写字母 JMP ABCD 要知道字母码的特色在于大写为 40H 至4AH,小写为60H 至6AH ,以上程式,其实只要一个指令就可以了: AND AL,1FH 简单明瞭!
9,大多数的程式在程式师自己测试下很少发生错误,而一旦换一另个人执,就会发现错误百出。 其原因在于写程式者已经假定了正确的情况,当然不会以明知为错误的方式操作。可是换了一个人,没有先入为主的成见,很可能输入了「不正确」的资料,结果是问题丛生。 要知道真正的使用者,绝非设计者本人,在操作过程中,按键错误在所难免。这种错误应该在程式中事先加以检查,凡是输入资料有「正确、错误」之别者,错误性资料一定要事先加以排除。 这样做看起来似乎程式不够精简,可是正确的重要性远在精简之上。一旦发生了错误,再精简的程式也没有使 用价值。 此外,在程式中常有加、减的运算,这时也应该作正确性检查,否则会发生上述同样的问题。
三、指令应用要灵活
有一段很简单的程式,其写作的方法甚多,但是指令应用的良窳,会使得程式的效率相去天上地下,难以估计。 这段程式的用途,是要将一段资料中,英文字符大、小写相互转换。当然,转换的选择要由使用者决定,在下面程式且略去使用介面,假设已得知转换的方式。 设资料在 DS:SI中,资料长度=CX ,大写转小写时BL=0,反之,则BL=1。 我见过一种写法,简直无法原谅: 1: LOOP1: 2: CALL CHANGE 3: JC LOOP11 4: ADD AL,20H 5: JMP SHORT LOOP12 6: LOOP11: 7: SUB AL,20H 8: LOOP12: 9: MOV [SI-1],AL 10: LOOP LOOP1 11: RET 12: CHANGE: 13: LODSB 14: OR BL,BL 15: JZ CHANGS 16: CMP AL,61H 17: JB CHARET 18: CMP AL,7AH 19: JA CHARET 20: STC 21: CHARET: 22: RET 23: CHANGS: 24: CMP AL,41H 25: JB CHARET 26: CMP AL,5AH 27: JA CHARET 28: CLC 29: RET 这种程式错在把由12到29的程式写得太长,共 25B,有共用的价值,于是作为子程式调用。
 
2/2 首页 上一页 1 2 |