1. 程式人生 > >組合語言第5-8章

組合語言第5-8章

第五章 [BX]和loop

1、[BX]表示的是記憶體單元,它的偏移地址在bx中,間接給出記憶體單元的偏移地址,則段地址預設在ds中

2、記憶體單元間接表示:[bx]

(1)mov dl,[bx]

間接定址,可以使用bx間接訪問記憶體單元,間接給出記憶體單元的偏移地址,預設段地址在ds中

(2)mov ax,[bx]

bx中存放的資料作為一個偏移地址EA,段地址SA預設在ds中,將SA:EA處的資料送入ax中。即:(ax)=((ds)*  16  +(bx))

(3)mov [bx],ax

bx中存放的資料作為一個偏移地址EA,段地址SA預設在ds中,將ax中的資料送入記憶體SA:EA處。即:((ds)*  16  +(bx))=(ax)

3、loop指令是否執行取決於cx的值,若cx=0,則執行loop後面的其他指令,若cx≠0,則跳轉到標號處執行

4、遇到loop指令時,使用p命令來執行,Debug就會自動重複執行迴圈中的命令,直到(cx)=  0為止

5、如果段地址不在ds中,則需要使用cs,ss,es等段字首,顯式地指明記憶體單元的段地址

6、系統中某些地址處存放著重要的資料,dos方式下,一般情況,可以把資料寫在0:200~0:2ff空間中

 

六、包含多個段的程式

1、dw:字型資料;db:位元組型資料

2、如果程式碼和資料放在一個段中,反彙編時,如果從0開始,會把資料當成指令機器碼反彙編,所以反彙編時注意sp的值

3、8086CPU不允許將一個數值直接送入段暫存器中

4、除錯時,可以通過r命令修改ip的值或在t/g命令中指定執行的起始地址

5、end 標號:表示程式到標號處開始,到此結束,後面的標號有時候可以省略

6、使用assume僅僅表示將某個邏輯段和某個段暫存器關聯起來;真正當做特定的段使用,需要在程式碼段中設定相應的段暫存器值

7、使用偽指令segment和ends定義邏輯段後,究竟使用作虛擬碼、資料段還是棧由程式設計師指定

8、段名代表的是段地址,是常數。不能使用mov直接送入段暫存器

 

七、更靈活的定位記憶體地址的方法

1、and指令

(1)and指令語法格式及對運算元要求與add指令相同

(2)可以實現將運算元指定位設定為0

2、or指令

(1)or指令語法格式及對運算元要求與add指令相同

(2)可以實現將運算元指定位設定為1

3、在debug環境中,預設十六進位制;在完整彙編源程式中,預設十進位制,支援二/十六進位制

4、資料段中的資料可以逐個定義,也可以連續定義,支援字元形式和ASCΙΙ碼書寫形式,支援十/二/十六進位制

5、字母的大小寫轉換

(1)大寫->小寫:

mov dl,'A'            mov dl,'A'

add dl,32            or dl,20H(or dl,00100000B)

(2)小寫->大寫

mov dl,'a'            mov dl,'a'

sub dl,32            and dl,0dfh(and dl,11011111B)

6、記憶體單元地址表示小結

 

八、資料處理的兩個基本問題

1、彙編指令中運算元型別

2、在8086中,可用於表示記憶體偏移地址的暫存器只有:bx,si,di,bp

(1)這些暫存器可以單個出現在[ ]中,也可以以特定組合方式出現

(2)使用bx,si,di表示偏移地址時,預設段地址在ds中,可以加字首es,cs,ss

(3)使用bp表示偏移地址時,預設段地址在ss中,可以加字首ds,es,cs

3、把記憶體單元ds:[0]作為位元組單元還是字單元,依賴於另一個運算元是8位還是16位

(1)mov byte ptr [0],5:5作為位元組資料送到ds:[0]對應的位元組單元

(2)mov word ptr [0],5:5作為字資料送到ds:[0]對應的字單元

4、無符號除法指令div

5、無符號乘法指令mul

6、db 8 dup(0)預留8個位元組單元,每個單元值為0

 

總結:

感覺自己基礎不紮實,剛開始學的時候花的時間不夠,導致學後面的東西覺得很困難

不管是對於彙編還是其他任何一門課,課前預習,課後預習其實都是必不可少的