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

2021-08-14 23:01:19 字數 2822 閱讀 2089

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程式記錄在檔案頭中。

求 微控制器控制的16路彩燈彙編源程式

位為1時亮燈 其實原理就是單i o口的移位處理,只不過是要銜接處理start mov a,80h mov p0,0 mov p1,0 rlp0 處理p0口rl a mov p0,a acall delay jnb acc.7,rlp0 mov p0,0 rlp1 處理p1口rl a mov p1,a...

彙編中or與and指令詳細意義,彙編中OR與AND指令詳細意義

彙編中or的指令為邏輯或運算,該指令會置cf of 0,其結果影響sf zf pf。指令格式為or r m,r m i。例如 mov al,01100011b 換行符 or al,00111011b的執行結果為al 01111011b。彙編中and的指令為邏輯與運算,該指令會置cf of 0,其結果...

arm彙編高手進!使用arm彙編指令實現for迴圈結構

int getsum int val 使用匯編求1 2 3 val的值 隨便寫了個求和的例子 其餘的迴圈大同小異 不懂可以繼續 執行之前請交叉編譯然後在arm平臺上執行 其實你完全可以用keil,iar等軟體,用c語言編寫 使用 arm 彙編指令實現 if條件執行 可以用cmp rn operand...