1樓:匿名使用者
要用assume把段跟段暫存器對應起來的原因是原來的dos找到的空閒記憶體的位址不是固定的,無法找到乙個位址在任何時候都是空閒的。於是dos需要可以重定位的程式,而當時的定位方式就是設定段暫存器的值使該程式能在可分配(空閒)的記憶體中可用。那就需要知道某個段被重定位時候需要修改哪個段暫存器的值才能正確執行。
assume提供這種段和重定位**時需要對應修改的暫存器的關係給編譯器,編譯器再這個資訊寫到二進位制檔案中去。比如dos下的exe程式記錄在檔案頭中。
2樓:納蘭旖兒
你有接觸過其他語言麼?
assume相當於其他語言中的宣告~就是宣告資料段 **段跟堆疊段assume的格式一般是這樣的
assume ds:data(資料段名稱,可任意),cs:code(**段名稱,可任意),ss:stuck(堆疊段名稱,可任意)
assume是必須的~如果沒有這個~計算機分辨不清楚你的程式該幹什麼~
3樓:匿名使用者
偽指令在編譯的時候是不會被編譯成機器碼的,所以他就是幫助你告訴編譯器你所用的段和暫存器的聯絡 程式本來就要分段寫的 這樣便於編譯器聯絡起你的段與暫存器的關係
別的話不多說 回答完畢
4樓:沙里波特
8088 cpu 工作時,只能訪問記憶體中的_四個段_。
但是,你在程式設計時,可以寫許許多多的邏輯段。
就比如說,你編寫了十個邏輯段,分別是:
seg1、seg2、。。。seg10。
那麼,程式執行時,四個_記憶體段_,分別對應,哪個邏輯段?
這就必須使用 assume 來指定其中的四個。
(其餘邏輯段,可在程式執行期間,再用 assume 來指定。)
這麼簡單的問題,竟然還有人扯到 dos 上去!
是在賣弄你的 zhi shang 太低吧。。。
但是,assume,是偽指令,對 cpu 沒有任何作用。
這個單詞,翻譯成中文,也只是「假定」。
而真正的作用,還是需要用「mov ds,ax」指令來實現。
彙編偽指令assume具體作用是什麼
5樓:仇羽吾詠
要用assume把段跟段暫存器對應起來的原因是原來的dos找到的空閒記憶體的位址不是固定的,無法找到乙個位址在任何時候都是空閒的。於是dos需要可以重定位的程式,而當時的定位方式就是設定段暫存器的值使該程式能在可分配(空閒)的記憶體中可用。那就需要知道某個段被重定位時候需要修改哪個段暫存器的值才能正確執行。
assume提供這種段和重定位**時需要對應修改的暫存器的關係給編譯器,編譯器再這個資訊寫到二進位制檔案中去。比如dos下的exe程式記錄在檔案頭中。
組合語言中偽指令assume有什麼實際意義嗎
6樓:匿名使用者
assume 的作用是關聯段名與段暫存器。
如果你在資料段中定義了變數名,比如:
x db 0 1
而你在**中,需要直接使用這個變數名,比如:
mov al, x 1
那麼,匯程式設計序在彙編時,就會報告錯誤。
因為,mov指令中遇到 x 這個變數名時,匯程式設計序不知道它要用哪個段暫存器作為段位址。
所以:若要用變數名直接訪問,或使用語句標號(比如你例子中的標號 start)就必須要在assume偽指令中將這些變數或標號所在段的段名,與段暫存器名關聯,否則會出錯。
如果你不使用段中的變數名,可以不關聯這個段的段名與暫存器。
如果你訪問變數時,都指定了段跨越字首,關聯也不是必須的。比如你可以用 mov al, ds:x訪問變數 x 。
7樓:沙里波特
assume,不需要討論。
高版本的 masm,已經不用這句了。
彙編源程式偽指令assume存在性問題
assume是給編譯器看的!這一點非常重要!不要認為對 有實際作用,它只是給編譯器看看,你還必須手動給ds es賦值,如果你不手動給ds es賦值,你的 就會掛掉。你奇怪的很對,那它是不是多餘的?確實是,但是編譯器需要它啊,你不指定,編譯器就會不給你檢查段錯誤,或者給你亂檢查段錯誤!這個偽指令實際是...
組合語言資料偽指令DUP用法,組合語言中的dup有什麼作用
茲斬鞘 10 dup 1 重複定義了10個字元素,初始值為1,佔用10 2 20個位元組。5 dup 重複定義了5個字元素 其初始值實際為0 佔用5 2 10個位元組 因此總共佔用30個位元組。具體分析 在彙編定義變數的時候會用到dup,變數名 型別 初值表,dup用於把一個相同值賦值若干次,重複次...
組合語言中je 和jne的區別,組合語言指令JG與JGE的用法區別
je 表示等於就跳轉,jne是不等於就跳轉,完全相反的意思。je jmp equal jne jmp not equal jz 表示當zf 1 時跳轉,即結果為0跳轉。jnz 即 zf 0 時跳轉,即結果不為0 跳轉。jz是零標誌位置位 1 即為0 時跳轉。jnz與上面相反,是當零標誌位置0 0 即...