首页
社区
课程
招聘
[成果2.4]逆序排列字符串&字符串大写转换成小写&字符串小写转换成大写
发表于: 2008-1-8 21:10 11733

[成果2.4]逆序排列字符串&字符串大写转换成小写&字符串小写转换成大写

2008-1-8 21:10
11733
[课题2.4]汇编入门小程序联系3
课题要求:编写3个小程序
1.  逆序排列字符串
编写一个通用的子程序来实现逆序排列字符串这个功能。
子程序描述
名称:revers_str
功能:将一个指定的字符串逆序排列
参数:ds:si指向字符串的首地址
返回:无
应用举例:将字符串I Love Masm! 逆序排列并输出屏幕查看结果。

分析:程序交换算法很简单,就是定义一个头指针和一个尾指针指向字符串头尾,然后开始交换,如果相遇或交叉则表示字符串逆序完成。

;=====================================
;filename:top2o4a.asm
;purpose:逆序排列字符串
;=====================================

assume cs:code,ss:stack,ds:data

stack segment
 dw 64 dup(?)
stack ends

data segment
 str    db 'I Love Masm!',0
data ends

code segment
start:
	mov ax,data	             
	mov ds,ax

	mov ax,stack
	mov ss,ax
	mov sp,128
	
	lea si,str	
	mov dh,5
	mov dl,1
	mov cl,11b
	call show_str
	
	lea si,str
	call revers_str	
	
	lea si,str
	mov dh,6
	mov dl,1
	mov cl,11b
	call show_str
	
	mov ax,4c00h
	int 21h

;======================================
;名称:str_len
;功能:求一个字符串的长度
;参数:ds:si指向字符串的首地址
;返回:(cx)=字符串的长度
;======================================
str_len:
	push ax
	push si
 	mov ax,0
s1:
	mov ch,ds:[si]
	mov cl,0
	jcxz ok1
	inc ax
	inc si
	jmp short s1
ok1:
	mov cx,ax
	pop si
	pop ax
	ret
;======================================
;名称:revers_str
;功能:将一个指定的字符串逆序排列
;参数:ds:si指向字符串的首地址
;返回:无
;======================================
revers_str:
	push ax
	push bx
	push cx
	push dx
	push si
	push di

	call str_len 
	mov di,cx
	dec di
	mov bx,2
	mov ax,cx
	mov dx,0
	div bx
	mov cx,ax

s2:
	mov al,ds:[si]		
	mov ah,ds:[di]
	mov ds:[si],ah
	mov ds:[di],al
	inc si
	dec di
	loop s2
	
	pop di
	pop si
	pop dx
	pop cx
	pop bx
	pop ax
	ret

;===========================================================
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
;	(cl)=颜色,ds:si指向字符串的首地址
;返回:无
;===========================================================

show_str: 
	push dx
	push si
	push di
	push cx
	push ax

        mov ax,0b800h
        mov es,ax
	mov ax,160
	mul dh
        mov dh,0
        add ax,dx
        add ax,dx
	sub ax,2
	mov di,ax
        mov ah,cl
output:	
        mov ch,ds:[si]
        mov cl,0
	jcxz ok

        mov byte ptr es:[di],ch
        mov byte ptr es:[di+1],ah
	inc si
	inc di
	inc di
        jmp short output
ok:
	pop ax
	pop cx
	pop di
	pop si
	pop dx
	ret
code ends
end start

       
运行结果



2.  字符串大写转换成小写
字符串大小写转换是日常经常用到的功能,编写一个通用的接口实现大写转换成小写的功能,这个接口使我们更灵活的处理字符串的大小写的转换。字符串必须以0结束。
子程序描述
名称:lowercase
功能:将一个指定的字符串转换成成小写的形式
参数:ds:si指向字符串的首地址
返回:无
应用举例:将字符串I Love 80X86 Assembly Language 转换为小写形式,并输出屏幕查看转换后的字符串。

分析:子程序主要算法是判断是否是字符,如果不是则不处理,否则将该字符的D5位置1,则可转换为相应的小写字母。

;=====================================
;filename:top2o4b.asm
;purpose:字符串大写转换成小写
;=====================================

assume cs:code,ss:stack,ds:data

stack segment
 dw 64 dup(?)
stack ends

data segment
 str    db 'I Love Win32 Assembly Language!',0
data ends

code segment
start:
	mov ax,data
	mov ds,ax

	mov ax,stack
	mov ss,ax
	mov sp,128
	
	lea si,str
	mov dh,5
	mov dl,1
	mov cl,11b
	call show_str
	
	lea si,str
	call capital	
	
	lea si,str
	mov dh,6
	mov dl,1
	mov cl,11b
	call show_str
	
	mov ax,4c00h
	int 21h

;================================================
;名称:capital
;功能:将一个指定的字符串转换成大写的形式
;参数:ds:si指向字符串的首地址
;返回:无
;================================================
capital:
	push cx
	push si
s0:
	mov ch,ds:[si]
	mov cl,0
	jcxz ok0

	cmp byte ptr ds:[si],'a'
	jc next0
	cmp byte ptr ds:[si],'z'
	jnc t0	
	jmp short next1
t0: 
	cmp byte ptr ds:[si],'z'
	jz next1
	
next0:
	cmp byte ptr ds:[si],'A'
	jc next2
	cmp byte ptr ds:[si],'Z'
	jnc t1
	jmp short next1
t1:
	cmp byte ptr ds:[si],'Z'
	jz next1
	jmp short next2
	
next1:
	and byte ptr ds:[si],11011111b
next2:
	inc si
	jmp short s0
ok0:
	pop si
	pop cx
	ret

;===========================================================
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
;	(cl)=颜色,ds:si指向字符串的首地址
;返回:无
;===========================================================
show_str: 
	push dx
	push si
	push di
	push cx
	push ax

        mov ax,0b800h
        mov es,ax
	mov ax,160
	mul dh
        mov dh,0
        add ax,dx
        add ax,dx
	sub ax,2
	mov di,ax
        mov ah,cl
output:	
        mov ch,ds:[si]
        mov cl,0
	jcxz ok

        mov byte ptr es:[di],ch
        mov byte ptr es:[di+1],ah
	inc si
	inc di
	inc di
        jmp short output
ok:
	pop ax
	pop cx
	pop di
	pop si
	pop dx
	ret
code ends
end start	



运行结果:



3.  字符串小写转换成大写
字符串大小写转换是日常经常用到的功能,编写一个通用的接口实现大写转换成小写的功能,这个接口使我们更灵活的处理字符串的大小写的转换。字符串必须以0结束。
子程序描述
名称:capital
功能:将一个指定的字符串转换成大写的形式
参数:ds:si指向字符串的首地址
返回:无
应用举例:将字符串I Love Win32 Assembly Language转换为大写形式,并输出屏幕查看转换后的字符串。

分析:子程序主要算法是判断是否是字符,如果不是则不处理,否则将该字符的D5位置0,则可转换为相应的大写字母,子程序与上面子程序的差别是非常小的,通过源代码可以看出来。

;=====================================
;filename:top2o4c.asm
;purpose:字符串小写转换成大写
;=====================================

assume cs:code,ss:stack,ds:data

stack segment
 dw 64 dup(?)
stack ends

data segment
 str    db 'I Love 80X86 Assembly Language!',0
data ends

code segment
start:
	mov ax,data
	mov ds,ax

	mov ax,stack
	mov ss,ax
	mov sp,128
	
	lea si,str
	mov dh,5
	mov dl,1
	mov cl,11b
	call show_str
	
	lea si,str
	call lowercase	
	
	lea si,str
	mov dh,6
	mov dl,1
	mov cl,11b
	call show_str
	
	mov ax,4c00h
	int 21h

;================================================
;名称:lowercase
;功能:将一个指定的字符串转换成成小写的形式
;参数:ds:si指向字符串的首地址
;返回:无
;================================================
lowercase:
	push cx
	push si
s0:
	mov ch,ds:[si]
	mov cl,0
	jcxz ok0

	cmp byte ptr ds:[si],'a'
	jc next0
	cmp byte ptr ds:[si],'z'
	jnc t0	
	jmp short next1
t0: 
	cmp byte ptr ds:[si],'z'
	jz next1
	
next0:
	cmp byte ptr ds:[si],'A'
	jc next2
	cmp byte ptr ds:[si],'Z'
	jnc t1
	jmp short next1
t1:
	cmp byte ptr ds:[si],'Z'
	jz next1
	jmp short next2
	
next1:
	or byte ptr ds:[si],00100000b
next2:
	inc si
	jmp short s0
ok0:
	pop si
	pop cx
	ret

;===========================================================
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),
;	(cl)=颜色,ds:si指向字符串的首地址
;返回:无
;===========================================================
show_str: 
	push dx
	push si
	push di
	push cx
	push ax

        mov ax,0b800h
        mov es,ax
	mov ax,160
	mul dh
        mov dh,0
        add ax,dx
        add ax,dx
	sub ax,2
	mov di,ax
        mov ah,cl
output:	
        mov ch,ds:[si]
        mov cl,0
	jcxz ok

        mov byte ptr es:[di],ch
        mov byte ptr es:[di+1],ah
	inc si
	inc di
	inc di
        jmp short output
ok:
	pop ax
	pop cx
	pop di
	pop si
	pop dx
	ret
code ends
end start	


运行结果

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好难得的一个16位的好东东
占位学习
2008-1-9 23:39
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
好,代码条理清晰,易读。
2008-1-10 08:43
0
游客
登录 | 注册 方可回帖
返回
//