www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 程序員寫個解
[導(dǎo)讀]從匯編角度來說,如果“test %al, %al”能改成“test %0x1, %al”就沒有匪夷所思的問題了,如此一來應(yīng)該會降低CPU的效率,畢竟執(zhí)行指令還需要一個立即數(shù),我沒搞過編譯器也沒設(shè)計過CPU,純屬瞎猜,能搞編譯器的家伙都是大牛的存在,咱們吃瓜的參合個啥!

上一篇文章《C語言bool占用4個字節(jié)?匯編之下無秘密|帶你看extern》分析在C99標(biāo)準(zhǔn)下bool類型占用1Byte,而不是1bit,C語言 不存在內(nèi)存長度小于8bit的數(shù)據(jù)類型,思考:

1、如果bool類型高7bit不是0,使用bool類型是否出現(xiàn)匪夷所思的結(jié)果?

2、執(zhí)行if判斷bool類型時,它判斷的是所有8比特?還是最低比特?

接下來我分享一個奇特的案例現(xiàn)象,并在從反匯編角度去解釋現(xiàn)象產(chǎn)生原因。

1. 俄羅斯轉(zhuǎn)輪

玩?zhèn)€勇敢者的賭槍游戲——俄羅斯轉(zhuǎn)輪。

左輪手槍彈槽篩入一顆子彈,快速旋轉(zhuǎn)彈槽,合上彈槽,朝著對方腦袋開槍,活下來的勝利。接下來友請賭槍游戲必勝客“燕雙鷹”。

燕雙鷹:“我有個習(xí)慣,會殺死向自己開槍的人,哪怕他的槍里沒有子彈……”

我:“等等燕大俠,沒搶、沒搶。解放了70年咯,1966年在大會堂玻璃被子彈擊穿事件后,周總理就下達(dá)指令全民禁槍、民眾自愿上繳槍械?!?/span>

燕雙鷹:“那為什么請我出場?”

我:“21世紀(jì)國家科研、資本家壓榨都講成本,沒有槍械,可以模擬呀。自動駕駛不一定都需要先造車再去馬路上跑,完全能建立3D場景,在游戲虛擬環(huán)境下訓(xùn)練自動駕駛算法。同樣賭槍游戲也能模擬。

“子彈放在8bit寄存器里,寄存器相當(dāng)于彈槽,最低比特相當(dāng)于蓄勢待發(fā)的子彈。下面是游戲的源代碼。”


傳入0:表示搶里沒有子彈。

傳入1:表示子彈在第1激發(fā)位置。

傳入2:表示子彈在第2激發(fā)位置。

傳入4:表示子彈在第3激發(fā)位置。


燕雙鷹:“明白,來~咱們弄點刺激的,隨機(jī)放入2顆子彈如何,編劇從來沒允許賭搶上輸過。”

我:“大俠且慢,暖男郭先生說沖動是魔鬼,咱們1顆子彈試試水?!?/span>

篩入1顆子彈,子彈落入第2激發(fā)位置,扣動扳機(jī),屏幕上顯示“false:燕雙鷹贏”。燕雙鷹臉上漏出招牌式微笑。

下一刻屏幕緊跟著輸出“true:Bang 燕雙鷹你輸了”,燕雙鷹眉頭顯出深深的“川”字紋。

各位看官,你能想到燕雙鷹中彈原因嗎?當(dāng)然,如果你能保證絕對不會往布爾類型傳遞0/1以外的值,本文不用繼續(xù)往下讀。

all: @gcc bool-char.c -g @objdump a.out -S > a.dis @./a.out 0 @./a.out 1 @./a.out 2 @./a.out 3

2. 匯編解釋

接下來解釋燕雙鷹為什么會輸。

同樣的代碼在x86、ARM、mips架構(gòu)下用gcc編譯,執(zhí)行結(jié)果都一樣,至于匯編我只解釋x86架構(gòu)下的指令。

兩條件表達(dá)式的匯編都差不多,唯一區(qū)別是第一條多一個異或指令。


movzbl -0x9(%rbp),%eax:以4Byte方式載入數(shù)據(jù)到eax寄存器,eax是32bit寄存器,eax存儲的是彈槽子彈位置。

test %al, %al:al寄存器的值和它自己“與”操作,al是eax的低8bit寄存器。只要al寄存器8bit不全為0,則返回真。

test指令和and指令都是執(zhí)行“與”操作,不過test指令會影響3個標(biāo)志位:SF(執(zhí)行后數(shù)據(jù)的正負(fù))、ZF(執(zhí)行后結(jié)果是否為0)、PF(執(zhí)行后二進(jìn)制1的個數(shù)是否為偶數(shù)),and指令不會修改他們, 本文關(guān)注的是ZF標(biāo)志位。

xor $0x1,%eax:僅對eax寄存器的最低比特執(zhí)行異或。

C代碼“if(!a)”的感嘆號“!”被編譯器翻譯成xor和test的組合。注意到了嗎,只要eax不是0或1,兩條指令都會執(zhí)行。

2.1. 執(zhí)行if(!a)

如果eax=0x00,則xor結(jié)果eax=0x01;test返回真

如果eax=0x01,則xor結(jié)果eax=0x00;test返回假

如果eax=0x02,則xor結(jié)果eax=0x03;test返回

2.2. 執(zhí)行if(a)

如果eax=0x00,test返回假

如果eax=0x01,test返回真

如果eax=0x02,test返回

3. 小白才寫得出的代碼

看官或許會想:“正常情況誰會這么寫例子上的垃圾代碼,往bool傳遞0/1以外的數(shù)據(jù),八成是作者為了水文章瞎弄文案?!?/span>

“No No No?!?/span>

6年前我曾今寫過一個C函數(shù),函數(shù)需要傳遞bool類型“指針”。在同事眼里:“布爾類型嘛,懂~,老熟人咯?!?/span>

于是,他強(qiáng)制轉(zhuǎn)換char為bool,向我的函數(shù)傳遞變量指針。

絕大多數(shù)C語言學(xué)習(xí)者的實操平臺要么是Keil C51、要么是Trubo C,兩個編譯環(huán)境都使用C89標(biāo)準(zhǔn),按照C89的套路,bool類型通常都是重新定義char得來(typedef char bool),殊不知bool類型已經(jīng)被C99正式收編,GCC也給它名份,成了C語言家族的第9房小妾(其他妻妾包括char、short、int、long、float、double、void、指針)。


								
void fun(bool *a){ if (!*a) { printf("false\r\n"); } if (*a) { printf("true\r\n"); }}int main(int argc, char **argv) { char in = 2;  fun((bool*)&in); return 0;}

若同事規(guī)規(guī)矩矩的向布爾類型賦值0(false)或1(true)還好,可誰曾想到他某次傳遞一個2進(jìn)去,一個表達(dá)式憑什么既可能是true、也同時是false呢?

$ ./a.out falsetrue

猜測同事把布爾類型和布爾表達(dá)式搞混了:

布爾類型:只觀察最低比特

布爾表達(dá)式:非0即是真。


4. 指令修改

從匯編角度來說,如果“test %al, %al”能改成“test %0x1, %al”就沒有匪夷所思的問題了,如此一來應(yīng)該會降低CPU的效率,畢竟執(zhí)行指令還需要一個立即數(shù),我沒搞過編譯器也沒設(shè)計過CPU,純屬瞎猜,能搞編譯器的家伙都是大牛的存在,咱們吃瓜的參合個啥!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

8位單片機(jī)在嵌入式設(shè)計領(lǐng)域已經(jīng)成為半個多世紀(jì)以來的主流選擇。盡管嵌入式系統(tǒng)市場日益復(fù)雜,8位單片機(jī)依然不斷發(fā)展,積極應(yīng)對新的挑戰(zhàn)和系統(tǒng)需求。如今,Microchip推出的8位PIC?和AVR?單片機(jī)系列,配備了先進(jìn)的獨立...

關(guān)鍵字: 單片機(jī) 嵌入式 CPU

上海2025年8月15日 /美通社/ -- 在數(shù)字化轉(zhuǎn)型浪潮與數(shù)據(jù)安全需求的雙重驅(qū)動下,瀾起科技今日重磅推出第六代津逮? 性能核 CPU (以下簡稱 C6P )。這款融合突破性架構(gòu)、全棧兼容性與芯片級安全防護(hù)的高性能服...

關(guān)鍵字: CPU BSP 數(shù)字化 AI

采用分離式架構(gòu),充分利用主機(jī) CPU 和 PCIe? 基礎(chǔ)設(shè)施,克服傳統(tǒng)存儲瓶頸

關(guān)鍵字: CPU 數(shù)據(jù)中心 服務(wù)器

受生成式 AI 驅(qū)動, RISC-V 芯片市場快速發(fā)展。預(yù)計到2030年,RISC-V SoC出貨量將達(dá)到1618.1億顆,營收將達(dá)到927億美元。其中,用于AI加速器的RISC-V SoC出貨量將達(dá)到41億顆,營收將達(dá)...

關(guān)鍵字: RISC-V CPU AI CUDA ARM 推理

7月21日消息,“全球最佳游戲CPU”銳龍7 9800X3D自去年11月上市以來,價格一直比較堅挺,前期還經(jīng)常處于缺貨狀態(tài)。

關(guān)鍵字: CPU GPU

在C語言編程中,結(jié)構(gòu)體內(nèi)存對齊是一個容易被忽視卻影響深遠(yuǎn)的關(guān)鍵問題。它不僅關(guān)乎程序性能,更直接影響到內(nèi)存占用效率,尤其在嵌入式系統(tǒng)等資源受限環(huán)境中顯得尤為重要。本文將深入探討結(jié)構(gòu)體內(nèi)存對齊的原理,并分享手動調(diào)整與編譯器優(yōu)...

關(guān)鍵字: C語言 內(nèi)存對齊 編譯器

人工智能 (AI) 正在以驚人的速度發(fā)展。企業(yè)不再僅僅是探索 AI,而是積極推動 AI 的規(guī)模化落地,從實驗性應(yīng)用轉(zhuǎn)向?qū)嶋H部署。隨著生成式模型日益精簡和高效,AI 的重心正從云端轉(zhuǎn)向邊緣側(cè)。如今,人們不再質(zhì)疑邊緣 AI...

關(guān)鍵字: 人工智能 CPU GPU

CPU通過將代碼轉(zhuǎn)換為機(jī)器語言、通過指令集架構(gòu)(ISA)識別代碼、以及利用控制單元(CU)和算術(shù)邏輯單元(ALU)執(zhí)行代碼這三種主要方式來認(rèn)識代碼。CPU首先將編寫的高級語言代碼通過編譯器轉(zhuǎn)換為低級語言,即機(jī)器語言,這是...

關(guān)鍵字: CPU 機(jī)器語言

編譯器不僅是連接硬件與軟件的橋梁,還直接影響MCU的性能優(yōu)化與功能安全。面對汽車行業(yè)對高可靠性、低功耗和高算力的需求,編譯器需在確保ASIL-D等嚴(yán)格標(biāo)準(zhǔn)的同時,最大化發(fā)揮RISC-V芯片的潛力。

關(guān)鍵字: 車規(guī)MCU RISC-V 編譯器 HighTec

RISC-V生態(tài)的快速發(fā)展源于業(yè)界對這一開放指令集體系結(jié)構(gòu)的共同信念,然而其發(fā)展并非一帆風(fēng)順。企業(yè)在推廣RISC-V時面臨諸多現(xiàn)實問題,包括來自客戶客戶的質(zhì)疑、與Arm的差異化價值、軟件移植的難度等等。但這些挑戰(zhàn)正在逐步...

關(guān)鍵字: RISC-V CPU 香山 昆明湖 IP AI
關(guān)閉