匯編語(yǔ)言功能字符串大小寫轉(zhuǎn)換實(shí)現(xiàn)實(shí)例詳解
問(wèn)題1:將data段中的第一個(gè)字符串轉(zhuǎn)換成大寫,第二個(gè)字符串轉(zhuǎn)換成小寫
分析:
如何轉(zhuǎn)換成大小寫
如果利用ASCII碼進(jìn)行轉(zhuǎn)換的話,需要判斷該字符是大寫還是小寫,匯編語(yǔ)言實(shí)現(xiàn)太過(guò)困難,可以對(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
問(wèn)題2:將data段中每個(gè)單詞的頭一個(gè)字母改成大寫字母
分析: 如何實(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
問(wèn)題3:將data段中每個(gè)單詞改為大寫字母
分析: 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
問(wèn)題4:將data段中每個(gè)單詞的前4個(gè)字母改為大寫字母
分析 如何定位每個(gè)字符串的內(nèi)容
采用bx+si+idata來(lái)進(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
問(wèn)題5:設(shè)計(jì)一個(gè)子程序,將一個(gè)全是字母的字符串轉(zhuǎn)化成大寫
分析: 子程序的設(shè)計(jì)需要注意兩個(gè)問(wèn)題:字符串的內(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
問(wèn)題6:設(shè)計(jì)一個(gè)子程序,將一個(gè)全是字母,以0結(jié)尾的字符串,轉(zhuǎn)化成大寫
分析:
1、要處理以0結(jié)尾的字符串,需要識(shí)別結(jié)尾的0
采用jcxz進(jìn)行判斷最后的字符是否是0
2、循環(huán)的次數(shù)無(wú)法知道
所以不能用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
復(fù)雜一點(diǎn)的對(duì)結(jié)構(gòu)化數(shù)據(jù)的版本
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
以上就是匯編語(yǔ)言功能大小寫轉(zhuǎn)換實(shí)現(xiàn)實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于匯編語(yǔ)言功能大小寫轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
匯編語(yǔ)言功能用循環(huán)累加實(shí)現(xiàn)乘法
這篇文章主要為大家介紹了匯編語(yǔ)言實(shí)現(xiàn)功能,使用用循環(huán)累加來(lái)實(shí)現(xiàn)乘法,文中通過(guò)幾個(gè)問(wèn)題實(shí)例分析,來(lái)為大家進(jìn)行詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11匯編語(yǔ)言?masm5與debug命令使用方法小結(jié)
本文總結(jié)了匯編程序的基本框架及規(guī)范、masm5工具的基本使用方法、debug命令的基本使用方法2023-08-08匯編語(yǔ)言系列之匯編實(shí)現(xiàn)字符串操作
本文列出了字符串匹配和字符串輸入顯示的代碼,對(duì)匯編語(yǔ)言系列之匯編實(shí)現(xiàn)字符串操作相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2021-11-11ARM匯編解決階乘及大小寫轉(zhuǎn)換的問(wèn)題
這篇文章主要介紹了ARM匯編解決階乘及大小寫轉(zhuǎn)換,包括ARM匯編大小寫轉(zhuǎn)換以及存入內(nèi)存的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11淺析ELF轉(zhuǎn)二進(jìn)制允許把 Binary 文件加載到任意位置
本文通過(guò) eip + 偏移地址 實(shí)現(xiàn)了運(yùn)行時(shí)計(jì)算數(shù)據(jù)地址,不再需要把 Binary 文件裝載到固定的位置。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2020-02-02純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼
這篇文章主要介紹了純匯編實(shí)現(xiàn)打飛機(jī)小游戲的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Go 中的循環(huán)是如何轉(zhuǎn)為匯編的(方法詳解)
這篇文章主要介紹了Go 中的循環(huán)是如何轉(zhuǎn)為匯編的,本文通過(guò)循環(huán)的匯編代碼給大家講解的非常詳細(xì),代碼簡(jiǎn)單易懂,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05