源程式中的暫存器變數如何定位到實際的實體地址

2022-05-07 06:35:03 字數 6674 閱讀 7650

1樓:匿名使用者

將暫存器變數定位到儲存器實體地址方法如下

unsigned char temp_a@0x00; //定義無符號變數temp_a,強制其位址為0x00

unsigned char temp_b@0x100; //定義無符號變數temp_b,強制其位址為0x100

@tiny unsigned char temp_c; //定義無符號變數temp_c,由編譯器自動在位址小於0x100的ram中為其分配乙個位址

@near unsigned char temp_d; //定義無符號變數temp_d,由編譯器自動在位址大於0xff的ram中為其分配乙個位址

另外也可以採用偽指令"pragma"將函式或者變數定義到指定的section中,例如:

#pragma section [name] // 將下面定義的未初始化變數定義到.name section中

unsigned char data1;

unsigned int data2;

源程式中的暫存器變數如何定位到實際的實體地址?

2樓:匿名使用者

可以使用堆疊和指標將暫存器變數定位到實際的實體地址,具體如下

3樓:匿名使用者

暫存器變數變數直接用暫存器名稱引用,記憶體變數才會有具體位址。

怎樣獲取變數實體地址

作業系統中的動態重定位和靜態重定位?

4樓:生活類答題小能手

靜態重定位:即在程式裝入記憶體的過程中完成,是指在程式開始執行前,程式中的各個位址有關的項均已完成重定位,位址變換通常是在裝入時一次完成的,以後不再改變,故稱為靜態重定位。

擴充套件資料在裝入程式前,系統會計算未使用的記憶體,然後將程式裝入,並記下開始位址。在執行有相對位址的指令時,會將所有的位址加個剛才記下的開始位址,就叫重定位。

程式放在不連續的實際物理空間中,要進行邏輯位址到實體地址的轉換,實現動態重定位一般需要段頁式儲存管理,頁式儲存管理用的不是暫存器,使用的是稱為page table(頁表)的資料結構page table記錄了所有邏輯位址到實體地址的轉換資訊,程序切換的時候需要沖洗硬體上的page table 。

5樓:哎呀小白妞

作業系統中靜態重定位是指在程式開始執行前,程式中的各個位址有關的項均已完成重定位,位址變換通常是在裝入時一次完成的,以後不再改變。而動態重定位即在程式執行過程中要訪問資料時再進行邏輯位址與實體地址的變換。

動態重定位根據每次程式執行的情況重新定位,位址在每一次程式執行時候都是變動的,容易共享同一程式副本,即共享同一程式中相同的的原始子程式,而靜態重定位裝入時位址就已經確定,難以共享同一程式副本。

擴充套件資料:一、作業系統中靜態重定位特點:

1、在裝入前實現調整。

2、位址要有標識。

3、每次裝入都要進行定位。

4、裝入後位址不再改變(靜態)。

二、作業系統中動態重定位特點:

1、程式可裝入任意記憶體區域(不要求佔用連續的記憶體區)。

2、只裝入部分程式**即可執行。

3、改變系統時不需要改變程式(程式佔用的記憶體空間動態可變,只需要改變定位暫存器中的值即可)。

4、程式可方便共享。

6樓:匿名使用者

程式和資料裝入記憶體時需對目標程式中的位址進行修改。這種把邏輯位址轉變為記憶體的實體地址的過程叫重定位。

對程式進行重定位的技術按重定位的時機可分為兩種:靜態重定位和動態重定位。

靜態重定位是在目標程式裝入記憶體時,由裝入程式對目標程式中的指令和資料的位址進行修改,即把程式的邏輯位址都改成實際的位址。對每個程式來說,這種位址變換只是在裝入時一次完成,在程式執行期間不再進行重定位。

靜態重定位的優點是無需增加硬體位址轉換機構,便於實現程式的靜態連線。在早期計算機系統中大多採用這種方案。

它的主要缺點是:(1)程式的儲存空間只能是連續的一片區域,而且在重定位之後就不能再移動。這不利於記憶體空間的有效使用。(2)各個使用者程序很難共享記憶體中的同一程式的副本。

動態重定位是在程式執行期間每次訪問記憶體之前進行重定位。這種變換是靠硬體位址變換機構實現的。通常採用乙個重定位暫存器,其中放有當前正在執行的程式在記憶體空間中的起始位址,而位址空間中的**在裝入過程中不發生變化。

動態重定位的主要優點是:(1)程式佔用的記憶體空間動態可變,不必連續存放在一處。(2)比較容易實現幾個程序對同一程式副本的共享使用。

它的主要缺點是需要附加的硬體支援,增加了機器成本,而且實現儲存管理的軟體演算法比較複雜。

現在一般計算機系統中都採用動態重定位方法。

7樓:匿名使用者

動態重定位的話,程式可以裝入任意記憶體區域(不要求佔用連續的記憶體區),只裝入部分程式**就可以執行。改變系統時不需要改變程式(程式佔用的記憶體空間動態可變,只需要改變定位暫存器中的值即可),所以程式可以方便共享同乙個程式的副本。

8樓:吖青汁

動態重定位 位址轉換 怎麼算呢 誰可以舉個例子 謝謝

在arm彙編程式設計中如何指定某段程式的儲存位址

9樓:匿名使用者

在要指定**的儲存空間不是一件特別簡單的事情,尤其是你想為某個或某幾個函式指定具體的位址。

1,編譯器只有在最終的link階段才會為**和資料分配記憶體位址,因此指定**段的位址一般是通過寫乙個link指令碼來進行的。link階段時,編譯器的linker會讀取你寫的link指令碼,並且按照指令碼的規定給**分配位址。

2,根據arm開發工具的不同,link指令碼的語法和形式也有所不同。arm mdk,arm ads,eclips+gcc,linux gcc, arm realview等開發工具都支援link指令碼。

如果你英文還可以,建議你直接找到開發工具的help手冊去研究。如果你英語實在不行,也可以把開發工具名稱和你**的具體情況告訴我,我幫你看看。

邏輯位址轉換成實體地址的計算題

10樓:小

頁表可以實現從頁號到物理塊號的位址對映。通過邏輯位址的頁號來尋找頁表,從而獲得物理塊號;在將頁內位址直接送入實體地址暫存器的塊內位址欄位中。將塊號和塊內位址拼接成實際訪問位址,即可得到實體地址。

代入本題解答:

實體地址=1024*1+452=1476

11樓:

題目及解答如下:

某虛擬儲存器的使用者程式設計空間共32個頁面,每頁為1kb,記憶體為16kb。假定某時刻一使用者頁表中已調入記憶體的頁面的頁號和物理塊號的對照表如下:

頁號 物理塊號

0 3

1 7

2 11

3 8

則邏輯位址0a5c(h)所對應的實體地址是什麼?要求:寫出主要計算過程。

解題過程:

首先要知道頁式儲存管理的邏輯位址分為兩部分:頁號和頁內位址。實體地址分為兩部分:

關係為:邏輯位址= 頁號+頁內位址

實體地址= 塊號+頁內位址;

分析題:已知:使用者程式設計空間共32個頁面,2ˆ5 = 32 得知頁號部分佔5位,由「每頁為1kb」,1k=210,可知內頁位址佔10位。

由「記憶體為16kb」,2^4=16得知塊號佔4位。

邏輯位址0a5c(h)所對應的二進位制表示形式是:0000101001011100,後十位1001011100是頁內位址,

00010為為頁號,頁號化為十進位制是2,在對照表中找到2對應的物理塊號是11,11轉換二進位制是1011,即可求出實體地址為10111001011100,化成十六進位制為2e5c;

即則邏輯位址0a5c(h)所對應的實體地址是2e5c;

12樓:霜染楓林嫣紅韻

這樣的計算題是非常複雜的,沒有專業的知識是不會知道怎麼計算的,你需要請教你的專業老師

13樓:匿名使用者

頁表的作用是實現從頁號到物理塊號的位址對映。以邏輯位址的頁號檢索頁表,得到該頁的物理塊號;同時將頁內位址d直接送入實體地址暫存器的塊內位址欄位中。這樣物理塊號和塊內位址拼接成了實際訪問記憶體的位址,從而完成了從邏輯位址到實體地址的轉換。

所以實體地址的計算公式為:

實體地址=塊的大小(即頁的大小l)′塊號f+頁內位址d解本題中,為了描述方便,設頁號為p,頁內位移為d,則:

p=int(2500/1024)=2 d=2500mod1024=452 假設頁號2 對應 塊號 1

那麼實體地址=1024*1+452=1476

c語言中的自動變數和暫存器變數是什莫?

14樓:手機使用者

c語言學習之變數儲存

c語言中對變數的說明包括兩方面的內容:變數型別以及變數的儲存型別。變數型別如:

int(整形),char(字元型)是用來說明變數所佔用的記憶體空間的大小。變數儲存型別用來說明變數的作用範圍。

c語言的變數儲存類有:自動類、暫存器類、靜態類和外部類。

關鍵字auto加在變數名及其型別前,用來說明它是自動變數。區域性變數是指在函式內部說明的變數(有時也稱為自動變數)。用關鍵字auto進 行說明, 當auto省略時, 所有的非全程變數都被認為是區域性變數, 所以auto實際上 從來不用。

區域性變數在函式呼叫時自動產生, 但不會自動初始化, 隨函式呼叫的結束, 這個變數也就自動消失了, 下次呼叫此函式時再自動產生, 還要再賦值, 退出時又自動消失。

static稱為靜態變數。根據變數的型別可以分為靜態區域性變數和靜態全程變數。

1. 靜態區域性變數

它與區域性變數的區別在於: 在函式退出時, 這個變數始終存在, 但不能被其它

函式使用, 當再次進入該函式時, 將儲存上次的結果。其它與區域性變數一樣。

2. 靜態全程變數

靜態 全程變數就是指只在定義它的原始檔中可見而在其它原始檔中不可見的變數。它與

全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它原始檔使用,而靜態全程變數卻不能再被說明為外部的, 即只能被所在的原始檔使用。

extern稱為外部變數。為了使變數除了在定義它的原始檔中可以使用外, 還要 被其它檔案使用。因此, 必須將全程變數通知每乙個程式模組檔案, 此時可用 extern來說明。

暫存器變數to能夠長在執行速度很重要的情況下使用。其思想是告訴編譯程式把該變數放在乙個cpu暫存器中。因為資料在暫存器中操作比在記憶體中快,這樣就提高了程式**的執行速度。

暫存器變數的說明是在變數名及型別之前加上關鍵字register。值得注意的是取位址運算子&不能作用於暫存器變數。

file1.c

#include

#include

int reset();

int next();

int last();

int sum(int );

int i=1;

void main()

}file2.c檔案

static int i=10;

int next()

int last()

int sum(int i)

file3.c檔案

extern int i;

reset()

執行結果:

i=1 j=1

next(i)=11

last(i)=10

sum(i+j)=7

i=1 j=2

next(i)=11

last(i)=10

sum(i+j)=10

i=1 j=3

next(i)=11

last(i)=10

sum(i+j)=14

具體分析一下三個檔案中的變數的種類。

在file1.c的開頭宣告i是外部變數,並出示化為1。而在main函式內部,說明了兩個自動變數i和j,這樣在main內部出現的i就是自動量。

在file3.c的開頭說明i是外部的,表明它與file1.c定義的i是同乙個變數,所以reset的值返回的就是這個i的當前值1。

file2.c檔案已開始就定義了變數i,並宣告為靜態變數,因此它的使用範圍只在當前檔案中使用。然而從函式sum中定義來看,其內部用到的i是形式引數,j是內部靜態變數,它們與以前的i,j都不同。

具體執行過程分析如下:

首先程式經過編譯後聲稱可執行檔案,執行可執行檔案後,函式從main函式體進入,在初始化的過程中得到i為全域性變數,初值為1。進入main函式後首先呼叫函式reset(),進入檔案file3.c,檔案file3.

c宣告i為外部變數,所以此時i的值為1,則返回的值為1。函式reset()執行完後返回主函式,繼續執行迴圈體中的程式。迴圈體首先呼叫函式next(),程式進入file2.

c檔案,判斷i為靜態變數,所以此時i的值為10,執行next()之後i的值為11,返回值為11,並將11作為i的值。當呼叫last()函式時,判斷i的值為11,執行函式後,i的值變為10,並將10作為i的值。最後執行函式sum(i),此時值的注意的是執行程式時傳遞的是形參,即第一次呼叫時實際計算的值為sum(i+j=2),這樣呼叫函式sum(i)後執行的結果為i=5+2=7,即為執行的結果。

依次類推,分別為7,10,14。

通過以上的程式可以理解不同的儲存型別的作用範圍不同,在程式設計中如何靈活的使用各種不同的儲存型別是能夠使程式更靈活。

組合語言中子程式呼叫需要哪些暫存器進棧

段內呼叫至少有ip,段間呼叫還有cs 1 乙個包宣告抄 package statement,可選 襲 bai2 任意數量引入du語句zhi import statements 3 類的 dao宣告 class declarations 和介面宣告 inte ce declarations 該三要素必...

暫存器的內容為11111111,它等於 127,則為碼

原碼符號為0表示 1表示 所以不可能是原碼。反碼是原碼除符號外取反,所以符號外1表示 所以不可能是反碼。況且補碼和反碼當正數的情況時,是和原碼是一樣的。127的原碼為 01111111 則補碼和反碼也是這個值。哪只能是移碼了,移碼是補碼符號位取反。移碼 設暫存器的內容為11111111若它等於 12...

下列不屬於控制器組成部件的是A狀態暫存器B指令解碼器

控制器 controlunit 是整個cpu的指揮控制中心,bai由指令 du暫存器ir instructionregister 程式計zhi數器pc program counter 和操作控制器dao0c operationcontroller 三個部件組成。指令譯回碼器是答控制器中的主要部件之一...