C++利用匯編挖掘編程語言的本質..

1.謬論

很多非一手的資料特別是中文資料其實并不可靠 因為很多作者都是直接通過轉載他人的作品 也不管他人作品真與假 而且有一部分的作品中的言論和官方描述相去甚遠 有的則是翻譯的過程中出現了問題
比如sizeof很多人認為是一個函數 其實他并不是一個函數 而是一個運算符 是一個一元運算符

而且就算官方也有出錯的時候 這就要求我們具有辨別的能力了

2.建議

首選官方資料(手冊、官網……)
英文資料 > 中文資料
具備驗證知識點正確性的能力(有關編程語言知識點的正確性 掌握匯編語言是最靠譜的檢驗手段)

3.匯編的好處

1.可以檢驗知識點的正確性
2.可以進行破解
3.可以制作外掛

4.代碼本質挖掘

1.sizeof本質

sizeof本質上不是一個函數 而是一個運算符
在匯編語言中 函數利用了call完成調用操作 而在sizeof的底層匯編中 壓根沒有call的影子 說明根本就不是所謂的函數
在這里插入圖片描述
從另外一個方面也可以看出sizeof不是一個函數
在這里插入圖片描述
我們可以看到直接打印sizeof(char)的結果和打印sizeof(char)的底層匯編所執行的操作是一模一樣的 說明編譯器在編譯階段是直接可以識別出sizeof()的結果并且替換成相應的結果(因此sizeof也被稱為編譯時特性) 既然如此 更能說明sizeof不是一個函數

2.a++和++a的區別

3.if-else和switch的效率比較

4.程序的內存布局

5.多態的實現原理

5.程序的本質

程序是以機器碼(或稱作CPU指令 即由0和1組成的)的形式儲存在硬盤中的(在儲存之前 是由編譯器將其編譯成機器碼的) 當運行軟件的時候 程序會被裝載到內存之中 然后CPU會根據機器碼的要求調用計算機的其他設備完成相關的需求(CPU只能識別機器碼)
CPU由寄存器、運算器、控制器組成 其中寄存器也有和內存一樣的儲存功能 那么CPU在訪問寄存器方面肯定是比內存要來的快的 原因在于寄存器更加接近CPU

6.寄存器和內存

通常情況下 CPU會先將內存中的數據儲存到寄存器中 然后在對寄存器中的數據進行訪問或者運算
在這里插入圖片描述
我的要求是對紅色內存中的數據進行加一操作
其中 首先會將紅色內存中的數據儲存到eax寄存器中 即mov eax, 紅色內存空間
接著讓EAX的數據和1相加 即add eax, 1
最后會將結果儲存到藍色的內存空間中 即mov 藍色內存空間, eax

從反匯編的角度也可以說明驗證我的說法
在這里插入圖片描述

7.編程語言的發展

機器語言(由0和1組成) -> 匯編語言(用符號替代了0和1 可讀性更強了) -> 高級語言(c/c++/java…… 接近人類自然語言 更具有可讀性)
對于同一個操作 將寄存器ebx的內容傳入到eax中(以下代碼是偽代碼)
機器語言:010100000001111011010
匯編語言:mov eax, ebx
高級語言:eax = ebx;

很多語言都有高級語言編譯成匯編語言、匯編語言編譯成機器語言最終運行到計算機上的過程
其中匯編語言和機器語言是可以相互轉換的 也就是說匯編可以編譯成機器語言 機器語言也可以反編譯成匯編語言 所以匯編語言和機器語言是一一對應的 每一條匯編語言都有與之對應的機器語言
然而高級語言雖然可以通過編譯得到匯編/機器 但是匯編/機器幾乎不能夠反編譯成高級語言
在這里插入圖片描述
在這里插入圖片描述
對比兩張圖片可以看到兩個不同的高級語言底層的匯編/機器是一模一樣的 更能說明匯編/機器幾乎不能夠還原成高級語言(因為一旦還原的話 會產生歧義)

不同的CPU架構(x86和arm)的機器指令是不一樣的(CPU架構不一樣 CPU就不一樣 那么所處理的機器指令也就不一樣)

8.一些編程語言的本質

1.編譯型語言(不依賴虛擬機)

諸如C/C++/OC/Swift 輕易反匯編
在這里插入圖片描述

2.腳本語言

諸如Python/PHP/JS 由腳本引擎(比如瀏覽器等)解析
在這里插入圖片描述

3.編譯型語言(依賴虛擬機)

Java/Ruby 由JVM進行字節碼的裝載
在這里插入圖片描述

9.visual studio中的反匯編

在這里插入圖片描述
從上圖可見 反匯編中的每一行大致都是由三部分組成 第一部分是內存中用于標識機器碼的位置的地址值 第二部分則是這段代碼的機器碼 第三部分則是這段代碼的匯編代碼
在這里插入圖片描述

而且高級語言中的一行代碼不一定對應著匯編/機器碼中的一行 可能是多行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【FAQ】HarmonyOS SDK 閉源開放能力 —Push Kit

1.問題描述 升級到4.0.0.59版本后,通過pushService.getToken獲取華為的token時報如下錯誤:Illegal application identity. 解決方案 Mate 40 Pro (NOH) 從 4.0升級到4.1版本后,會出現UDID變化,影響歷史的調試簽名使用&#xff…

檔案數字化驗收流程

檔案數字化驗收流程通常包括以下步驟: 1. 確定驗收標準:制定檔案數字化驗收標準,明確要求檢查的內容、質量要求、驗收標準等。 2. 準備驗收環境:為檔案數字化驗收準備合適的環境,包括驗收場所、設備、人員等。 3. 準備…

vscode 引入外部依賴包

背景 我要在vscode中寫一些antlr代碼生成的cpp代碼,但是在引入頭文件#include "antlr4-runtime.h"的時候,出現報錯,顯示沒有這個頭文件,顯然這是我們沒有導入相關的包,因此我首先嘗試了將antlr4的依賴源碼在…

Semantic human matting

1.introduction 數據集包括,時尚模特數據集,超過18.8w張模特圖,從中選出35311張圖片,DIM數據集,僅包含人類的圖像,202個前景圖像,背景來自coco數據集和互聯網,背景圖不含人類&#x…

python 基礎知識點(藍橋杯python科目個人復習計劃56)

今日復習內容:做題 例題1:最小的或運算 問題描述:給定整數a,b,求最小的整數x,滿足a|x b|x,其中|表示或運算。 輸入格式: 第一行包括兩個正整數a,b; 輸出格式&#…

小烏龜操作Git

1、選擇小烏龜作為git客戶端 最近使用idea來操作git的時候頻頻出現問題,要么是提交代碼的時候少了某些文件,導致克隆下來無法運行,要么是提交速度太慢。 反正是在idea中操作git體驗非常不好,所以決定來換一種方式來操作git。從網…

藍橋杯算法題匯總

一.線性表:鏈式 例題:旋轉鏈表 二.棧: 例題:行星碰撞問題 三.隊列 三.數組和矩陣 例題:

FPGA-VGA成像原理與時序

什么是VGA: VGA, Video Graphics Array。即視頻圖形陣列,具有分辨率高、顯示速率快、顏色豐富等優點。VGA接口不但是CRT顯示設備的標準接口,同樣也是LCD液晶顯示設備的標準接口,具有廣泛的應用范圍。在FGPA中,常廣泛用于圖像處理等領域。 VGA 顯示器成像原理 在 VGA 標準剛興…

C語言 vs Rust應該學習哪個?

C語言 vs Rust應該學習哪個? 在開始前我有一些資料,是我根據網友給的問題精心整理了一份「C語言的資料從專業入門到高級教程」, 點個關注在評論區回復“888”之后私信回復“888”,全部無償共享給大家!!&am…

bun 文件類型

Typescript Bun 原生支持開箱即用的 TypeScript。所有文件在執行之前都由 Bun 的快速本機轉譯器即時轉譯。與其他構建工具類似,Bun 不執行類型檢查;它只是從文件中刪除類型注釋。 bun index.js bun index.jsx bun index.ts bun index.tsxBun 運行時行為的某些方面…

linux系統如何安裝nginx

首先下載nginx安裝包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解壓安裝包 tar -zxvf nginx-1.23.1.tar.gz如果服務器沒有wget,可以安裝一下,有的話可以跳過 yum install -y wget 然后安裝相關依賴 yum install -y gcc-c zlib zl…

最新企微hook開源版

免費的企微框架 支持文本消息,圖片消息,視頻消息,文件消息。 其他可自行下載測試。 有興趣可以進群交流。720192224 。群內不定期開源氣味hook源碼 BOOL WxWorkSendData(string data) { WX_GETOBJDATA obj { 0 }; //參數結構…

MATLAB練習題:排隊論問題的模擬

?講解視頻:可以在bilibili搜索《MATLAB教程新手入門篇——數學建模清風主講》。? MATLAB教程新手入門篇(數學建模清風主講,適合零基礎同學觀看)_嗶哩嗶哩_bilibili 下面我們來看一道排隊論的題目。假設某銀行工作時間內只有一個…

Kubernetes/k8s的核心概念

一、什么是 Kubernetes Kubernetes,從官方網站上可以看到,它是一個工業級的容器編排平臺。Kubernetes 這個單詞是希臘語,它的中文翻譯是“舵手”或者“飛行員”。在一些常見的資料中也會看到“ks”這個詞,也就是“k8s”&#xff…

如何解決代理ip服務器連接問題

在當今的數字化時代,互聯網連接已成為生活和工作中不可或缺的一部分。然而,在嘗試訪問互聯網資源時,用戶有時會遇到“代理服務器可能有問題,或地址不正確(你尚未連接)”的錯誤提示。這種情況通常表明計算機的網絡設置存在問題&…

自然語言處理之語言模型(LM):用c++通過自然語言處理技術分析語音信號音高

要通過自然語言處理技術分析語音信號音高,我們可以采用以下步驟: 首先,我們需要獲取語音信號的原始音頻數據。可以使用C中的音頻處理庫(例如PortAudio或ALSA)來捕獲音頻輸入并將其轉換為數字音頻數據。 接下來&#x…

python統計分析——廣義線性模型的評估

參考資料:用python動手學統計學 殘差是表現數據與模型不契合的程度的重要指標。 1、導入庫 # 導入庫 # 用于數值計算的庫 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 導入繪圖的庫 import matplotlib.pyplot as plt i…

mybatis中if的test如何判斷雙等號(==)

我們在寫mybatis.xml時往往會寫!&#xff0c;如&#xff1a; <if test"validType ! null and validType ! "> </if>當時如何判斷等于某一個值呢&#xff0c;如下將test的雙引號改為單引號&#xff0c;值用雙引號&#xff1a; <if testvalidType &q…

面經 | Java創建線程的三種方式

利用JUC包創建線程的三種方式&#xff1a; 通過繼承Thread類創建線程類實現Runnable接口創建線程類通過Callable和Future接口創建線程 繼承Thread類創建線程 class Thread1 extends Thread {Overridepublic void run() {System.out.println("啟動線程1");} }實現R…

第七篇:微信小程序的跳轉頁面

前提&#xff1a;建議還沒學HTML、CSS、JavaScript、JSON、vue、Ajax的兄弟姐妹們&#xff0c;先去把這些基礎補好過一遍&#xff0c;不然不好理解微信小程序 前面這一篇已經講過一次<navigator>跳轉頁面的用法了&#xff0c;今天詳細講解一下 回顧&#xff1a; 小程序…