組合語言第七章 更加靈活的定位記憶體的方法

2021-09-29 14:42:27 字數 2032 閱讀 8251

乙個約定: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 字母用八位二進位制數表示,大小寫的區別是第 位上 和 的區別。大寫字母 小...