国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

代碼生成- 寄存器計(jì)算機(jī)

這篇具有很好參考價(jià)值的文章主要介紹了代碼生成- 寄存器計(jì)算機(jī)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

寄存器計(jì)算機(jī)是目前最流行的機(jī)器體系結(jié)構(gòu)之一。

  • 效率很高
  • 機(jī)器體系結(jié)構(gòu)規(guī)整

機(jī)器基于寄存器架構(gòu):

  • 典型的有16、32或更多個(gè)寄存器,所有操作都在寄存器中進(jìn)行
  • 訪(fǎng)存都通過(guò)load/store進(jìn)行,內(nèi)存不能直接運(yùn)算

寄存器計(jì)算機(jī)Reg的結(jié)構(gòu)

  • 內(nèi)存,存放溢出的變量(溢出是指寄存器放不下的變量)
  • 寄存器,進(jìn)行運(yùn)算的空間,假設(shè)有無(wú)限多個(gè)
  • 執(zhí)行引擎,指令的執(zhí)行

代碼生成- 寄存器計(jì)算機(jī)

寄存器計(jì)算機(jī)的指令集(ISA)

指令的語(yǔ)法

s -> ?movn n, r? ? ? ? ? ? ? ? 將一個(gè)立即數(shù)賦值給一個(gè)寄存器(數(shù)據(jù)移動(dòng))

? -> ?mov r1, r2? ? ? ? ? ? ? ? 將一個(gè)寄存器的值賦值給另一個(gè)寄存器(數(shù)據(jù)移動(dòng))

? -> ?load [x], r? ? ? ? ? ? ? ? ?把內(nèi)存中x的值讀入到寄存器r中(訪(fǎng)存)

? -> ?store r, [x]? ? ? ? ? ? ? ? 把一個(gè)數(shù)據(jù)從寄存器中寫(xiě)入到內(nèi)存中(訪(fǎng)存)

? -> ?add r1, r2, r3? ? ? ? ? ?r3 = r1 + r2(算術(shù)運(yùn)算)

? -> ?sub r1, r2, r3? ? ? ? ? ?r3 = r1 -?r2(算術(shù)運(yùn)算)

? -> ?times r1, r2, r3? ? ? ??r3 = r1 *?r2(算術(shù)運(yùn)算)

? -> ?div r1, r2, r3? ? ? ? ? ??r3 = r1 /?r2(算術(shù)運(yùn)算)

注:[x]表示這樣一個(gè)x是在內(nèi)存當(dāng)中的

變量的寄存器分配偽指令

Reg機(jī)器只支持一種數(shù)據(jù)類(lèi)型int,并且給變量x分配寄存器的偽指令是

.int x

在代碼生成階段,假設(shè)Reg機(jī)器上有無(wú)限多個(gè)寄存器。

  • 因此每個(gè)聲明變量和臨時(shí)變量都會(huì)占用一個(gè)(虛擬)寄存器
  • 把虛擬寄存器分配到物理寄存器的過(guò)程稱(chēng)為寄存器分配。

遞歸下降代碼生成算法

從C--到Reg

代碼生成- 寄存器計(jì)算機(jī)

注意:在棧式計(jì)算機(jī)中,每一個(gè)函數(shù)都是void類(lèi)型,而此處寄存器計(jì)算機(jī)Gen_E(E)的返回值類(lèi)型為R_t(寄存器類(lèi)型)。

表達(dá)式的代碼生成

不變式:表達(dá)式的值在函數(shù)返回的寄存器中

R_t Gen_E(E e)
{
    switch (e)
    {
    case n:
        r = fresh();    // 返回唯一的寄存器編號(hào)
        emit("movn n, r");
        return r;

    case id:
        r = fresh();
        emit("mov id, r");
        return r;

    case true:
        r = fresh();
        emit("movn 1, r");
        return r;
    
    case false:
        r = fresh();
        emit("movn 0, r");
        return r;

    case e1 + e2:
        r1 = Gen_E(e1);
        r2 = Gen_E(e2);
        r3 = fresh();
        emit("add r1, r2, r3");
        return r3;

    case e1 && e2:
        r1 = Gen_E(e1);
        r2 = Gen_E(e2);
        r3 = fresh();
        emit("and r1, r2, r3");
        return r3;   // 非短路

    default:
        break;
    }
}

語(yǔ)句的代碼生成

Gen_S(S s)
{
    switch (s)
    {
    case id = e:
        r = Gen_E(e);
        emit("mov r, id");  // 假設(shè)此處id也在寄存器中
        break;
    
    case printi(e):
        r = Gen_E(e);
        emit("printi r");
        break;

    case printb(e):
        r = Gen_E(e);
        emit("printb r");
        break;

    default:
        break;
    }
}

類(lèi)型的代碼生成

不變式:只生成.int 類(lèi)型

Gen_T(T t)
{
    switch (t)
    {
    case int:
        emit(".int");
        break;
    
    case bool:
        emit(".int");
        break;

    default:
        break;
    }
}

變量聲明的代碼生成

不變式:只生成.int 類(lèi)型

Gen_D(T id; D)
{
    Gen_T(T);
    emit(" id");
    Gen_D(D);
}

程序的代碼生成

不變式:只生成.int 類(lèi)型

Gen_P(D S)
{
    Gen_D(D);
    Gen_S(S);
}

代碼生成- 寄存器計(jì)算機(jī)

tip:將x = 1 + 2 + 3 + 4 畫(huà)成抽象語(yǔ)法樹(shù),就可以理解對(duì)應(yīng)產(chǎn)生的9條匯編級(jí)指令了。

如何運(yùn)行生成的代碼?

1、寫(xiě)一個(gè)虛擬機(jī)(解釋器),這個(gè)虛擬機(jī)上就有無(wú)限個(gè)寄存器,我們可以用單鏈表存放寄存器,這個(gè)單鏈表可以無(wú)限長(zhǎng)。

2、在真實(shí)的物理機(jī)器上運(yùn)行:需進(jìn)行寄存器分配

我們有無(wú)限多個(gè)虛擬寄存器(r1, ..., rn),但一臺(tái)物理機(jī)上只有k1-km個(gè)寄存器,那么我們就需要把這些寄存器虛擬的映射到實(shí)際的物理機(jī)器上,如果還不夠用的話(huà),那么就需要有一些虛擬寄存器放到內(nèi)存里(前面提到的“溢出”)

代碼生成- 寄存器計(jì)算機(jī)

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-403975.html

到了這里,關(guān)于代碼生成- 寄存器計(jì)算機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vivado MIPS寄存器堆(含測(cè)試代碼)

    Vivado MIPS寄存器堆(含測(cè)試代碼)

    本篇文章使用 Verilog 語(yǔ)言編寫(xiě)實(shí)現(xiàn)帶有優(yōu)先級(jí)的83譯碼器,含有設(shè)計(jì)代碼和測(cè)試代碼。 一、 寄存器堆 regfile 模塊實(shí)現(xiàn)了 32個(gè)32位通用寄存器 ??梢酝瑫r(shí)進(jìn)行 兩個(gè)寄存器的讀操作 和 一個(gè)寄存器的寫(xiě)操作 。寫(xiě)操作是同步寫(xiě),寫(xiě)使能信號(hào)(we)為1時(shí)有效,為0時(shí)無(wú)效;讀操作可以

    2024年02月08日
    瀏覽(23)
  • STM32-串口通信波特率計(jì)算以及寄存器的配置詳解

    STM32-串口通信波特率計(jì)算以及寄存器的配置詳解

    處理器與外部設(shè)備通信的兩種方式 并行通信 傳輸原理:數(shù)據(jù)各個(gè)位同時(shí)傳輸。 優(yōu)點(diǎn):速度快 缺點(diǎn):占用引腳資源多 串行通信 傳輸原理:數(shù)據(jù)按位順序傳輸 優(yōu)點(diǎn):占用引腳資源少 缺點(diǎn):速度相對(duì)較慢 按照數(shù)據(jù)傳送方向,分為: 單工 :數(shù)據(jù)傳輸只支持?jǐn)?shù)據(jù)在一個(gè)方向上傳輸

    2024年02月05日
    瀏覽(29)
  • 【Verilog編程】線(xiàn)性反饋移位寄存器(LFSR)原理及Verilog代碼實(shí)現(xiàn)

    【Verilog編程】線(xiàn)性反饋移位寄存器(LFSR)原理及Verilog代碼實(shí)現(xiàn)

    移位寄存器 :指若干個(gè)寄存器排成一列,每個(gè)寄存器中存放1bit二進(jìn)制數(shù)據(jù)(0或1),每個(gè)時(shí)鐘周期向左或向右移動(dòng)一個(gè)bit。下圖所示為一個(gè)向右移動(dòng)的移位寄存器。 反饋移位寄存器(Feedback Shift Register,F(xiàn)SR) :每個(gè)時(shí)鐘脈沖,移位寄存器向右移動(dòng)一位,則移位寄存器的左左側(cè)就

    2024年02月15日
    瀏覽(21)
  • (超詳細(xì))STM32芯片F(xiàn)lash讀寫(xiě)操作講解和代碼(寄存器版本)

    (超詳細(xì))STM32芯片F(xiàn)lash讀寫(xiě)操作講解和代碼(寄存器版本)

    關(guān)于Flash,官方的解釋為:Flash為32位寬的存儲(chǔ)單元,可用于存儲(chǔ)代碼和數(shù)據(jù)常量。Flash模塊位于微控制器內(nèi)存映射中的特定基址……。而對(duì)于我們來(lái)說(shuō),只要知道Flash閃存區(qū)是一個(gè)掉電后也不會(huì)清除的數(shù)據(jù)存儲(chǔ)地。(相信大家對(duì)于Flash閃存也有著一定 的了解了,我也不多說(shuō)廢話(huà)

    2023年04月19日
    瀏覽(23)
  • NUS CS1101S:SICP JavaScript 描述:五、使用寄存器機(jī)進(jìn)行計(jì)算

    原文:5 Computing with Register Machines 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 我的目標(biāo)是表明天堂機(jī)器不是一種神圣的生命體,而是一種鐘表(相信鐘表有靈魂屬性的人將制造者的榮耀歸功于作品),因?yàn)閹缀跛卸喾N運(yùn)動(dòng)都是由一種最簡(jiǎn)單和物質(zhì)力量引起的,就像鐘表的所有運(yùn)動(dòng)都是由

    2024年01月20日
    瀏覽(58)
  • 51單片機(jī)串口通信原理、相關(guān)寄存器配置與簡(jiǎn)單串口收發(fā)程序代碼

    51單片機(jī)串口通信原理、相關(guān)寄存器配置與簡(jiǎn)單串口收發(fā)程序代碼

    目錄 1. 串口通信原理 2. 51單片機(jī)串口通信 ?2.1 串口簡(jiǎn)要模式圖 ?2.2 相關(guān)寄存器 (1)PCON、SCON、SBUF (2)IE、IPH、IP (3)配置T1定時(shí)器 2.3 波特率和系統(tǒng)時(shí)鐘和TH1和TL1計(jì)算 ?3.串口通信簡(jiǎn)單收發(fā)使用代碼 ? 3.1 在STC-isp使用端口助手,從單片機(jī)發(fā)送字節(jié) ?3.2 通過(guò)端口助手利用主

    2024年02月05日
    瀏覽(30)
  • IC驗(yàn)證——perl腳本ccode_standard——c代碼寄存器配置標(biāo)準(zhǔn)化

    IC驗(yàn)證——perl腳本ccode_standard——c代碼寄存器配置標(biāo)準(zhǔn)化

    目錄 1 腳本名稱(chēng) 2 腳本路徑 3 腳本參數(shù)說(shuō)明 4 腳本操作說(shuō)明 5 腳本代碼 ccode_standard /scripts/bin/ccode_standard 次序 參數(shù)名 說(shuō)明 1 address (./rfdig;.;..;./boot) 指定腳本執(zhí)行路徑(可以為腳本所在路徑的任意相對(duì)路徑) help 腳本使用幫助,打印說(shuō)明信息 2 all 運(yùn)行腳本后,腳本會(huì)解析

    2024年01月18日
    瀏覽(43)
  • 【FreeRTOS】——中斷優(yōu)先級(jí)設(shè)置&中斷相關(guān)寄存器&臨界段代碼保護(hù)&調(diào)度器掛起與恢復(fù)

    【FreeRTOS】——中斷優(yōu)先級(jí)設(shè)置&中斷相關(guān)寄存器&臨界段代碼保護(hù)&調(diào)度器掛起與恢復(fù)

    目錄 前言: 一、中斷優(yōu)先級(jí)設(shè)置 二、中斷相關(guān)寄存器(STM32-Cortex M3) 三、臨界段代碼保護(hù) 四、任務(wù)調(diào)度器的掛起和恢復(fù) 總結(jié): 博客筆記根據(jù)正點(diǎn)原子視頻教程編輯,僅供學(xué)習(xí)交流使用! ①中斷概念回顧 讓CPU打斷正常運(yùn)行的程序,轉(zhuǎn)而去處理緊急的事件(程序),就叫中

    2024年02月10日
    瀏覽(55)
  • ZedBoard+AD9361_FPGA的PL端純邏輯(verilog)配置控制9361(一)_初始化寄存器腳本文件生成

    ZedBoard+AD9361_FPGA的PL端純邏輯(verilog)配置控制9361(一)_初始化寄存器腳本文件生成

    由于9361的寄存器較多,首先利用AD936X Evaluation Software 軟件,根據(jù)我們的項(xiàng)目需求,配置相應(yīng)的功能參數(shù),生成寄存器參數(shù)配置文件。 我建議大家選擇安裝AD936X Evaluation Software 2.1.3版本,下載安裝軟件,一路點(diǎn)擊下一步即可完成安裝。軟件安裝包:百度網(wǎng)盤(pán)? 提取碼:mww7 安裝

    2024年02月13日
    瀏覽(32)
  • 【ADF4351】使用FPGA進(jìn)行SPI寄存器配置、使用FPGA計(jì)算各個(gè)頻率的頻點(diǎn),ADF4351配置程序

    【ADF4351】使用FPGA進(jìn)行SPI寄存器配置、使用FPGA計(jì)算各個(gè)頻率的頻點(diǎn),ADF4351配置程序

    輸出頻率范圍:35 MHz至4,400 MHz 小數(shù)N分頻頻率合成器和整數(shù)N分頻頻率合成器 具有低相位噪聲的VCO 可編程的1/2/4/8/16/32/64分頻輸出 典型抖動(dòng):0.3 ps rms EVM(典型值,2.1 GHz): 0.4% 電源:3.0 V至3.6 V 邏輯兼容性: 1.8 V 可編程雙模預(yù)分頻器:4/5或8/9 可編程的輸出功率 RF輸出靜音功能

    2024年04月11日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包