對於[bx]
[bx]和記憶體單元的描述
要完整的描述乙個記憶體單元,需要兩種資訊:
- 記憶體單元的位址
- 記憶體單元的長度
[bx]也表示乙個記憶體單元,它的偏移位址在bx中,段位址在ds中
[…]中可以是值也可以是暫存器
定義乙個描述性符號「()」來表示乙個暫存器或乙個記憶體單元(直接用數值要寫實體地址,20位(二進位制位)的)中的內容
對於[idata]
debug將[idata]解釋為:[idata]是乙個記憶體單元,iadta是記憶體單元的偏移位址
masm將[idata]解釋為:idata
所以在edit中編寫匯程式設計序時,如果想用[idata]表示偏移位址,那麼就得在前面顯式地給出段位址所在的段暫存器。比如mov al,ds:[0],(ds稱為段字首)
如果寫成mov al,[0]那麼編譯的時候masm就會把它解釋成idata而不是偏移位址
cpu執行loop指令的時候,要進行兩步操作
通常用loop指令來實現迴圈功能(說明還有其他迴圈方式,比如jmp指令),cx中存放迴圈次數
標號標識乙個位址,這個位址處有一條彙編指令,可以是任意字母,初學通常用s,s0
程式框架如下:
mov cx,迴圈次數
s:迴圈執行的程式段
loop s
cpu執行中沒有乘法,只有加減法,所以可通過迴圈加法來達到乘法目的跟蹤迴圈
使用g命令跳轉到想執行的指令位置
-g 0012
表示執行程式到當前**段(段位址在cs中)的0012h處,之前所有指令都被一次執行完畢
使用p命令讓迴圈一次性執行完
到下一步該執行loop指令的時候使用-p。debug會自動重複執行迴圈中的指令,直到(cx)=0為止。
一般的pc機都不會使用0:200到0:2ff的256位元組的空間,所以我們可以把這段空間當作棧來使用,也可隨意寫入資料。
切記匯程式設計序中資料不能以字母開頭,如果要往ax中存放ffffh,那麼需要寫成mov ax,0ffffh
CSAPP筆記 5 組合語言 資料
本部落格對於彙編的介紹基於32位機器的intel x86系列處理器和ia32指令集,也涉及少部分x86 64。由於彙編知識相對複雜,這裡只做簡單介紹和記錄,詳細請參照書本!下面這張 中體現了c語言基本資料型別和ia32的對應表示。c語言中的宣告 intel 資料型別 彙編 字尾 大小 位元組 cha...
組合語言學習筆記
學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...
組合語言學習筆記
cs ip是指向程式執行的位置 code segment ds 儲存記憶體中取資料的位址,data segment ss sp是指向堆疊的位置 stack segment cx 裡儲存的是loop執行的標誌 loop執行時,cx cx 1,若此時cx裡值為0,則跳出loop,否則繼續loop 初始 ...