在學習c++中const關鍵字的過程當中,常常會看到各類寄存器、彙編指令分析,像下面的圖這樣c++
左圖是g++中反彙編的效果,右圖是vs中反彙編的效果。ubuntu
若是咱們想要查看源碼所對應的彙編語言,應該怎麼操做呢?windows
1.ubuntu系統g++sass
g++中通常使用GDB進行調試。架構
. ├── build ├── CMakeLists.txt ├── include │ └── CMakeLists.txt └── src └── consttest.cc
個人工程文件下文件結構如上所示,進行 cmake .. && make以後 build 文件夾下函數
build ├── CMakeCache.txt ├── CMakeFiles │ ├── 3.5.1 │ │ ├── CMakeCCompiler.cmake │ │ ├── CMakeCXXCompiler.cmake │ │ ├── CMakeDetermineCompilerABI_C.bin │ │ ├── CMakeDetermineCompilerABI_CXX.bin │ │ ├── CMakeSystem.cmake │ │ ├── CompilerIdC │ │ │ ├── a.out │ │ │ └── CMakeCCompilerId.c │ │ └── CompilerIdCXX │ │ ├── a.out │ │ └── CMakeCXXCompilerId.cpp │ ├── cmake.check_cache │ ├── CMakeDirectoryInformation.cmake │ ├── CMakeOutput.log │ ├── CMakeTmp │ ├── consttest.dir │ │ ├── build.make │ │ ├── cmake_clean.cmake │ │ ├── CXX.includecache │ │ ├── DependInfo.cmake │ │ ├── depend.internal │ │ ├── depend.make │ │ ├── flags.make │ │ ├── link.txt │ │ ├── progress.make │ │ └── src │ │ └── consttest.cc.o │ ├── feature_tests.bin │ ├── feature_tests.c │ ├── feature_tests.cxx │ ├── Makefile2 │ ├── Makefile.cmake │ ├── progress.marks │ └── TargetDirectories.txt ├── cmake_install.cmake ├── consttest └── Makefile
step 1:產生咱們的可執行文件 consttest 後,在 build 路徑下輸入 gdb consttest 會進入到 gdb 調試模式學習
step 2:而後再輸入 disassemble consttest 進入下面的狀態ui
step 3:查看完後自動退出,gdb模式下鍵入q退出調試。spa
2.windows 7系統vs2010線程
step 1:在main函數的某個位置設置一個斷點
step 2:菜單欄中調試-->啓動調試,或者直接使用快捷鍵F5
step 3:在上一步以後程序應該運行到斷點所在行,此時調試-->窗口-->反彙編就能進入到反彙編狀態
3. 彙編語言基本術語
ESP(Extended Stack Pointer): 堆棧指針,寄存器存放當前線程的棧頂指針; 例如用ebp保存當前棧指針: move ebp, esp
EBP(Extended Base Pointer): 基址指針,寄存器存放當前線程的棧底指針; 例如將基址指針壓入棧: push ebp
EIP:寄存器存放下一個CPU指令存放的內存地址,當CPU執行完成當前的指令後,從EIP寄存器中讀取下一條指令的內存地址,而後繼續執行;
EAX: 累加器(Accumulator),加法乘法指令的缺省寄存器;
EBX: 基地址(Base)寄存器,在內存尋址時存放基地址;
ECX:計數器(Counter),是重複(REP)前綴指令和LOOP指令的內定計數器;
EDX:存放整數除法產生的餘數;
ESI/EDI: 源/目標索引寄存器(Source/Destination Index), 在不少字符串操做指令中,DS:ESI指向源串,而ES:EDI指向目標串。
開頭字母好像跟CPU架構有關,x86是32位系統以e開頭,x86-64是64位系統以r開頭。