彙編源程式偽指令assume存在性問題

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

1樓:匿名使用者

assume是給編譯器看的!這一點非常重要!不要認為對**有實際作用,它只是給編譯器看看,你還必須手動給ds、es賦值,如果你不手動給ds、es賦值,你的**就會掛掉。

你奇怪的很對,那它是不是多餘的?確實是,但是編譯器需要它啊,你不指定,編譯器就會不給你檢查段錯誤,或者給你亂檢查段錯誤!這個偽指令實際是編譯器計算變數在段內的偏移量用的,如果指定錯誤會導致生成的機器碼中偏移量錯誤,程式會跑飛的。

就知道了,其實它跟你**賦值的mov ds , ax /es要配合使用,必須保證兩者配合起來找到正確的段內的變數。說太多可能你不理解,你多試幾個段就知道了,只能點撥這麼多了。老老實實的,assume寫上,mov ds , ax寫上,兩步一步都不可少,而且要把段寫對。

以現代程式設計思想來看,這個assume的存在的確很low!而且是非常弱智的那種設計,編譯器的工作幹程式設計師鳥事啊!然而那個年代,編譯器的工作就是幹程式設計師鳥事,程式設計師什麼都要關心的,甚至還要時不時撥下記憶體,清下灰和bug什麼的。

所以現在誰還玩彙編了?還是想吐槽一下,這***組合語言設計的都什麼玩藝,難怪x86彙編也就大學用用~不要沉迷於此,玩玩即可~不可作為養家餬口的東西,有那時間多研究先進的演算法,不要太過於研究這些底層,世界那麼大,值得你往前走走看

2樓:做而論道

你寫出來 assume 偽指令,是給(微軟的)編譯軟體看的。

編譯軟體根據這條偽指令,進行一些處理,就完了。

程式執行時,ds、ss、ed 的內容具體是什麼?

這需要你寫 intel 的指令來完成。

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

3樓:匿名使用者

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

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

4樓:納蘭旖兒

你有接觸過其他語言麼?

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

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

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

5樓:匿名使用者

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

別的話不多說 回答完畢

6樓:沙裡波特

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

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

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

seg1、seg2、。。。seg10。

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

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

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

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

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

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

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

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

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

7樓:匿名使用者

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

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

x db 0 1

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

mov al, x 1

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

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

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

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

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

8樓:沙裡波特

assume,不需要討論。

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

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

9樓:仇羽吾詠

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

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

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

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

組合語言資料偽指令DUP用法,組合語言中的dup有什麼作用

茲斬鞘 10 dup 1 重複定義了10個字元素,初始值為1,佔用10 2 20個位元組。5 dup 重複定義了5個字元素 其初始值實際為0 佔用5 2 10個位元組 因此總共佔用30個位元組。具體分析 在彙編定義變數的時候會用到dup,變數名 型別 初值表,dup用於把一個相同值賦值若干次,重複次...

把組合語言編制的源程式變為目標程式,要經過哪些步驟

淘汰 詞法分析 詞法分析的任務是對由字元組成的單詞進行處理,從左至右逐個字元地對源程式進行掃描,產生一個個的單詞符號,把作為字串的源程式改造成為單詞符號串的中間程式。執行詞法分析的程式稱為詞法分析程式或掃描器。源程式中的單詞符號經掃描器分析,一般產生二元式 單詞種別 單詞自身的值。單詞種別通常用整數...