組合語言第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
總結:
感覺自己基礎不紮實,剛開始學的時候花的時間不夠,導致學後面的東西覺得很困難
不管是對於彙編還是其他任何一門課,課前預習,課後預習其實都是必不可少的