匯編語(yǔ)言功能字符串大小寫(xiě)轉(zhuǎn)換實(shí)現(xiàn)實(shí)例詳解
問(wèn)題1:將data段中的第一個(gè)字符串轉(zhuǎn)換成大寫(xiě),第二個(gè)字符串轉(zhuǎn)換成小寫(xiě)
分析:
如何轉(zhuǎn)換成大小寫(xiě)
如果利用ASCII碼進(jìn)行轉(zhuǎn)換的話(huà),需要判斷該字符是大寫(xiě)還是小寫(xiě),匯編語(yǔ)言實(shí)現(xiàn)太過(guò)困難,可以對(duì)字符串的二進(jìn)制進(jìn)行分析。
在ASCII碼中,大寫(xiě)字母的第五位為0,小寫(xiě)字母的第五位為1,可以對(duì)位取反進(jìn)行大小寫(xiě)轉(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)換成大寫(xiě)字母 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)換成小寫(xiě)字母 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è)字母改成大寫(xiě)字母
分析: 如何實(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è)單詞改為大寫(xiě)字母
分析: 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è)字母改為大寫(xiě)字母
分析 如何定位每個(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)化成大寫(xiě)
分析: 子程序的設(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)化成大寫(xiě)
分析:
1、要處理以0結(jié)尾的字符串,需要識(shí)別結(jié)尾的0
采用jcxz進(jìn)行判斷最后的字符是否是0
2、循環(huán)的次數(shù)無(wú)法知道
所以不能用loop,只能使用jmp跳到循環(huán)開(kāi)始處
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ù)段的開(kāi)始處 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ǔ)言功能大小寫(xiě)轉(zhuǎn)換實(shí)現(xiàn)實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于匯編語(yǔ)言功能大小寫(xiě)轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
匯編語(yǔ)言基礎(chǔ)理解計(jì)算機(jī)底層技術(shù)原理
這篇文章主要為大家介紹了匯編語(yǔ)言基礎(chǔ),理解計(jì)算機(jī)底層原理,想要成為高級(jí)程序員,我們必須要學(xué)會(huì)匯編語(yǔ)言,匯編語(yǔ)言是非常重要的計(jì)算機(jī)底層技術(shù),一般用于底層的編寫(xiě)2021-11-11
匯編語(yǔ)言指令集學(xué)習(xí)CMPXCHG比較并交換操作指令詳解
這篇文章主要為大家介紹了匯編語(yǔ)言指令集學(xué)習(xí)CMPXCHG比較并交換操作的指令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
通過(guò)匯編看golang函數(shù)的多返回值問(wèn)題
這篇文章主要介紹了通過(guò)匯編看golang函數(shù)的多返回值問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

