您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“匯編語言功能字符串大小寫轉(zhuǎn)換實(shí)現(xiàn)方法是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
分析:
如何轉(zhuǎn)換成大小寫
如果利用ASCII碼進(jìn)行轉(zhuǎn)換的話,需要判斷該字符是大寫還是小寫,匯編語言實(shí)現(xiàn)太過困難,可以對(duì)字符串的二進(jìn)制進(jìn)行分析。
在ASCII碼中,大寫字母的第五位為0,小寫字母的第五位為1,可以對(duì)位取反進(jìn)行大小寫轉(zhuǎn)換
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 ;設(shè)置ds:bx指向數(shù)據(jù)段 mov cx,5 ;對(duì)于第一個(gè)字符串進(jìn)行循環(huán)轉(zhuǎn)換 s: mov al,ds:[bx] and al,11011111B ;將字符的第五位轉(zhuǎn)換成0,轉(zhuǎn)換成大寫字母 mov ds:[bx],al inc bx loop s mov bx,5 ;指向第二個(gè)字符串 mov cx,11 s0: mov al,ds:[bx] or al,00100000B ;將字符的第五位轉(zhuǎn)換成1,轉(zhuǎn)換成小寫字母 mov ds:[bx],al inc bx loop s mov ax,4c00h int 21h code ends ;------------------------------------ ;做法二,改進(jìn)版:利用bx+idata實(shí)現(xiàn)代碼的簡(jiǎn)化 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
分析: 如何實(shí)現(xiàn)循環(huán)
該段數(shù)據(jù)是結(jié)構(gòu)化的數(shù)據(jù),則可以看做成一個(gè)二維數(shù)組,用一個(gè)變量定位行,用一個(gè)常量定義第一個(gè)字母
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指定數(shù)據(jù)段,同時(shí)bx作為定義行的變量 mov cx,3 s: mov al,ds:[bx+3] ;3作為常量,定義第一個(gè)字母 and al,11011111b mov ds:[bx+3],al add bx,16 loop s mov ax,4c00h int 21h code ends end
分析: 1、對(duì)于這種結(jié)構(gòu)化的數(shù)據(jù),不僅需要一個(gè)變量定義行,同時(shí)也需要一個(gè)變量定義列
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 ;同時(shí)使用同一個(gè)變量進(jìn)行循環(huán),需要對(duì)外層循環(huán)的值保存 mov si,0 mov cx,3 ;cx設(shè)置成內(nèi)層循環(huán)的次數(shù) 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中存放的外層循環(huán)恢復(fù)外層循環(huán)的計(jì)數(shù)器 loop s0 mov ax,4c00h int 21h code ends ;-------------------------------------------- ;做法二,利用棧保存外層循環(huán)的值 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指向數(shù)據(jù)段 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
分析 如何定位每個(gè)字符串的內(nèi)容
采用bx+si+idata來進(jìn)行首字母的定位
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 ;設(shè)置外層循環(huán)只有3行 s0: push cx mov si,0 mov cx,4 ;設(shè)置內(nèi)層循環(huán)只需4次 s: mov al,ds:[bx+si+3] ;設(shè)置需要改變的第一個(gè)字母 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
分析: 子程序的設(shè)計(jì)需要注意兩個(gè)問題:字符串的內(nèi)容和長(zhǎng)度
字符串的內(nèi)容不可能全部放在子程序中,可以考慮在子程序中放入字符串的首地址,利用循環(huán)遍歷字符串,循環(huán)的次數(shù)就是字符串的長(zhǎng)度
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存放字符串的長(zhǎng)度 call capital mov ax,4c00h int 21h capital: and byte ptr ds:[si],11011111b inc si loop capital ret code ends end start
分析:
1、要處理以0結(jié)尾的字符串,需要識(shí)別結(jié)尾的0
采用jcxz進(jìn)行判斷最后的字符是否是0
2、循環(huán)的次數(shù)無法知道
所以不能用loop,只能使用jmp跳到循環(huán)開始處
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指向數(shù)據(jù)段的開始處 call capital mov ax,4c00h int 21h capital: mov cl,ds:[si] mov ch,0 jcxz ok ;如果字符串為0,則會(huì)跳出循環(huán) and byte ptr ds:[si],11011111b inc si jmp short capital ;跳轉(zhuǎn)實(shí)現(xiàn)循環(huán) ok: ret ;結(jié)束循環(huán) 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 ;外循環(huán)實(shí)現(xiàn) s: mov si,bx call capital add bx,5 ;內(nèi)循環(huán)的實(shí)現(xiàn) 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
“匯編語言功能字符串大小寫轉(zhuǎn)換實(shí)現(xiàn)方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。