學習匯編兩大知識點:
1.匯編指令
2.寄存器
image.png
64bit:
RAX \RBX\RCX\RDX :通用寄存器
32bit:
EAX\EBX\ECX\EDX :通用寄存器
16bit:
AX\BX\CX\DX :通用寄存器
image.png
現代計算機普遍64位,以前是32位。為了向下兼容,如上圖,64位一半包含著32位的寄存器。
一般規律:
R開頭的寄存器是64位的,占8字節。
E開頭的寄存器是32位的,占4字節。
image.png
注意:寄存器是獨立存在的,不是連續的。
c++支持內聯匯編
__asm{
}
驗證eax包含ax
image.png
可以發現,ax的值發生了變化,變成了3344
匯編指令
move dest,src
- 將src的內容復制到dest,類似于dest = src
[地址值]
- 中括號里面包含的都是地址值
word是2字節,dword是4字節,qword是8字節
作用:
int a = 3;int類型告訴編譯器分配4個字節給a變量。
image.png
所以匯編要通過dword等告訴編譯器分配多少個字節。
ptr是固定寫法,表示指定單位大小。
一個格子代表1個字節。
image.png
指定大小后就知道占4個字節。
image.png
通常是向高地址存/取。[1128->112b而不是1128->1124]
通過cout<<&a,輸出a的地址值。然后查看匯編窗口里的ebp地址值。發現括號里面的值的確是a的地址值。
image.png
-
全局變量地址是固定的。
全局
cpu大小端模式
image.png
現在大部分cpu是小端模式,低字節放低地址,高字節放高地址(高高低低)。讀取從小端開始讀取。
lea dest,[地址值],直接把地址給dest
lea eax,[1122h]
等價于eax = 1122h
lea(load effect address)
ret 函數返回
xor op1,op2
異或操作,等價于op1 =op1^op2
類似的還有add,sub,inc(自增),dec
jmp [內存地址]
cpu跳轉到該內存地址進行執行
還有很多j開頭的指令,比如jne()jump not equal
jump