第三編:匯編基礎(chǔ) jmp,call和cmp指令

Flags

flag就像寄存器恳谎,除了每個只保持1位,不是1(true)就是0(false)。每個標(biāo)志是一個大寄存器的一部分尝蠕。所以有人會叫Flags寄存器或eFlag寄存器侦香,每個位是一個flag,你沒需記憶這些flag纺阔,只需要了解這些flag的基本含義即可。


指針

匯編中寄存器是一個指針這個說法,對于大部分通用寄存器是成立的撞蚕。但寄存器并不是只能存儲內(nèi)存地址,也可以緩存變量實際的值,當(dāng)他們被當(dāng)作指針使用的時候过牙,即指向存儲數(shù)據(jù)的地址甥厦,當(dāng)指針指向某個數(shù)據(jù)時,意味著該指針持有該數(shù)據(jù)值的地址寇钉,也就是指針存儲的值就是該數(shù)據(jù)的地址刀疙。


備注:

  • ip,sp扫倡,bp是16位的版本
  • eip谦秧,esp,ebp是32位的版本
  • rip撵溃,rsp疚鲤,rbp是64位的版本

要將一個寄存器作為指針,可以將寄存器的名稱包裹在符號“[ ]”里面,例如“rax”就可以變成“[rax]”

mov rax,rbx

上面的示例是加載rbx寄存器中的數(shù)據(jù)值到rax寄存器中

mov rax,[rbx]

例如:加載rbx寄存器指向的數(shù)據(jù)值到rax寄存器中,注意下面的指令并不是加載rbx的值到rax,rbx的值是什么?要牢記是此處寄存器的值始終一個指向某個保存著數(shù)據(jù)值的內(nèi)存地址,因此mov指令將到存儲在rbx寄存器中的地址缘挑,并從該地址拉出該數(shù)據(jù)值,并將該值賦給rax寄存器集歇。

我們將會討論rip指針和說明一下什么是控制流(Control Flow)

控制流

我們將會討論rip指針和說明一下什么是控制流(Control Flow),可以這么說,rip指針說是程序執(zhí)行的跟蹤器卖哎。

默認(rèn)情況下鬼悠,所有代碼都從上到下運(yùn)行,程序流的方向稱為控制流(Control-Flow)亏娜。每條指令后焕窝,其增量1,從而使控制流從上到下自然地流動维贺。以下面的hello world編譯代碼為示例

從指令move rax它掂,1開始,我們假設(shè)這個位置的內(nèi)存地址用K表示溯泣,當(dāng)該條指令執(zhí)行行rip指針會轉(zhuǎn)換1虐秋,用于指向嚇一跳待執(zhí)行的指令的內(nèi)存地址,示例中的
rip = k
rip = k + 1
rip = k + 2
rip = k + 3
rip = k + 4
這只是一種讓讀者理解的偽代碼垃沦,不是實際的匯編代碼的一部分客给。某些指令執(zhí)行后,可能另類rip指針遞增2肢簿,或遞增3靶剑,而不應(yīng)僅增加1蜻拨,所以上面的偽代碼不一定準(zhǔn)確的,只是用于表示這里最簡單的一種控制流的模式桩引。
我們發(fā)現(xiàn)hello-world的匯編嗲嗎是從頂往底執(zhí)行的缎讼,這是一個默認(rèn)的控制流

jmp指令

這一節(jié)將看一下jump,正如其名那樣就是“跳轉(zhuǎn)”的意思,只要jmp指令后家可用的label名稱就能跳轉(zhuǎn)到代碼的不同部分。它們用于更改程序流的執(zhí)行順序坑匠。jmp一般格式為:

jmp label

例如:



這個就等價于下面高級語言中的while 無限循環(huán)

while(true){
    .....
}

當(dāng)調(diào)用jmp指令,它跳轉(zhuǎn)到到某個內(nèi)存地址時會把該label的內(nèi)存地址的值加載到rip寄存器中血崭,因此,本質(zhì)上您是在調(diào)用jmp然后調(diào)用諸如jmp _start之類的東西厘灼。 它實際上只是將_start標(biāo)簽的內(nèi)存加載到rip寄存器中(上面的例子其實就是無限地在寄存器刷新_start標(biāo)簽所在的內(nèi)存地址)夹纫。

備注:濫用jmp,可能會令你墮入回調(diào)的地獄。

cmp

cmp指令其實就是通過比較允許程序根據(jù)某些條件采用不同的策略去執(zhí)行不能的指令,如果結(jié)合jmp指令能夠?qū)崿F(xiàn)復(fù)制的回調(diào)效果设凹。cmp的一般格式是

cmp 寄存器名稱,寄存器名稱/值

例子:

cmp rax,rbx
cmp rax 117;

cmp會產(chǎn)生的結(jié)果捷凄,寄存器中特定的flag位就會被設(shè)定,例如

  • x=y,ZF標(biāo)記就會被重置為ZF=1
  • x≠y,ZF標(biāo)記就會被重置為ZF=0

最后,不論你進(jìn)行什么比較围来,都將會重置SF標(biāo)記

  • x-y,SF標(biāo)記就會根據(jù)msb(x-y)的運(yùn)算結(jié)果而定

備注:不需要記住所有這些cmp指令和flag標(biāo)記的相關(guān)性

條件性跳轉(zhuǎn)

比較之后匈睁,可以進(jìn)行條件跳轉(zhuǎn)监透,條件跳轉(zhuǎn)基于標(biāo)志的狀態(tài)
代碼中的條件跳轉(zhuǎn)就像_jumps一樣編寫,但是“ jmp”被替換為條件跳轉(zhuǎn)的符號航唆。


例子:
如果rax寄存器指向的數(shù)據(jù)值等于23這行代碼會跳轉(zhuǎn)到標(biāo)簽"_fckU"

cmp rax,43
je _fckU

如果rax寄存器指向的數(shù)據(jù)值大于rbx寄存器指向的數(shù)據(jù)值胀蛮,這行代碼會跳轉(zhuǎn)到標(biāo)簽"_fckH"

cmp rax,rbx
jg _fckH

Call指令

call和jmp大致上是相同的。然而當(dāng)使用“call”指令時糯钙,可以使用“ ret”返回調(diào)用的原先的位置.

在下面的示例中粪狼,是使用call 調(diào)用_printHello標(biāo)記的section內(nèi)部的代碼,打印“Hello,World!",然后在_printHello的section內(nèi)部執(zhí)行到ret指令,會返回到原先_start標(biāo)記內(nèi)部的位置任岸,并且繼續(xù)執(zhí)行下面的“mov rax,72”的指令再榄。這種調(diào)用機(jī)制叫“子程序調(diào)用(subroutine)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市享潜,隨后出現(xiàn)的幾起案子困鸥,更是在濱河造成了極大的恐慌,老刑警劉巖剑按,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疾就,死亡現(xiàn)場離奇詭異,居然都是意外死亡艺蝴,警方通過查閱死者的電腦和手機(jī)猬腰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猜敢,“玉大人姑荷,你說我怎么就攤上這事盒延。” “怎么了厢拭?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵兰英,是天一觀的道長。 經(jīng)常有香客問我供鸠,道長畦贸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任楞捂,我火速辦了婚禮薄坏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寨闹。我一直安慰自己胶坠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布繁堡。 她就那樣靜靜地躺著沈善,像睡著了一般。 火紅的嫁衣襯著肌膚如雪椭蹄。 梳的紋絲不亂的頭發(fā)上闻牡,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音绳矩,去河邊找鬼罩润。 笑死,一個胖子當(dāng)著我的面吹牛翼馆,可吹牛的內(nèi)容都是我干的割以。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼应媚,長吁一口氣:“原來是場噩夢啊……” “哼严沥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起中姜,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤祝峻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扎筒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莱找,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年嗜桌,在試婚紗的時候發(fā)現(xiàn)自己被綠了奥溺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡骨宠,死狀恐怖浮定,靈堂內(nèi)的尸體忽然破棺而出相满,到底是詐尸還是另有隱情,我是刑警寧澤桦卒,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布立美,位于F島的核電站,受9級特大地震影響方灾,放射性物質(zhì)發(fā)生泄漏建蹄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一裕偿、第九天 我趴在偏房一處隱蔽的房頂上張望洞慎。 院中可真熱鬧,春花似錦嘿棘、人聲如沸劲腿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焦人。三九已至,卻和暖如春重父,著一層夾襖步出監(jiān)牢的瞬間垃瞧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工坪郭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脉幢。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓歪沃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嫌松。 傳聞我的和親對象是個殘疾皇子沪曙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 王爽匯編全書知識點大綱 第一章 基礎(chǔ)知識 機(jī)器語言 匯編語言的產(chǎn)生 匯編語言的組成 存儲器 cpu對存儲器的讀寫 ...
    2c3ba901516f閱讀 2,408評論 0 1
  • 條件碼,每個條件碼是單個bit萎羔。 CF:進(jìn)位標(biāo)志液走。最近的操作使最高位產(chǎn)生了進(jìn)位。ZF:零標(biāo)志贾陷。最近的操作得到的結(jié)果...
    CSU_IceLee閱讀 455評論 0 0
  • 計算機(jī)通過執(zhí)行指令序列來使機(jī)器得以工作缘眶,所以對于每一系列的計算機(jī)都有指定的一組指令集供計算機(jī)使用,這組指令...
    未來科技工作室閱讀 7,951評論 1 10
  • CPU執(zhí)行的也不只是一條指令髓废,一般一個程序包含很多條指令 因為有if…else巷懈、for這樣的條件和循環(huán)存在,這些指...
    JavaEdge閱讀 559評論 1 2
  • x86匯編指令集包括x86-64(intel-64,amd64, emt64), x86-32, x86-16 內(nèi)...
    bitzoo閱讀 3,621評論 0 1