技術文章:編譯器的寄存器分配

2022年07月04日18:36:25 科技 1923

因為存儲速度成本之間的問題,電腦的整個存儲系統按照CPU從近到遠可以分為4級:寄存器、cache緩存、主內存、硬盤。

離CPU最近的寄存器,讀寫速度最快

離CPU最遠的硬盤,讀寫速度最慢。

包括C語言在內的大多數語言,是不需要關注寄存器怎麼分配的。這部分的工作被編譯器處理了。

當然,彙編語言是需要手動分配寄存器的。

程序員在寫彙編時,會按照自己的直覺給出一個寄存器分配方案。

例如 5 / 3 = 1;彙編是這麼寫的:

mov 5, eax

xor edx, edx

mov 3, ecx

div ecx

這時,在eax里,餘數在edx里。英特爾的CPU就是這麼設計除法指令的。

除法使用固定的寄存器eax和edx,是CISC架構的缺點,讓寄存器的分配變得麻煩。

如果是int a = 5, b = 3, c = a / b;

那麼就要盡量給c分配寄存器eax,因為除法的商默認就在eax里,這樣可以提高生成的彙編碼的效率

如果是c = a % b,那麼就要盡量給c分配寄存器edx,因為餘數默認就在edx里。

因為寄存器只有16個,在程序規模較大的時候,是沒法這麼理想的分配寄存器的。

編譯器里,寄存器的分配是根據變量之間的活躍度來的:同時活躍變量不能使用同一個寄存器,否則數據就互相覆蓋了。

c = a / b這行代碼的被除數a和除數b肯定是同時活躍的,在除法指令運行的那一刻它們必須同時有效(而且互相覆蓋)。

c與a、b並不是同時活躍的,它是在除法運行之後開始活躍。

如果變量a在這行代碼之後不再使用,那麼c和a是可以共用eax的。

如果後續還要使用a,那麼就不能共用eax。例如:

int a = 5, b = 3;

int c = a / b;

c += a; // a在這裡還是活躍的,不能在第二行c = a / b時被覆蓋。

這時就只能給c分配eax,同時edx除法指令佔用,所以a和b只能使用ecx和ebx

以上代碼翻譯成彙編:

mov 5, ecx // a使用ecx

mov 3, ebx // b使用ebx

mov ebx, eax // 加載被除數的最低32位到eax

xor edx, edx // 被除數的高32位清零

div ebx // 真正的除法運算只是這一條

add ecx, eax // c += a

技術文章:編譯器的寄存器分配 - 天天要聞

上面2行代碼c = a / b, c += a的寄存器衝突圖,如上。

給這個圖的3個頂點a、b、c着色,被衝突線連接兩個頂點不能是同一個顏色,即不能分配同一個寄存器

因為CISC的除法使用edx,我們把它也作為一個約束條件添加到這個圖裡:變量a是不能使用它的,因為它會被除法運算的餘數覆蓋,而a在c += a這行代碼還要使用。

c可以使用它,但c作為除法運算的商應該優先分配eax,否則就還需要多1條mov eax, edx的彙編碼。

技術文章:編譯器的寄存器分配 - 天天要聞

64位寄存器的位元組分配

實際CPU的寄存器是個64位的寄存器組,它的最低8位AL、次低8位AH、最低16位AX、最低32位EAX、整個寄存器RAX的關係如圖。

al和rax是衝突的:

char buf[8] = {0};

char c = 'A';

char* p = buf;

*p += c;

如果指針p使用了rax,那麼char類型的變量c就不能再使用al,反之也一樣。

代碼 *p += c里,指針變量p和字符變量c是同時活躍的。

這種情況可以通過掩碼來判斷,可以用1個二進制表示寄存器的1個位元組

1,RAX是8位元組的寄存器,掩碼就是0xff。

2,al是1位元組的寄存器,掩碼就是0x1。

3,ah的掩碼是0x2,因為它使用的是第2個位元組。

4,ax的掩碼是0x3,2個位元組。

5,eax的掩碼是0xf,4個位元組。

如果掩碼的與運算不為0,就是互相衝突的寄存器,不能用於同一個變量。

當然不是同一個寄存器組的寄存器,肯定是不衝突的。

ah和al是不衝突的,因為0x2 & 0x1 == 0。

ah和ax是衝突的,因為0x2 & 0x3 != 0。

技術文章:編譯器的寄存器分配 - 天天要聞

科技分類資訊推薦

優派推出 4K 160Hz 顯示器 VX2759-4K-PRO,首發 2099 元 - 天天要聞

優派推出 4K 160Hz 顯示器 VX2759-4K-PRO,首發 2099 元

IT之家 6 月 20 日消息,優派(ViewSonic)今日宣布推出高分高刷、硬件級低藍光電競顯示器新品 VX2759-4K-PRO,目前已經上架京東,首發價顯示為 2099 元。這款顯示器採用了 27 英寸新一代 Fast IPS 快速液晶面板,擁有 3840x2160 分辨率、原生 160Hz 刷新率、1ms GTG 響應時間,兼容 FreeSync&
全市前列!蘇州高新區5家企業入選 - 天天要聞

全市前列!蘇州高新區5家企業入選

近日蘇州市工信局公示了2023年蘇州市智能製造優秀服務商名單蘇州高新區共有5家企業入選數量居全市前列蘇州高新區入選企業名單1蘇州天准科技股份有限公司2蘇州英威騰電力電子有限公司3中移(蘇州)軟件技術有限公司4蘇州蓋雅信息技術有限公司5蘇州穗
代碼大模型安全規範正式定稿,中國信通院啟動首輪評估 - 天天要聞

代碼大模型安全規範正式定稿,中國信通院啟動首輪評估

IT之家 6 月 20 日消息,近年來,代碼大模型已成為企業研發人員輔助編程必備助手,能夠生成、翻譯、補全代碼,幫助定位和修復錯誤。然而,代碼大模型背後隱藏的風險挑戰還有待討論。中國信息通信研究院(以下簡稱「中國信通院」)依託中國人工智能產業發展聯盟(AIIA),聯合業內近 30 家單位共同編製了《代碼大模型安全風...
榮耀16英寸大屏筆記本不到3000元,真便宜! - 天天要聞

榮耀16英寸大屏筆記本不到3000元,真便宜!

目前在榮耀官方商城上面,榮耀MagicBook X 16 戰鬥版筆記本低至2799元即可擁有。這價格,真便宜!  這款筆記本於2023年11月上市,搭配第12代酷睿i5-12450H移動處理器,4+4核12線程設計,睿頻高達4.4GHz,具備40W高性能輸出,此外還有16GB LPDDR4x-4266MHz高頻內存以及512GB固態硬盤,性能放在2024年6
打造「Living smart Way」在地營銷IP  smart - 天天要聞

打造「Living smart Way」在地營銷IP smart

2024年6月18日,成都誕生於都市,更為都市注入無數靈感。作為全球知名的新奢智能純電汽車品牌,smart傾情打造「Living smart Way」在地營銷IP,攜手廣大用戶與品牌粉絲雙向奔赴,創造smart的生活方式,積聚smart的生活靈感。
微信有一種功能,工作中我們都離不開它 - 天天要聞

微信有一種功能,工作中我們都離不開它

在如今移動通訊的時代,微信已經成為我們生活和工作中不可缺少的一部分,從最初期的只能文本輸入,到後面可以文檔傳送,視頻通話,以及現在的群功能等,幾乎能覆蓋工作中能接觸的一切需要,自此幫助打工人完成了辦公的網絡自動化。
鴻蒙微信談妥,華為讓步,一場雙贏,但應用分成的步子邁早了 - 天天要聞

鴻蒙微信談妥,華為讓步,一場雙贏,但應用分成的步子邁早了

文/王新喜據澎湃新聞、藍鯨TMT等媒體報道,華為、騰訊即將達成協議,將微信排除在收入分成之外,允許微信在其鴻蒙操作系統上運行而不收取應用內收入分成。據透露,這是這兩家總部位於深圳的科技巨頭經過數月談判達成的。作為回報,騰訊將在鴻蒙持續維護和
未來十年最炙手可熱的就業方向是什麼? - 天天要聞

未來十年最炙手可熱的就業方向是什麼?

隨着科技的飛速發展和社會的不斷變革,未來的就業市場將呈現出全新的格局。在未來十年,有哪些行業將成為最炙手可熱的就業方向?本文將為你揭曉。1. 人工智能行業:AI將成為未來的主角。隨着人工智能技術的日益成熟和應用的普及,在語音識別、自動駕駛、
新民隨筆|還女孩一張安靜的書桌 - 天天要聞

新民隨筆|還女孩一張安靜的書桌

這段時間,江蘇中專女生薑萍爆冷獲得世界數學比賽第12名的新聞網絡熱度居高不下,人們為這位數學天才橫空出世而鼓掌叫好,但許多雜音也「如期而至」,例如作弊、造假、陰謀論等,着實令人為女孩捏一把汗。圖說:姜萍在黑板上解答數學題 圖源:阿里巴巴微信
移動充電機械人來幫忙,巧解老舊小區電動汽車充電難題 - 天天要聞

移動充電機械人來幫忙,巧解老舊小區電動汽車充電難題

據「浦東發佈」微信公號消息,老舊小區難以安裝充電樁,導致充電補能不方便,是困擾許多電動汽車車主的問題。近日,周家渡街道引入移動充電機械人,探索充電設施與車位解綁的電動汽車用車模式,進一步方便居民生活。  雪野二村是一個老舊小區,建成於上世紀