今天看王爽老師的《組合語言》時,很有收穫,不論是技術還是思考方式。
任務是將字串進行大小寫轉換,但是還暫時不會用分支判斷語句(而且這樣的效率也不是最高的,有點類似於高階語言了)。
「如果乙個問題的解決方法,使我們陷入一種矛盾之中。那麼,很可能是我們考慮問題的出發點有了問題,或是說,我們起初運用的規律並不適合。」(強行被王老師灌了一碗雞湯,爽!)
扯點淡:這兩天正好遇到一點事情,使我略微開始懷疑自己,(當然也沒那麼嚴重,卓教授可是非常厲害的,承載了太多期許的目光,豈能輕言放棄。不能把世界交給我看不起的人!),所以王老師的這句話使我,換一種思考方式,也許會柳暗花明。
初步想法是,判斷字元的ascii碼,如果大於61h,則減20h。但是沒有判斷語句,所以這條道走不通。
我們應該重新觀察,尋找新的規律。可以看出,就ascii碼的二進位制形式來看,除第5位(位數從0開始計算)外,大寫字母和小寫字母的其他各位都一樣。大寫字母ascii碼的第5位為0,小寫字母的第5位為1。這樣,我們就有了新的方法,乙個字母,不管他原來是大寫還是小寫,將他的第5位置0,他就必將變為大寫字母;將他的第5位置1,他就必將變為小寫字母。在這個方法中,我們不需要在處理前判斷字母的大小寫。
果然,奇技淫巧...
**如下:
assume cs:code, ds:data
data segment
db 'basic'
db 'information'
data ends
code segment
start:
mov ax, data
mov ds, ax ;設定ds指向data段
mov bx, 0 ;設定(bx)=0,ds:bx指向'basic'的第乙個字母
mov cx, 5 ;設定迴圈次數
s1:mov al, [bx] ;將ascii碼從ds:bx所指向的單元中取出
and al, 11011111b ;將al中的ascii碼的第5位置為0,變為大寫字母
mov [bx], al ;將轉變後的ascii碼寫回原單元
inc bx ;(bx)加1,ds:bx指向下乙個字母
loop s1
mov bx, 5 ;設定(bx)=5,ds:bx指向'information'的第乙個字母
mov cx, 11 ;設定迴圈次數,因為'information'有11個字母
s2:mov al, [bx]
or al, 00100000b ;將al中的ascii碼的第5位置為1,變為小寫字母
mov [bx], al
inc bx
loop s2
mov ax, 4c00h
int 21h
code ends
end start
在以後的操作中,可以從更底層的角度看看能否通過位運算來實現,效率更高,結果更精準。
基於位運算的字元大小寫轉換
我們知道,在ascii中 a z對應65 90 a z對應97 122 大小寫轉換可以通過 32進行 有一種更好的方法 基於位運算的轉換 統一轉成大寫 ch 0b11011111 簡寫 ch 0xdf 統一轉成小寫 ch 0b00100000 簡寫 ch 0x20 分析一下原理 對於與 0b1101...
C 大小寫轉換 與 位運算的 操作
c c 中可以使用 isalpha 是否為字母 isdigit 是否為數字 islower 是否小寫 isupper 是否大寫 isalnum 是否為英文或數字 同時對於字母也可以使用 tolower toupper 進行大小寫轉換 大小寫轉換 int main 最近看到乙個很有趣的轉換方式 我們可...
大小寫轉換
小寫數值轉大寫 xieshuxu 傳入轉換字串 傳入整數單位 如 元 傳入小數點後一位單位 如 角 傳入小數點後兩位單位 如 分 public string xiaotoda string xiao,string one,string two,string tree if xiao.indexof ...