匯編語言功能字符串大小寫轉(zhuǎn)換實現(xiàn)實例詳解
問題1:將data段中的第一個字符串轉(zhuǎn)換成大寫,第二個字符串轉(zhuǎn)換成小寫
分析:
如何轉(zhuǎn)換成大小寫
如果利用ASCII碼進行轉(zhuǎn)換的話,需要判斷該字符是大寫還是小寫,匯編語言實現(xiàn)太過困難,可以對字符串的二進制進行分析。
在ASCII碼中,大寫字母的第五位為0,小寫字母的第五位為1,可以對位取反進行大小寫轉(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 ;對于第一個字符串進行循環(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 ;指向第二個字符串 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 ;------------------------------------ ;做法二,改進版:利用bx+idata實現(xià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
問題2:將data段中每個單詞的頭一個字母改成大寫字母
分析: 如何實現(xiàn)循環(huán)
該段數(shù)據(jù)是結(jié)構(gòu)化的數(shù)據(jù),則可以看做成一個二維數(shù)組,用一個變量定位行,用一個常量定義第一個字母
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ù)段,同時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、對于這種結(jié)構(gòu)化的數(shù)據(jù),不僅需要一個變量定義行,同時也需要一個變量定義列
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 ;同時使用同一個變量進行循環(huán),需要對外層循環(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)的計數(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
問題4:將data段中每個單詞的前4個字母改為大寫字母
分析 如何定位每個字符串的內(nèi)容
采用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 ;設(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è)置需要改變的第一個字母 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:設(shè)計一個子程序,將一個全是字母的字符串轉(zhuǎn)化成大寫
分析: 子程序的設(shè)計需要注意兩個問題:字符串的內(nèi)容和長度
字符串的內(nèi)容不可能全部放在子程序中,可以考慮在子程序中放入字符串的首地址,利用循環(huán)遍歷字符串,循環(huán)的次數(shù)就是字符串的長度
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:設(shè)計一個子程序,將一個全是字母,以0結(jié)尾的字符串,轉(zhuǎn)化成大寫
分析:
1、要處理以0結(jié)尾的字符串,需要識別結(jié)尾的0
采用jcxz進行判斷最后的字符是否是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án) and byte ptr ds:[si],11011111b inc si jmp short capital ;跳轉(zhuǎn)實現(xiàn)循環(huán) ok: ret ;結(jié)束循環(huán) code ends end start
復(fù)雜一點的對結(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)實現(xiàn) s: mov si,bx call capital add bx,5 ;內(nèi)循環(huán)的實現(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)換實現(xiàn)實例詳解的詳細內(nèi)容,更多關(guān)于匯編語言功能大小寫轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺析ELF轉(zhuǎn)二進制允許把 Binary 文件加載到任意位置
本文通過 eip + 偏移地址 實現(xiàn)了運行時計算數(shù)據(jù)地址,不再需要把 Binary 文件裝載到固定的位置。本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2020-02-02Go 中的循環(huán)是如何轉(zhuǎn)為匯編的(方法詳解)
這篇文章主要介紹了Go 中的循環(huán)是如何轉(zhuǎn)為匯編的,本文通過循環(huán)的匯編代碼給大家講解的非常詳細,代碼簡單易懂,非常不錯,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05