1. 程式人生 > >x86彙編指令詳細學習(會更新)

x86彙編指令詳細學習(會更新)

剛學習彙編,菜鳥一個。記下學習筆記

mov指令:
mov 目標運算元,源運算元; (類似c語言的等於號)
拷貝 源運算元 到 目標運算元。
例如 mov eax,ebx
前後的位數(寬度)必須是相同的,8位對應8位,16對應16, 32位對應32位。
(彙編有三種運算元:暫存器運算元,儲存器運算元,立即數。暫存器運算元就是暫存器中的數,儲存器運算元就是記憶體單元中的數,立即數類似高階語言的常量)。
如果源運算元是立即數 ,寫的不是對應的寬度, 會在前面自動補0。
例如 mov ax,0x1 實際 是 0x0001
源 和 目標 不能同時是 記憶體單元。
目標運算元是 儲存器運算元(即記憶體單元時) 應該註明要操作的大小 例如 mov word/dword ptr ds:[記憶體地址],源運算元

。 word 可以換成 byte,dword,(dword是32位,word是16位,byte是8位)

幾種定址方式: [ ]內 可以是 立即數,8種通用暫存器,8種暫存器加立即數,8種暫存器×1或者2或者4 (只能是1或者2或者4),或者8種暫存器×1或者2或者4 再加上立即數。

mov指令不改變標誌暫存器的值

add 指令 和 sub 指令:
前後的寬度可以不一樣。

and 指令 ,or 指令 ,xor指令:
將數字轉化為二進位制,對應的位( 每個位)進行 and,or 運算。
and 只有都是 1 結果才是1,or 只要有一個為1,結果就是1 。

lea(load effect address的縮寫)指令 :


取地址, lea ax,dword ptr ds:[記憶體地址] ,是將這個記憶體地址送到 ax 中。

inc (increase的縮寫)自增 dec (decrease的縮寫) 自減
類似 c語言 自增自減 inc ax就是 ax加1(十進位制)

push指令 pop指令
push r32/r16/m16/m32/imm8/imm16/imm32 (立即數可以是8位的) (r為暫存器,m為記憶體)

pop  r32/r16/m16/m32

push或者pop一個立即數,則esp減或者加 4,
如果 push ,pop 後面跟的是一個容器(比如暫存器),ESP要根據容器的寬度減,比如 push ax

,則 esp減2., 或者push dword ptr ds:[address] 則esp減4。

pushad 和popad指令
pushad 是將八個通用暫存器的值放到堆疊中。
popad將存在堆疊中的八個暫存器的值恢復給8個通用暫存器。

ADC指令(帶進位的加法指令,c是carry)。
相當於 add 目標運算元,源運算元+CF標誌的值
目標和源不能同時是記憶體單元,兩天寬度得相等
SBB指令(帶借位的減法,B是borrow)
相當於 sub 目標,源+CF (不能同時是記憶體單元,寬度得相同)
XCHG指令 (交換目標和源的值)
兩邊得是容器,兩邊可以同時是記憶體單元。
MOVS指令
類似mov指令 兩邊可以是記憶體單元,但是寬度必須一樣。

MOVS word ptr ds:[edi],word ptr ds:[esi] 

可以縮寫為 MOVSW
一個位元組的 可以縮寫為 MOVSB
雙字的可以縮寫為 MOVSD。
執行後,edi 和esi 分別 加 或者減 (根據DF標誌,如果DF是0則加,DF為1則減)位元組數,如果是word 就加或者減 2,byte 就是1 dword 就是4.
STOS(store string data)指令
將AL, AX, EAX中的值存到 存到 es:di 中,需要指明 寬度。執行後會根據 DF標誌 ,edi 的值 會增加或者減少。
CMP(compare)指令
cmp指令相當於減法,但是運算結果並不儲存。
例如 cmp ax,bx 相當於 ax-bx ,但是減後的結果不併儲存(即ax的值不變),但是運算結果會影響標誌暫存器的值,通過標誌暫存器的值判斷兩者的大小關係。
test 指令 。
按位(化為二進位制數後)進行 and運算(結果並不儲存,但是會影響標誌暫存器的值)。
常用來判斷 某個暫存器的值是否是0.
例如 test ax,ax如果ax 是0,則 ZF位是1.