反彙編檢視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 <stdio.h> 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 語言獨有的概念,