組合語言關於assume的用法,彙編偽指令 assume 具體作用是什麼

時間 2021-08-14 23:01:27

1樓:匿名使用者

assume:段暫存器的說明語句;

在組合語言源程式中可以定義多個段,每個段都要與一個段暫存器建立一種對應關係。建立這種對應關係的說明語句格式如下:

assume 段暫存器名:段名[,段暫存器名:段名, ……]

其中:段暫存器是cs、ds、es、ss、fs和gs,段名是在段定義語句說明時的段名。

在一條assume語句中可建立多組段暫存器與段之間的關係,每種對應關係要用逗號分隔。例如,

assume cs:code1, ds:data1

上面的語句說明了:cs對應於**段code1,ds對應於資料段data1。

注意:**段暫存器不能由程式設計師在源程式中對其賦值,其值是由作業系統在裝入它進入系統執行時自動賦值的。

2樓:陳青雲

assume偽指令用於向彙編程式說明所定義的邏輯段屬於何種型別的邏輯段。說明的方法是將邏輯段的段名和對應的段暫存器關聯起來。但除了cs暫存器外,其他邏輯段的地址需要程式設計師自己裝入暫存器中。

(來自清華版教材)

具體為什麼,我理解如下:

dseg segment

data db '1'

dseg ends

cseg segment

assume  cs:cseg,ds:dseg,es:dsegstart:

mov ax,dseg

mov ds,ax

mov dl,data;注意這裡

mov ah,02h

int 21h

mov ah,4ch

int 21h

cseg ends

end start

在這樣的一個程式中,當執行"mov dl,data"時,cpu知道data變數是定義在dseg段,但是怎麼找到data的地址的呢?這時候assume就派上了用場,它將ds和dseg相關聯。變數在dseg段,就從ds暫存器裡定址。

定址的地址在哪呢?"mov ax,dseg mov ds,ax",就起到了這樣的作用,它將邏輯段的地址裝入暫存器中。

為什麼cs暫存器就不需要呢?人家就是這樣規定的,至少在8086彙編上是這樣。

3樓:做而論道

編寫程式,是寫給編譯軟體的。

由編譯軟體,編譯成機器碼,再去控制cpu。

但是,編譯軟體,對assume語句,並不生成機器碼。

所以,必須有mov ax,data,mov ds,ax,cpu才能受控。

----

assume語句,是偽指令,僅僅是寫給編譯軟體的。

編譯軟體,並不把它生成機器碼。

4樓:

assume對除了cs以外的其它段暫存器,僅僅只是關聯了段名,以便在訪問段內變數時程式可以知道用哪個段暫存器,並沒有在程式載入時將段地址裝入段暫存器。

所以,將段地址裝入段暫存器的工作,必須由使用者在程式中自己編寫**,並在程式開始執行時執行**完成裝入工作。

僅僅對cs段暫存器,會在關聯段名的同時,在程式載入時自動將段地址裝入段暫存器。

5樓:學習資料

assume 是組合語言(masm)的偽指令,其作用只能告訴編譯器(彙編器)你在這個程式中宣告的所有段,無法做到將段地址寫入段暫存器。

彙編偽指令 assume 具體作用是什麼

6樓:匿名使用者

要用assume把段跟段暫存器對應起來的原因是原來的dos找到的空閒記憶體的地址不是固定的,無法找到一個地址在任何時候都是空閒的。於是dos需要可以重定位的程式,而當時的定位方式就是設定段暫存器的值使該程式能在可分配(空閒)的記憶體中可用。那就需要知道某個段被重定位時候需要修改哪個段暫存器的值才能正確執行。

assume提供這種段和重定位**時需要對應修改的暫存器的關係給編譯器,編譯器再這個資訊寫到二進位制檔案中去。比如dos下的exe程式記錄在檔案頭中。

7樓:納蘭旖兒

你有接觸過其他語言麼?

assume相當於其他語言中的宣告~就是宣告資料段 **段跟堆疊段assume的格式一般是這樣的

assume ds:data(資料段名稱,可任意),cs:code(**段名稱,可任意),ss:stuck(堆疊段名稱,可任意)

assume是必須的~如果沒有這個~計算機分辨不清楚你的程式該幹什麼~

8樓:匿名使用者

偽指令在編譯的時候是不會被編譯成機器碼的,所以他就是幫助你告訴編譯器你所用的段和暫存器的聯絡 程式本來就要分段寫的 這樣便於編譯器聯絡起你的段與暫存器的關係

別的話不多說 回答完畢

9樓:沙裡波特

8088  cpu 工作時,只能訪問記憶體中的_四個段_

但是,你在程式設計時,可以寫許許多多的邏輯段

就比如說,你編寫了十個邏輯段,分別是:

seg1、seg2、。。。seg10。

那麼,程式執行時,四個_記憶體段_,分別對應,哪個邏輯段

這就必須使用 assume 來指定其中的四個。

(其餘邏輯段,可在程式執行期間,再用 assume 來指定。)

這麼簡單的問題,竟然還有人扯到 dos 上去!

是在賣弄你的 zhi shang 太低吧。。。

但是,assume,是偽指令,對 cpu 沒有任何作用。

這個單詞,翻譯成中文,也只是“假定”。

而真正的作用,還是需要用“mov ds,ax”指令來實現。

組合語言中偽指令assume有什麼實際意義嗎

10樓:匿名使用者

assume 的作用是關聯段名與段暫存器。

如果你在資料段中定義了變數名,比如:

x db 0 1

而你在**中,需要直接使用這個變數名,比如:

mov al, x 1

那麼,彙編程式在彙編時,就會報告錯誤。

因為,mov指令中遇到 x 這個變數名時,彙編程式不知道它要用哪個段暫存器作為段地址。

所以:若要用變數名直接訪問,或使用語句標號(比如你例子中的標號 start)就必須要在assume偽指令中將這些變數或標號所在段的段名,與段暫存器名關聯,否則會出錯。

如果你不使用段中的變數名,可以不關聯這個段的段名與暫存器。

如果你訪問變數時,都指定了段跨越字首,關聯也不是必須的。比如你可以用 mov al, ds:x訪問變數 x 。

11樓:沙裡波特

assume,不需要討論。

高版本的 masm,已經不用這句了。

請教8086組合語言中assume偽指令的作用!

12樓:匿名使用者

先回答你的抄第一個問題,書上是你那樣說的,至於你的第一個疑問是因為assume偽指令只是讓資料段暫存器ds與你的資料儲存地址,**段暫存器cs和你的**段所儲存的地址一一對應起來,但是如果你不人為把你的資料段儲存地址dseg傳給ds的話,系統是無法獲得dseg的具體實體地址的。

對於第二疑問,因為cs:ip是指向cpu將執行的下一條語句,在將程式裝載進主存時,系統就已經將cseg的實體地址傳給了cs,所以,對於cs不需要像ds那樣人為傳遞。

組合語言assume cs:code,ds:datarea 中的:是什麼意思

13樓:匿名使用者

將code段與cs段暫存器關聯,讓cpu知道哪一段需要送到哪一個段暫存器,

14樓:做而論道

assume,意即“假定”。

它是偽指令,只是告訴編譯軟體:

假定,cs 和 code 相對應、ds 和 datarea 相對應。

其中的“:”就是對應的意思。

15樓:匿名使用者

就是定義code為**段,datarea為資料段

16樓:匿名使用者

在彙編時其實內部只有偏移地址定址,而沒有變數名定址。 所以彙編時彙編軟體會把你寫的變數換成偏移地址。而變數是在你假定的段裡查詢得到偏移地址。

一般指令程式放在**段中,段地址**於**段暫存器cs,涉及到一個堆疊操作時,段暫存器為ss,涉及到一個運算元時,段暫存器為ds或者es。assume cs:code,ds:

datarea就是說明相應的操作所在段暫存器。當ds(es)不指在assume的指明的段中也可以執行,只是會得到另一個段的相應偏移地址處的內容。例如:

assume ds:段名1 mov ds,段2 mov ax,段1中的第二個變數。最終結果ax儲存的是段2中的對應與段1中第二個變數相同地方的東西(注意是db,dw....

)過程:編譯器是在段1中查詢變數名,並把變數轉換為偏移地址,但訪問時使用ds:偏移地址 這時ds儲存的是段2的段地址,所以訪問到的是第二個段對應偏移地址的內容。

關於組合語言移植性的問題,關於組合語言中的LOOP指令

兄弟,你理解錯了,首先你要明白,組合語言是一種針對具體機器的低階語言,這裡說的不同機器一般來講是指cpu指令系統不相相容的兩種機器,比如常用的8086與51,dsp,arm,等等,他們的指令系統都不是通用的。自然移植到別的機器上不行,舉個例子來說吧,假如51,的p0埠可以用來點亮一盞燈,但是對808...

和組合語言有關的問題,關於組合語言的一個問題

bx為例,其實體地址 ds 16 bx。但你算這個值沒什麼用,因為所有的暫存器都是16位的,放不下這麼大的值。樓上關於 段是若干棟樓,偏移量是門牌號 的比喻不太準確,因為一個實體地址可以由不同的段址 偏移量組合來訪問。建議這樣來理解,記憶體是一條長長的直路,偏移量是眼睛的視力範圍,太遠就看不見了。而...

什麼是組合語言,什麼是彙編和組合語言?

叢依波弘瀾 組合語言 assembly language 是面向機器的程式設計語言。在彙編語閤中,用助記符 memoni 代替操作碼,用地址符號 symbol 或標號 label 代替地址媽。這樣用符號代替機器語盲的二進位制碼,就把機器語音變成了組合語言。於是組合語言亦稱為符號語言。使用組合語言編寫...