1. 程式人生 > >反彙編檢視gcc行為

反彙編檢視gcc行為

int i = 3;
printf(”%d/n”, i++ * ++i + i– * –i);

在吉林大學的視訊c教程中, 上式值為18.她的解法是字首優先於字尾,所以就是3 * 4 + 3 * 2。在gcc中得到的結果是25。

這種行為是標準未定義的。

可以通過反彙編來檢視gcc的行為。如下,我們看看呼叫printf之前gcc是如何操作i。

80483b5: c7 45 f8 03 00 00 00 movl $0×3,0xfffffff8(%ebp)

給i賦值3。

80483bc: 83 45 f8 01 addl $0×1,0xfffffff8(%ebp)

加1。i==4

80483c0: 8b 45 f8 mov 0xfffffff8(%ebp),%eax
80483c3: 89 c2 mov %eax,%edx
80483c5: 0f af 55 f8 imul 0xfffffff8(%ebp),%edx

計算此時的i*i。 16

80483c9: 83 6d f8 01 subl $0×1,0xfffffff8(%ebp)

把i減1,即i==3。

80483cd: 8b 45 f8 mov 0xfffffff8(%ebp),%eax
80483d0: 0f af 45 f8 imul 0xfffffff8(%ebp),%eax

計算i*i,即9。

80483d4: 8d 04 02 lea (%edx,%eax,1),%eax

把上面兩個乘的結果加起來,放入%eax。

80483d7: 83 45 f8 01 addl $0×1,0xfffffff8(%ebp)
80483db: 83 6d f8 01 subl $0×1,0xfffffff8(%ebp)

把i加1,再減1。

80483df: 89 44 24 04 mov %eax,0×4(%esp)

%eax就是最後結果,即25

80483e3: c7 04 24 d0 84 04 08 movl $0×80484d0,(%esp)
80483ea: e8 c9 fe ff ff call 80482b8 <[email protected]>

另外,如果你把gcc的優化級別調高一些,你會發現結果也是18。
如果你把i型別改成volatile int,結果是24。(3 * 4 + 4 * 3)

這個問題的關鍵是看編譯器怎麼處理暫存器和記憶體之間的關係,已經超出了
標準所規定的範圍。實際中這種程式碼是應該避免的。

From: Xiyoulinux Google Group

 

相關推薦

彙編檢視gcc行為

int i = 3; printf(”%d/n”, i++ * ++i + i– * –i); 在吉林大學的視訊c教程中, 上式值為18.她的解法是字首優先於字尾,所以就是3 * 4 + 3 * 2。在gcc中得到的結果是25。 這種行為是標準未定義的。 可以通過反彙編來檢視gcc的行為。如下,我們看看呼叫

Windows熱鍵註冊(彙編方法 檢視win32api 原理)

要像系統註冊一個全域性熱鍵,需要用到RegisterHotKey,函式用法如下(MSDN): BOOL RegisterHotKey(                   HWND hWnd,             int id,             UINT fsM

Android NDK中結合彙編分析Crash行為

1. Crash後 logcat中輸出綠色資訊: 05-02 10:14:37.130: I/DEBUG(1890): backtrace: 05-02 10:14:37.130: I/DEBUG(1890): #00 pc 00033fda /data/data/com.

彙編工具objdump的簡單使用

objdump這個工具可以用來將二進位制檔案(例如linux下的ELF可執行檔案)轉成彙編程式碼讓我們進行分析 linux系統裡邊可以直接使用這個命令 最常用的就是:objdump -d -M intel ./pwn1 -d 就是反彙編  &n

彙編stepldr exe——第一次使用IDA彙編(作者 wogoyixikexie gliet)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

轉——一個超級wince牛人使用彙編工具修改程式的方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android Smali彙編分析與除錯

很多Android APK由於加密了(比如加了花指令), 無法反彙編為Java程式。此時只能檢視Smali原始碼, 用Smali原始碼進行除錯分析。   smali以及baksmali的jar包用法 baksmali下載:jar包下載地址 命令列:java -jar baksm

IDA 逆向工程 彙編使用

IDA pro 7.0版本 from:freebuf 用到的工具有IDA pro 7.0  ,被反彙編的是百度雲(BaiduNetdisk_5.6.1.2.exe)。 首先,IDA pro的長相如下: 共有(File , Edit , Jump , Search , View , Deb

裝置樹編譯與彙編

轉載地址:https://blog.csdn.net/fight_onlyfor_you/article/details/74059029 1.編譯最新的核心 第一步  tar  -xvf   .........解壓核心 第二步  mak

FOR 延時彙編

C語言最大的缺點就是實時性差,我在網上到看了一些關於延時的討論,其中有篇文章 51微控制器 Keil C 延時程式的簡單研究,作者:InfiniteSpace Studio/isjfk 寫得不錯,他是用while(–i);產生DJNZ 來實現精確延時,後來有人說如果while裡面不能放其它語

彙編Dis解析

目錄 反彙編dis解析 COMM段BSS段 註釋段 Bl指令 title: 反彙編Dis解析 tags: ARM date: 2018-10-21 18:02:58 --- 反彙編dis解析 關於段,反彙編檔案中包含了程式碼段,資料段,bss段,co

eclipse類編譯檢視器外掛安裝教程

1、首先找到eclipse的安裝目錄——》開啟dropins資料夾 將下載的decompiler-3.0檔案放到dropins資料夾裡面 然後重啟eclipse,檢視該目錄下是否有類反編譯檢視器 decompiler-3.0下載路徑 https://download.csdn

java 彙編操作

javap命令引數 C:\>javap -help 用法: javap <options> <classes> 其中, 可能的選項包括: -help --help -? 輸出此用法訊息 -version

c/c++彙編彙編命令執行語句

上圖來源於中國MOOK大學南京大學袁春風老師課件,從高階語言到底層二進位制程式碼按此流程一步步進行。 我們首先可以在建立一個c檔案,如果虛擬機器與你的Windows還不可以進行檔案共享,可以開啟Terminal(同windows下的cmd。我的是在/usr/share/Terminal這個

簡單例項分析objdump彙編用法

objdump -rdS 可可執行檔案   objdump命令是用檢視目標檔案或者可執行的目標檔案的構成的gcc工具。   1. 準備程式碼hello.c #include <linux/module.h> #include <linux/

彙編C++ OOP程式碼 分析建構函式如何被呼叫 以及簡單的C++物件記憶體模型

在今天進行C++程式碼的思考時,產生一個疑問,就是C++類的建構函式是如何被呼叫的 於是就做了一個簡單的實驗來驗證自己的想法。 //main.cpp #include &lt;stdio.h&gt; class People{ private: int i; i

彙編演算法介紹和應用——線性掃描演算法分析

        做過逆向的朋友應該會很熟悉IDA和Windbg這類的軟體。IDA的強項在於靜態反彙編,Windbg的強項在於動態除錯。往往將這兩款軟體結合使用會達到事半功倍的效果。可能經常玩這個的朋友會發現IDA反彙

彙編演算法介紹和應用——遞迴下降演算法分析

上一篇博文我介紹了Windbg使用的線性掃描(linear sweep)反彙編演算法。本文我將介紹IDA使用的遞迴下降(recursive descent)反彙編演算法。(轉載請指明來源於breaksoftware的csdn部落格)       &

Android 中 vector 彙編示例

前言 最近遇到一個 native crash 問題,如下所示:(Android 8.1) Revision: '0' ABI: 'arm64' pid: 1863, tid: 3348, name: Binder:1863_F >>> sys

利用彙編手段解析C語言函式

轉自: https://blog.csdn.net/songjinshi/article/details/8450419   1、問題的提出 函式是 C語言中的重要概念。利用好函式能夠充分利用系統庫的功能寫出模組獨立、易於維護和修改的程式。函式並不是 C 語言獨有的概念,