|
楼主 |
发表于 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:}………………
|
|