|
主题 : : 实验11 编写字母转换子程序,欢迎交流!! [待解决] |
回复[ 9次 ]
点击[ 429次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-02-25 23:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:4
注册日期:2008-12-12 00:18 |
letterc:push ax
push cx
push si
mov ch,0
next:mov cl,[si]
jcxz over
mov al,[si]
cmp al,61h
jb pass
cmp al,7bh
ja pass
sub al,20h
mov [si],al
pass:inc si
jmp short next
over:pop si
pop cx
pop ax
ret
//很简单一个子程序就不作注释了! | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-02-26 11:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
|
|
|
|
|
[第2楼]
[ 回复时间:2009-03-02 11:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-10 07:42 |
一家之言:感觉使用jcxz over不如用后面的ja、jb等判断指令,程序结构更清晰。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-03-08 10:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-02-20 22:50 |
我也是用的jcxz判断是否为0,当然是受jcxz那一小节例子的影响。
楼上说“不如”是有道理,jcxz只能通过cx判断0,而cx又经常用作循环数,还是用cmp判断好。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-03-23 18:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2009-02-14 17:14 |
我觉的检测数据的时候不用寄存器来做中转 看我的:
letterc:
push cx
push si
mov ch,0
s:mov cl,[si]
jcxz over
cmp byte ptr [si],61h
jb next
cmp byte ptr [si],7bh
ja next
and byte ptr [si],11011111b
next:inc si
jmp short s
over:pop si
pop cx
ret | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-03-23 18:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2009-02-14 17:14 |
不过看了别人的算法以后 觉得还是用CMP来判断字符串结尾标志比较好 毕竟CX寄存器经常要用的 | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-03-23 18:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2009-02-14 17:14 |
参考后别人的算法的改良版:
letterc:
push si
mov ch,0
s:cmp byte ptr [si],0
je over
cmp byte ptr [si],'a'
jb next
cmp byte ptr [si],'z'
ja next
and byte ptr [si],11011111b
next:inc si
jmp short s
over:pop si
ret
发现原来CMP可以直接判断字符 这样就算字母的ASCII码那么辛苦了 | | |
|
|
|
|
[第7楼]
[ 回复时间:2009-03-30 22:17 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-08-21 22:38 |
assume cs:codesg,ds:datasg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Cde.",0
datasg ends
codesg segment
begin:mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
s:mov al,ds:[si]
cmp al,0
je ok
cmp al,27h
je s1
cmp al,2dh
je s1
cmp al,2eh
je s1
and al,11011111b
s1:mov ds:[si],al
inc si
loop s
ok:ret
codesg ends
end begin
我的看上去有你们的有点不同, | | |
|
|
|
|
[第8楼]
[ 回复时间:2009-03-30 22:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-08-21 22:38 |
|
|
|
|
|
[第9楼]
[ 回复时间:2009-03-30 22:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2008-08-21 22:38 |
改了下。。。。
-------------------------------------
assume cs:codesg,ds:datasg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Cde.",0
datasg ends
codesg segment
begin:mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
s:mov al,ds:[si]
cmp al,0
je ok
cmp al,61h
jb s1
cmp al,7ah
ja s1
and al,11011111b
s1:mov ds:[si],al
inc si
loop s
ok:ret
codesg ends
end begin | | |