匯編語言功能字符串大小寫轉換實現實例詳解
問題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其它相關文章!