汇编大小写转换问题
1.大小寫轉(zhuǎn)換問(wèn)題
小寫字母的ASCII碼值比大寫字母的ASCII碼值大20H
A 16進(jìn)制 41? 二進(jìn)制01000001
a 16進(jìn)制 61? 二進(jìn)制01100001
B 16進(jìn)制 42? 二進(jìn)制01000010
b 16進(jìn)制 62? 二進(jìn)制01100010
可以發(fā)現(xiàn)一個(gè)很特別的地方就是
小寫字母第5位總是1,對(duì)應(yīng)的大寫字母第5位總是0
所以在進(jìn)行字母轉(zhuǎn)換的時(shí)候,比如要將小寫字母a轉(zhuǎn)換成大寫字母,只要將
其a對(duì)應(yīng)的二進(jìn)制第5位設(shè)置為0
要將大寫字母A轉(zhuǎn)換成小寫字母a 的時(shí)候只要將第5位的0設(shè)置為1
注意:參照上面的可以發(fā)現(xiàn)每個(gè)字符對(duì)應(yīng)一個(gè)16進(jìn)制,所以
可以這樣定義字符串
db 'BaSic'
db 'iNfOrMaTiOn'
完整的程序如下
datasg segment
?? ?db 'BaSic'
?? ?db 'iNfOrMaTiOn'
datasg ends
codesg segment
?? ?start:
?? ?codesg ends
end start
用cmd運(yùn)行了,但是在內(nèi)存中沒(méi)發(fā)現(xiàn)字符串被載入了,為啥呢?
對(duì)于下面的例子的理解
a[i]=a[i]&0xDF;
&按位與,就是將符號(hào)兩邊的都先化為二進(jìn)制,再進(jìn)行與運(yùn)算
0xDF化為二進(jìn)制為11011111,所以這個(gè)表達(dá)式是為了將a[i]轉(zhuǎn)變成大寫字母
b[i]=b[i]|0x20
|按位或,就是將符號(hào)兩邊都先化為二進(jìn)制,再進(jìn)行運(yùn)算
0x20化為二進(jìn)制為00100000
所以這個(gè)表達(dá)式就是為了將b[i]轉(zhuǎn)變成小寫字母
注意下面的問(wèn)題:
請(qǐng)教8086匯編語(yǔ)言中ASSUME偽指令的作用!
1.書上說(shuō)ASSUME語(yǔ)句可以使定義的段與段寄存器對(duì)應(yīng)起來(lái)而在每一個(gè)ASSUME 語(yǔ)句后為什么還要通過(guò)如下的指令語(yǔ)句來(lái)給對(duì)應(yīng)的段寄存器賦值?
??? ASSUME CS:CSEG, DS:DSEG
?????? MOV??????? AX, DSEG
?????? MOV??????? DS,AX
2.每個(gè)ASSUME語(yǔ)句后的段寄存器賦值為什么都不包括CS段的賦值語(yǔ)句?
先回答你的第一個(gè)問(wèn)題,書上是你那樣說(shuō)的,至于你的第一個(gè)疑問(wèn)是因?yàn)锳SSUME偽指令只是讓數(shù)據(jù)段寄存器DS與你的數(shù)據(jù)存儲(chǔ)地址,代碼段寄存器CS和你的代碼段所存儲(chǔ)的地址一一對(duì)應(yīng)起來(lái),但是如果你不人為把你的數(shù)據(jù)段存儲(chǔ)地址DSEG傳給DS的話,系統(tǒng)是無(wú)法獲得DSEG的具體物理地址的。
對(duì)于第二疑問(wèn),因?yàn)镃S:IP是指向CPU將執(zhí)行的下一條語(yǔ)句,在將程序裝載進(jìn)主存時(shí),系統(tǒng)就已經(jīng)將CSEG的物理地址傳給了CS,所以,對(duì)于CS不需要像DS那樣人為傳遞。
之前的時(shí)候想實(shí)現(xiàn)將BaSic和iNfOrMaTiOn載入內(nèi)存中,
assume cs:codesg,ds:datasg
datasg segment
?? ?db 'BaSic'
?? ?db 'iNfOrMaTiOn'
datasg ends
codesg segment
?? ?start:
?? ?codesg ends
end start
但是一直不行,最后找來(lái)找去才發(fā)現(xiàn),除了assume指定cs和自定義的段codesg外還要將其地址關(guān)聯(lián)起來(lái)
assume cs:codesg,ds:datasg
datasg segment
?? ?db 'BaSic'
?? ?db 'iNfOrMaTiOn'
datasg ends
codesg segment
?? ?start:
?? ?mov ax,datasg
?? ?mov ds,ax
codesg ends
最后功能實(shí)現(xiàn)了。
2.[bx+idata]
我們常用[bx]的方式來(lái)指明一個(gè)內(nèi)存單元,還可以用一種更為靈活的方式來(lái)指定內(nèi)存單元:[bx+idata]
轉(zhuǎn)載于:https://my.oschina.net/liangzhenghui/blog/138125
總結(jié)
- 上一篇: 出现java.lang.Unsuppor
- 下一篇: 王爽汇编语言实验7一个很好的解法(转)