彙編基礎知識

2021-08-26 08:01:23 字數 2537 閱讀 4003

最近感覺自己學的到了乙個瓶頸,學的不知道有多少是記住的,總是感覺自己要學的東西有那麼多,時間又太少。專業課也越來越多,花在程式設計上的時間就少了,但是這畢竟是我的興趣愛好,所以我不想放棄。昨晚突然有個想法,以後寫部落格的頻率加快,儘管這樣部落格的質量也就下降了很多,但是我還是覺得部落格就是來記錄我成長的地方,我該把我的學到的,哪怕是點點滴滴都記錄下來,呵呵,不知道能堅持多久。

不久前看拿起了王爽老師的組合語言看了看,覺得確實寫的不錯,當時因為都是基本的語法,我就看看就過去了。不過這些天發現突然很多都忘記了,所以寫點東西來記錄下。。。

首先是硬體的一些基礎知識,cpu要對物理記憶體操作總得最起碼要知道1,所操作的位址2.操作的資料3.操作的指令。所以cpu有位址匯流排(傳位址的),有資料匯流排(傳資料的),有控制匯流排(傳命令的)。先是位址匯流排,乙個cpu有n根位址線,定址範圍就是2^n次。資料匯流排也是一樣的道理,傳輸資料都

是最大是2^n。8086cpu有20位位址匯流排,定址能力是0~1m,但是資料匯流排是16位,就是只能傳輸資料0~64k,為了可持續發展,所以就想出了,兩個16位位址通過乙個特殊的加法器來算出乙個20的位址,這就是所謂的段+偏移。具體演算法:實體地址 = (段位址 * 16 + 偏移量)。16 = 0x10,其實就相當於是把段位址變成了20位和偏移量相加得出20位的實體地址。段+偏移的思想在我們日常生活中隨處可見,比如時鐘啊,過了60s加相當於過了一分鐘····

再是一些彙編的基礎知識:

位元組(byte):8個bit。

字(word):2個byte,16個bit。

雙字(dword):4個byte,32bit。

8086cpu通用暫存器:ax,bx,cx,dx都是16bit,一次存放兩個位元組。為了與上一代8位的暫存器相容,所以在通用暫存器裡面又分出高位暫存器和地位暫存器。

這個應該寫程式就可以實現的吧。比如ax,由ah:高8位;al:低8位構成。

cs和ip也是兩個暫存器,cs是段暫存器,ip是指標暫存器。cs:ip裡面存的就是cpu要執行的下一條指令。任意時刻,cpu要執行的位址 = (cs*16 + ip)。

ds暫存器,cpu要讀寫乙個記憶體單元的時候,必須先給出這個記憶體單元的位址。記憶體位址就是由段位址+偏移位址組成的。

mov 指令

1.從資料送到暫存器,mov ax,1000h。 (ax) = 1000h。()就相當於裡面的內容

2.將暫存器的內容送到另乙個暫存器中,mov bx,ax。

3.將乙個記憶體單元內字送到暫存器。mox ax,[0]。裡面表示偏移位址,段位址預設在ds中,cpu自動從ds中提取。

4.mov [bx],ax 將ax中存放的資料放到偏移量是bx的記憶體單元中。((ds)*16+(bx)) = (ax)。

下面是我從網上找來的一些基本的彙編指令,就當作手冊額····

一、資料傳輸指令

mov 傳送字或位元組

push 把字壓入堆疊

pop 把字彈出堆疊

pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓入堆疊

popa 把di,si,bp,sp,bx,dx,cx,ax依次彈出堆疊

pushad 把eax,ecx,edx,ebx,esp,ebp,esi,edi依次壓入堆疊

popad 把edi,esi,ebp,esp,ebx,edx,ecx,eax依次彈出堆疊

pushf 標誌入棧

popf 標誌出棧

lea 裝入有效位址

lds 傳送目標指標,把指標內容裝入ds

les 傳送目標指標,把指標內容裝入es

lahf 標誌暫存器傳送,把標誌裝入ah

sahf 標誌暫存器傳送,把ah內容裝入標誌暫存器

二、算術運算指令

add 加法

adc 帶進製加法

inc 加 1

sub 減法

sbb 帶借位減法

dec 減 1

nec 求相反數(以 0 減之)

cmp 比較(兩運算元作減法,僅修改標誌位,不回送結果)

mul 無符號乘法

imul 整數乘法

div 無符號除法

idiv 整數除法

三、邏輯運算指令

or 或運算

and 與運算

xor 異或運算

not 取反

test 測試,兩運算元作與運算,僅修改標誌位,不回送結果

shl 邏輯左移

shr 邏輯右移

rol 迴圈左移

ror 迴圈右移

rcl 通過進製的迴圈左移

rcr 通過進製的迴圈右移

四、串指令

movsx 先符號擴充套件,再傳送

movzx 先零擴充套件,再傳送

movs 串傳送

cmps 串比較

五、程式轉移指令

jmp 無條件轉移指令

call 過程呼叫

ret 過程返回

jg/jnle 大於轉移

jge/jnl 大於或等於轉移

jl/jnge 小於轉移

jle/jng 小於或等於轉移

je/jz 等於轉移

jne/jnz 不等於時轉移

loop cx不為零時迴圈.

彙編基礎知識

最近感覺自己學的到了乙個瓶頸,學的不知道有多少是記住的,總是感覺自己要學的東西有那麼多,時間又太少。專業課也越來越多,花在程式設計上的時間就少了,但是這畢竟是我的興趣愛好,所以我不想放棄。昨晚突然有個想法,以後寫部落格的頻率加快,儘管這樣部落格的質量也就下降了很多,但是我還是覺得部落格就是來記錄我成...

彙編 基礎知識

一 進製數的表示 十進位制後加d,二進位制後加b,八進位制加o,十六進製制加h 二 十進位制數轉換為二進位制數或十六進製制數 使用除2取餘法或使用除16取餘法,結果向上讀,如4,得餘數0 0 1,則相應二進位制為100,十六進製制數類似 三 二進位制數或十六進製制數轉換為十進位制數 使用權的展開式 ...

彙編基礎知識

1.si和di 功能和bx相似,只是不能分成2個8暫存器使用。2inc ax指令 將暫存器的內容加1 mov ax,0 inc ax 執行完畢ax 1 3.bx,si,di,bp暫存器 cpu的核心是暫存器,學習彙編這麼一段時間,我也深刻體會到對暫存器理解的重要性 1 在8086cpu中,只有這4個...