|

楼主 |
发表于 2011-7-4 16:27:03
|
显示全部楼层
本帖最后由 linha0 于 2011-7-4 17:45 编辑
在做10.11的时候,程序是这样设计的:
- assume cs:code,ds:data
- data segment
- db 'conversation',0
- data ends
- code segment
- start:
- mov ax,data
- mov ds,ax
-
- mov si,0
- mov cx,12
- s: mov al,[si]
- call uppercase ;调用子程序1
- mov [si],al
-
- inc si
- loop s
-
- mov ax,4c00h
- int 21h
-
- uppercase: ;子程序1:利用AL保存参数,然后在子程序中转化,最后返回AL
- and al,11011111b
- ret
- code ends
- end start
复制代码
1、最先是以功能最小化为目的,但是这样做,每次调用子程序1都需要重写一段循环的指令。感觉太麻烦了,于是就用子程序2来代替子程序1:
- uppercase2:
- mov al,[si]
- and al,11011111b
- mov [si],al
- inc si
- loop uppercase2
- ret
复制代码
2、这样解决了子程序1的代码可重用性的问题了。但是在接下来的10.12中,需要把子程序2的功能改造成另一种相似的功能。子程序3:
- uppercase3:
- mov cl,[si]
- mov ch,0
- jcxz ok;不需要在子程序外面再设置CX的值
-
- and cl,11011111b
- mov [si],cl
- inc si
-
- ok: ret
复制代码
3、如果还需要再改造一个相似功能的子程序;又或者,在复制“and cl,11011111b” 这类功能相同代码相似的指令时出了错,会很麻烦的。如果这种子程序再多一些呢?
4、于是,就有了最终版程序代码(这让我想起了我的一个想当年的同事)
- assume cs:code,ds:data
- data segment
- db 'conversation',0
- data ends
- code segment
- start:
- mov ax,data
- mov ds,ax
- mov si,0
- mov cx,12
- call uppercase2;调用子程序2,10.11题
-
- mov ax,4c00h
- int 21h
- uppercase: ;子程序1:利用AL保存参数,然后在子程序中转化,最后返回AL
- and al,11011111b
- ret
- uppercase2:
- mov al,[si]
- call uppercase;调用子程序1
- mov [si],al
- inc si
- loop uppercase2
- ret
- uppercase3:
- mov cl,[si]
- mov ch,0
- jcxz ok;不需要在子程序外面再设置CX的值
- mov al,cl
- call uppercase;调用子程序1
- mov [si],al
- inc si
- jmp short uppercase3
- ok: ret
- code ends
- end start
复制代码
5、可是,这个代码怎么看怎么不爽。于是,又学我的同事在后面再加上“完美”两个字,最终完善版(搞笑一下):- assume cs:code,ds:data
- data segment
- db 'conversation',0
- data ends
- code segment
- start:
- mov ax,data
- mov ds,ax
- mov si,0
- mov cx,12
- call uppercase2;调用子程序2,10.11题
-
- mov ax,4c00h
- int 21h
- uppercase: ;子程序1:利用AL保存参数,然后在子程序中转化,最后返回AL
- and byte ptr [si],11011111b
- ret
- uppercase2:
- call uppercase;调用子程序1
- inc si
- loop uppercase2
- ret
- uppercase3:
- mov cl,[si]
- mov ch,0
- jcxz ok;不需要在子程序外面再设置CX的值
- call uppercase;调用子程序1
- inc si
- jmp short uppercase3
- ok: ret
- code ends
- end start
复制代码
6、再次删掉一些碍眼的东东后,这下爽快了。可是,我回头一看,于是彻底的{:2_36:}………………
|
|