> 大小寫轉換問題,先看一下大小寫字母的ASCII碼值
A 十六進制 41H 十進制65
B 十六進制 42H 十進制66
C 十六進制 43H 十進制67
D 十六進制 44H 十進制68
E 十六進制 45H 十進制69
F 十六進制 46H 十進制70
a 十六進制 61H 十進制97
b 十六進制 62H 十進制98
c 十六進制 63H 十進制99
d 十六進制 64H 十進制100
e 十六進制 65H 十進制101
f 十六進制 66H 十進制102
> A 十六進制 41H 0100 0001
> B 十六進制 42H 0100 0010
> C 十六進制 43H 0100 0011
> D 十六進制 44H 0100 0100
> E 十六進制 45H 0100 0101
> F 十六進制 46H 0100 0110
> a 十六進制 61H 0110 0001
> b 十六進制 62H 0110 0010
> c 十六進制 63H 0110 0011
> d 十六進制 64H 0110 0100
> e 十六進制 65H 0110 0101
> f 十六進制66H 0110 0110
1例如:大寫F 轉換成小寫f
F 十六進制 46H 0100 0110
加上 or指令 0010 0000就可以了
0110 01102例如:e轉換大寫E
e 十六進制65H 0110 0101
加上and指令 1101 1111
0100 0101
其中會運用到and指令和or指令
and:指令就是與運算將相對應的位,只要兩位都爲1。運算結果才爲1,其餘都爲0
就是將相對應的位 設置爲0 其它位不變
mov al, 00001010B
and al, 00001111B
00001010B
or:指令就是或運算 將相對應的位,只要有一個是1。那麼運算結果就是1
mov al,00001111B
or al, 11110000B
11111111B
下列具體例子展示:
小寫轉大寫
assume cs:code,ds:data,ss:stack ;這裏的cs表示代碼段,ds數據段 ,ss棧段
data segment
db 'Basci' ;將字符串轉換成大寫
data ends
stack segment stack ;設置棧段
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment ;設置代碼段
stack: mov bx,stack
mov ss,bx ;棧段ss 用來接收stack
mov sp,128 ;設置棧頂指針地址
mov bx,data
mov ds,bx ;數據段ds接收data傳送的值
mov bx,0 ;偏移地址爲0
mov cx,5 ;循環轉換字母5次
upLetter: mov al,ds:[bx]
and al,11011111B ;使用and指令完成轉換
mov ds:[bx],al ;在將al,bx值返回
inc bx ;bx加一執行下一條數據
loop upLetter ;這裏的loop是循環指令
mov ax,4c00h
int 21H ;這兩條指令是程序返回
大寫轉小寫
assume cs:code,ds:data,ss:stack ;這裏的cs表示代碼段,ds數據段 ,ss棧段
data segment ;數據段
db 'iNfOrHaTIon' ;將字符串轉換成小寫
data ends
stack segment stack ;棧段
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment ;代碼段
stack: mov bx,stack
mov ss,bx
mov sp,128
mov bx,data
mov ds,bx
mov bx,0 ;這裏的偏移地址0是根據,所改變的值得第一位開始計算
mov cx,11
downLetter: mov al,ds:[bx]
or al,00100000B ;要注意這裏的改變,因爲是大寫轉小寫了,所有要使用or指令
mov ds:[bx],al
inc bx
loop downLetter
mov ax,4c00h
int 21H ;這兩條指令是程序返回
有錯誤的地方還請大家指點,謝謝