乙個約定:idata表示常量
and al,10110101b
or al,10101010b
就是把暫存器中的值and上或or上某個數。
這個大家應該也都知道。
彙編裡的字元和字串由』'給出。
比如:
db 』unix『
mov ax,'a'
其中db意思是「define byte」
而其在記憶體中的儲存形式,就是ascii碼對應的數字。
我們先摘錄作者的一句話:
如果乙個問題的解決方案,使我們陷入一種矛盾之中。那麼,很有可能是我們考慮問題的出發點有了問題,,或是說,我們起初應用的規律並不合適很有道理,不是嗎?
希望大家能細心體會一下這句話。
下面我們再來看正文,有人可能會說,這不簡單嗎?字母的大小寫轉換,這個恐怕是基礎中的基礎的問題了吧?
沒錯,是很簡單,判斷是大寫字母還是小寫字母,然後減去32或加上32就好了。
但是,現在,我們有乙個限制條件,僅能用我們已學的彙編語句,也就是說不能用比較的操作。
那麼我們應該怎麼處理?
稍加思索,我們便可以觀察到,乙個大寫字母和乙個小寫字母的ascii 碼的差別在**?
那就是25位,乙個是0,乙個是1,其他全部是一樣的。
說到這裡,也許你就明白了。
所以,有時候,換個角度考慮,就會得到全新的一篇天地。
我們標題是更加靈活的定址方式。
這裡就是第一種。
就是用[bx+idata]
其實就相當於[(bx)+idata](debug下)
這裡應該是很好理解的。
相當於bx是陣列首位址,然後後面就可以用idata來當下標來使用。
這兩個暫存器的功能和bx是類似的。
可以用來定址。
但是不一樣的是,它們不能被是為兩個八字節的記憶體來使用。
我們再來看看這兩個定址方法。
它們兩個是類似的。
而他們其實與[bx+idata]類似。
這裡的含義也就是[bx+(si)]
我們舉個例子:
mov ax,
[bx+si]
但這樣並不是我們常用的形式。
一種更為常用的等價寫法如下:
mov ax,
[bx]
[si]
沒錯,又復合了一層。
他們兩個的含義類似,所以我們以[bx+si+idata]為例。
其實呢,含義還是類似的,就是三個數值相加進行定址。
使用方法如下:
mov ax,
[bx+si+idata]
同樣,它也有很多的等價寫法:
mov ax,
[idata+bx+si]
mov ax,idata[bx]
[si]
mov ax,
[bx]
.idata[si]
mov ax,
[bx]
[si]
.idata
現在我們已經有很多的定址方式了。
那麼我們應該怎麼去靈活地運用呢?
我們來總結一下各個定址方式適用的條件:
[bx]:乙個變數定位,間接定位
[idata]:常量定位,不能更改,直接定位
[bx+si+idata]:兩個變數和乙個常量
我們都知道,在寫**時,會用到很多的變數。
其中有些是有實際意義,有些可能是一些臨時的變數。
當我們的程式越來越複雜,變數越來越多,但是cpu的暫存器就只有14個(8086型),用完了該怎麼辦?
我們通過之前的學習知道,在彙編過程中,我們儲存資料的地方,只有兩個:暫存器和記憶體。
那麼既然暫存器用完了,我們就只能用記憶體了。
所以,在程式設計中,我們更多的臨時資料乙個放在乙個棧中,這樣不僅可以存放更多的資料,而且資料的結構也更加清晰。
這就是第七章的主要內容了。
組合語言程式設計第七章
一 and和or指令 and指令 邏輯與指令,按位進行與運算。通過該指令可以將操作物件的相應位設為0,其他位不變。or指令 邏輯或指令,按位進行或運算。通過該指令可以將操作物件的相應位設為1,其他位不變。二 關於ascii碼 三 以字元形式給出的資料 在匯程式設計序中,用 的形式指明資料是以字元的形...
組合語言 第七章 更靈活的定位記憶體位址的方法
and指令 邏輯與指令 兩個二進位制資料進行按位與 0與0為0,0與1為0,1與1為1 or指令 邏輯或指令 兩個二進位制資料進行按位或 0與0為0,0與1為1,1與1為1 美國規定的乙個編碼方案,用於計算機編碼和解碼 在組合語言中,字元資料以單引號的形式給出,如 0134 a abcd 等 程式7...
組合語言 第七章實驗6
採用基址變址定址 bx si 採用棧,外層迴圈開始時,將cx入棧,內層迴圈開始時,改變cx的值,內層迴圈結束時,將棧中的值pop出,傳給cx。ascll 大寫 ascll 小寫 a 0100 0001 a 0110 0001 字母用八位二進位制數表示,大小寫的區別是第 位上 和 的區別。大寫字母 小...