彙編學習(3)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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章