匯編語言功能字符串大小寫轉換實現實例詳解

問題1:將data段中的第一個字符串轉換成大寫,第二個字符串轉換成小寫

分析:

如何轉換成大小寫

如果利用ASCII碼進行轉換的話,需要判斷該字符是大寫還是小寫,匯編語言實現太過困難,可以對字符串的二進制進行分析。

在ASCII碼中,大寫字母的第五位為0,小寫字母的第五位為1,可以對位取反進行大小寫轉換

assume cs:code,ds:data
data segment
	db 'BaSiC'
	db 'InfoMaTion'
data ends
;------------------------------------
;做法一
code segment
start:	        mov ax,data
		mov ds,ax
		mov bx,0	;設置ds:bx指向數據段		
		mov cx,5	;對於第一個字符串進行循環轉換
s:		mov al,ds:[bx]
		and al,11011111B  ;將字符的第五位轉換成0,轉換成大寫字母
		mov ds:[bx],al
		inc bx
		loop s 
		mov bx,5	;指向第二個字符串
 		mov cx,11
s0:		mov al,ds:[bx]
		or al,00100000B	  ;將字符的第五位轉換成1,轉換成小寫字母
		mov ds:[bx],al
		inc bx
		loop s 
		mov ax,4c00h
		int 21h
code ends
;------------------------------------
;做法二,改進版:利用bx+idata實現代碼的簡化
 
code segment
start:	        mov ax,data
		mov ds,ax
		mov bx,0
		mov cx,5
s:		mov al,ds:[bx]
		and al,11011111b
		mov ds:[bx],al
		mov al,ds:[bx+5]
		or al,00100000b
		mov ds:[bx+5],al
		inc bx
		loop s 
code ends
;------------------------------------
end start

問題2:將data段中每個單詞的頭一個字母改成大寫字母

分析: 如何實現循環

該段數據是結構化的數據,則可以看做成一個二維數組,用一個變量定位行,用一個常量定義第一個字母

assume cs:code,ds:data
data segment
	db '1. file         '
	db '2. edit         '
	db '3. search       '
data ends
code segment
start:	        mov ax,data
		mov ds,ax
		mov bx,0	;ds:bx指定數據段,同時bx作為定義行的變量 
		mov cx,3
s:		mov al,ds:[bx+3]	;3作為常量,定義第一個字母
		and al,11011111b
		mov ds:[bx+3],al
		add bx,16
		loop s 
		mov ax,4c00h
		int 21h
code ends
 
end

問題3:將data段中每個單詞改為大寫字母

分析: 1、對於這種結構化的數據,不僅需要一個變量定義行,同時也需要一個變量定義列

assume cs:code,ds:data,ss:stack
data segment
	db 'ibm             '
	db 'dec             '
	db 'vax             '
data ends 
;--------------------------------------------
;做法一
code segment
start:	        mov ax,data
		mov ds,ax
		mov bx,0 
		mov cx,3
s0:		mov dx,cx	;同時使用同一個變量進行循環,需要對外層循環的值保存
		mov si,0
		mov cx,3	;cx設置成內層循環的次數 
s:		mov al,ds:[bx+si]
		and al,11011111b
		mov ds:[bx+si],al
		inc si		
		loop s
 		add bx,16
		mov cx,dx	;用dx中存放的外層循環恢復外層循環的計數器
		loop s0
 		mov ax,4c00h
		int 21h
code ends 
;--------------------------------------------
;做法二,利用棧保存外層循環的值
stack segment
	dw 8 dup(0)		;利用棧段保存cx的值
stack ends
code segment
start:	        mov ax,stack
		mov ss,ax
		mov sp,16	;ss:sp指向棧段 
		mov ax,data
		mov ds,ax
		mov bx,0	;ds:bx指向數據段
 		mov cx,3
s0:		push cx
		mov si,0
		mov cx,3 
s:		mov al,ds:[bx+si]
		and al,11011111b
		mov ds:[bx+si],al
		inc si
		loop s 
		add bx,16
		pop cx
		loop s0
 		mov ax,4c00h
		int 21h
code ends
;-------------------------------------------- 
end start

問題4:將data段中每個單詞的前4個字母改為大寫字母

分析 如何定位每個字符串的內容

采用bx+si+idata來進行首字母的定位

assume cs:code,ds:data,ss:stack
data segment
	db '1. display      '
	db '2. brows        '
	db '3. replace      '
data ends
stack segment
	dw 8 dup(0)
stack ends 
code segment
start:	        mov ax,stack
		mov ss,ax
		mov sp,16 
		mov ax,data
		mov ds,ax
		mov bx,0 
		mov cx 3	;設置外層循環隻有3行
s0:		push cx
		mov si,0
		mov cx,4	;設置內層循環隻需4次 
s:		mov al,ds:[bx+si+3]		;設置需要改變的第一個字母
		and al,11011111b
		mov ds:[bx+si+3],al
		inc si
		loop s 
		add bx,16
		pop cx
		loop s0 
		mov ax,4c00h
		int 21h
code ends
 
end start

問題5:設計一個子程序,將一個全是字母的字符串轉化成大寫

分析: 子程序的設計需要註意兩個問題:字符串的內容和長度

字符串的內容不可能全部放在子程序中,可以考慮在子程序中放入字符串的首地址,利用循環遍歷字符串,循環的次數就是字符串的長度

assume cs:code,ds:data
data segment
	db 'conversation'
data ends
 
code segment
start:	                mov ax,data
		        mov ds,ax
		        mov si,0		;ds:si指向字符串所在空間的首地址
		        mov cx,12		;cx存放字符串的長度
		        call capital
		        mov ax,4c00h
		        int 21h
 
capital:	        and byte ptr ds:[si],11011111b
			inc si
			loop capital
			ret
code ends
 
end start

問題6:設計一個子程序,將一個全是字母,以0結尾的字符串,轉化成大寫

分析:

1、要處理以0結尾的字符串,需要識別結尾的0

采用jcxz進行判斷最後的字符是否是0

2、循環的次數無法知道

所以不能用loop,隻能使用jmp跳到循環開始處

assume cs:code,ds:data
data segment
	db 'conversation',0
data ends 
code segment
start:		        mov ax,data
			mov ds,ax
			mov si,0			;ds:si指向數據段的開始處 
			call capital
 			mov ax,4c00h
			int 21h 
capital:	        mov cl,ds:[si]		
			mov ch,0
			jcxz ok				;如果字符串為0,則會跳出循環
			and byte ptr ds:[si],11011111b
			inc si
			jmp short capital	        ;跳轉實現循環 
ok:			ret				;結束循環 
code ends
end start

復雜一點的對結構化數據的版本

assume cs:code,ds:data,ss:stack
data segment
	db 'word',0
	db 'unix',0
	db 'wind',0
data ends
stack segment
	db 8 dup(0)
stack ends 
code segment
start:		        mov ax,data
			mov ds,ax
			mov bx,0 
			mov cx,3		;外循環實現
s:			mov si,bx
			call capital
			add bx,5		;內循環的實現
			loop s 
			mov ax,4c00h
			int 21h 
capital:	        push cx
			push si 
change:		        mov cl,ds:[si]
			mov ch,0
			jcxz ok
			and byte ptr ds:[si],11011111b
			inc si
			jmp short change 
ok:			pop si
			pop cx
			ret 
code ends
end

以上就是匯編語言功能大小寫轉換實現實例詳解的詳細內容,更多關於匯編語言功能大小寫轉換的資料請關註WalkonNet其它相關文章!

推薦閱讀: