匯編指令和寄存器

寄存器

早期的 x86 CPU 只有 8 個(gè)寄存器(eaxebx区宇、ecx娃殖、edxesi议谷、edi炉爆、ebpesp),而且每個(gè)都有不同的用途芬首。

寄存器名稱 含義 用途 包含寄存器
eax 累加(Accumulator)寄存器 常用于乘除法和函數(shù)返回值 axah鲫凶、al
ebx 基址(Base)寄存器 常以它為基址來訪問內(nèi)存 bxbhbl
ecx 計(jì)數(shù)器(Counter)寄存器 常做字符串和循環(huán)操作中的計(jì)數(shù)器 cxch衩辟、cl
edx 數(shù)據(jù)(Data)寄存器 常用于乘除法和 I/O 指針 dxdhdl
esi 來源索引(Source Index)寄存器 常用于內(nèi)存數(shù)據(jù)指針和源字符串指針 si
edi 目的索引(Destination Index)寄存器 常用于內(nèi)存數(shù)據(jù)指針和源字符串指針 di
ebp 基址指針(Base Pointer)寄存器 只做堆棧指針波附,可以訪問堆棧內(nèi)任意地址艺晴,經(jīng)常用于中轉(zhuǎn) ESP 中的數(shù)據(jù),也常以它為基址來訪問堆棧掸屡;不能用于算術(shù)運(yùn)算與數(shù)據(jù)傳送 bp
esp 堆棧指針(Stack Pointer)寄存器 只做堆棧的棧頂指針封寞,不能用于算術(shù)運(yùn)算與數(shù)據(jù)傳送 sp

棧幀中,最重要的是幀指針 ebp 和棧指針 esp仅财,有了這兩個(gè)指針狈究,我們就可以刻畫一個(gè)完整的棧幀。

x86-64 中盏求,所有寄存器都是 64 位抖锥,相對(duì) 32 位的 x86 來說,標(biāo)識(shí)符發(fā)生了變化碎罚,比如:從原來的 eax 變成了 rax磅废。為了向后兼容性,eax 依然可以使用荆烈,不過指向了 rax 的低 32 位。

比如在 64 位 CPU 上:

  • rax 是 64 位的寄存器
  • raxrax 的低 32 位
  • axrax 的低 16 位
  • ahax 的高 8 位。
  • alax 的低 8 位宿接。

它們的對(duì)照關(guān)系如下:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
|=================================RAX=================================|---8個(gè)字節(jié)
                                    |===============EAX===============|---4個(gè)字節(jié)
                                                      |======AX=======|---2個(gè)字節(jié)
                                                      |==AH===|-----------1個(gè)字節(jié)
                                                              |===AL==|---1個(gè)字節(jié)

通過 gdb 的 p /x $reg 命令打印寄存器的值德绿。

(gdb) p /x $rax
$16 = 0x555555554870
(gdb) p /x $eax
$12 = 0x55554870
(gdb) p /x $ax
$13 = 0x4870
(gdb) p /x $ah
$14 = 0x48
(gdb) p /x $al
$15 = 0x70

匯編指令

1. 數(shù)據(jù)傳送指令

指令 名稱 語法 描述
mov 數(shù)據(jù)傳送指令 mov dest, src 將數(shù)據(jù)從 src 移動(dòng)到 dest
push 入棧指令 push src 將源操作數(shù) src 壓入堆棧
pop 入棧指令 pop dest 從棧頂彈出數(shù)據(jù)到 dest

1.1 mov 指令

mov 指令是最常見的數(shù)據(jù)傳送指令,類似于高級(jí)語言中的賦值語句玫鸟。

mov 指令可以實(shí)現(xiàn)寄存器與寄存器之間导绷、寄存器與內(nèi)存之間、寄存器與立即數(shù)屎飘、內(nèi)存與立即數(shù)的數(shù)據(jù)傳遞诵次。

需要注意的是,內(nèi)存與內(nèi)存無法直接傳遞數(shù)據(jù)枚碗,目的操作數(shù)不能為立即數(shù)逾一。

mov 指令的用法示例如下:

mov eax, 12345678h
mov eax, [00401000h]
mov eax, ebx
mov [00401000h], 12345678h
mov [00401000h], eax

1.2 pushpop 指令

push 指令和 pop 指令互為相反的操作指令。

  • push 指令的功能是將操作數(shù)壓入堆棧肮雨。
  • pop 指令的功能是將棧頂?shù)牟僮鲾?shù)彈出遵堵。

push 指令把一個(gè) 32 位的操作數(shù)送入堆棧,該操作致使 esp 寄存器的值減 4。
esp 寄存器始終指向棧頂陌宿。堆棧的方向是由高地址向低地址進(jìn)行延伸锡足,也就是執(zhí)行的 push 次數(shù)越多,esp 寄存器指向的地址越小壳坪。
在 32 位平臺(tái)上舶得,每執(zhí)行一次 push 指令,esp 指向的地址都減小 4 字節(jié)爽蝴。

pop 指令把 esp 指向地址(棧頂)中的值送入寄存器或內(nèi)存中沐批,然后 esp 指向的地址加 4 字節(jié)。
執(zhí)行的 pop 指令越多蝎亚,esp 寄存器指向的地址越大九孩。

(2)算術(shù)運(yùn)算指令

指令 名稱 語法 描述
add 加法指令 add dest, src dest 基礎(chǔ)上加 src
sub 減法指令 sub dest, src dest 基礎(chǔ)上減 src
inc 加 1 指令 inc dest dest 基礎(chǔ)上加 1
dec 減 1 指令 dec dest dest 基礎(chǔ)上減 1

(3)邏輯運(yùn)算指令

指令 名稱 語法 描述
not 取反運(yùn)算指令 not dest 把操作數(shù) dest 按位取反
and 與運(yùn)算指令 and dest, src destsrc 進(jìn)行與預(yù)算之后送回 dest
or 與運(yùn)算指令 or dest, src destsrc 進(jìn)行或預(yù)算之后送回 dest
xor 與運(yùn)算指令 xor dest, src destsrc 進(jìn)行異或預(yù)算之后送回 dest

(4)循環(huán)控制指令

指令 名稱 語法 描述
loop 計(jì)數(shù)循環(huán)指令 loop label 使 ecx 寄存器的值減 1,當(dāng) ecx 寄存器的值不為 0 的時(shí)候跳轉(zhuǎn)至 lable发框,否則執(zhí)行 loop 之后的語句

(5)轉(zhuǎn)移指令

指令 名稱 語法 描述
jmp 無條件轉(zhuǎn)移指令 jmp label 無條件跳轉(zhuǎn)至標(biāo)號(hào)為 lable 的位置
call 過程調(diào)用指令 call label 直接調(diào)用 lable
je 條件轉(zhuǎn)移指令 je label zf = 1 時(shí)跳轉(zhuǎn)至標(biāo)號(hào)為 lable 的位置
jne 條件轉(zhuǎn)移指令 jne label zf = 0 時(shí)跳轉(zhuǎn)至標(biāo)號(hào)為 lable 的位置

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铣减,隨后出現(xiàn)的幾起案子江解,更是在濱河造成了極大的恐慌,老刑警劉巖徙歼,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犁河,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡魄梯,警方通過查閱死者的電腦和手機(jī)桨螺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酿秸,“玉大人灭翔,你說我怎么就攤上這事±彼眨” “怎么了肝箱?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)稀蟋。 經(jīng)常有香客問我煌张,道長(zhǎng),這世上最難降的妖魔是什么退客? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任骏融,我火速辦了婚禮链嘀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘档玻。我一直安慰自己怀泊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布误趴。 她就那樣靜靜地躺著霹琼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凉当。 梳的紋絲不亂的頭發(fā)上枣申,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音纤怒,去河邊找鬼。 笑死天通,一個(gè)胖子當(dāng)著我的面吹牛泊窘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播像寒,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼烘豹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了诺祸?” 一聲冷哼從身側(cè)響起携悯,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筷笨,沒想到半個(gè)月后憔鬼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胃夏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年轴或,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰禀。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡照雁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出答恶,到底是詐尸還是另有隱情饺蚊,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布悬嗓,位于F島的核電站污呼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏包竹。R本人自食惡果不足惜曙求,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悟狱,春花似錦静浴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浴麻,卻和暖如春得问,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背软免。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工宫纬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膏萧。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓漓骚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親榛泛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝌蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容