這幾天在看王爽大大的 組合語言。對於assume偽指令卻很是不懂。
比如已經定義了assume cs:code,ds:data
但用debug觀察的時候,發現ds段暫存器卻沒有相關聯的資料。
必須在cs中寫明: mov ax,data
mov ds,ax
然後才能發現ds中有正確的資料。
於是疑惑,assume不是已經關聯了ds嘛?
上網求助 = =、 然後找到答案。
編寫程式,是寫給編譯軟體的。由編譯軟體,編譯成機器碼,再去控制cpu。但是,編譯軟體,對assume語句,並不生成機器碼。
所以,必須有mov ax,data,mov ds,ax,cpu才能受控。
---assume語句,是偽指令,僅僅是寫給編譯軟體的。編譯軟體,並不把它生成機器碼。
assume對除了cs以外的其它段暫存器,僅僅只是關聯了段名,以便在訪問段內變數時程式可以知道用哪個段暫存器,並沒有在程式載入時將段位址裝入段暫存器。
所以,將段位址裝入段暫存器的工作,必須由使用者在程式中自己編寫**,並在程式開始執行時執行**完成裝入工作。僅僅對cs段暫存器,會在關聯段名的同時,在程式載入時自動將段位址裝入段暫存器。
----補充:前天知道了答案後,我以為assume ds:data 之類的指沒有什麼用,只是給程式設計師看的。
但今天發現不是這樣的。 如果你在data中用了標號的話,則assume ds:data不能省略。
比如:data segment
a db 1,2,3,4,5,6,7,8
b dw 0
data ends
a,b的後面沒有「 :」。 如果你想在cs段中用資料標號訪問資料,則必須在開頭加上assume ds:data,否則會報錯
arror a2068:can not address with segment register
不過就算在開頭加上了assume ds:data,**段中也不能少了mov ax,data,mov ds,ax。
彙編偽指令注釋
彙編偽指令注釋 1 ds 預留儲存區命令 格式 標號 ds 表示式值 其功能是從指定位址開始,定義乙個儲存區,以備源程式使用。儲存區預留的儲存單元數由表示式的值決定。tmp ds 1 從標號tep位址處開始保留1個儲存單元 位元組 2 bit 定義位命令 其功能用於給字元名稱定義位位址。spk bi...
彙編偽指令注釋
1 ds 預留儲存區命令 格式 標號 ds 表示式值 其功能是從指定位址開始,定義乙個儲存區,以備源程式使用。儲存區預留的儲存單元數由表示式的值決定。tmp ds 1 從標號tep位址處開始保留1個儲存單元 位元組 2 bit 定義位命令 其功能用於給字元名稱定義位位址。spk bit p3.7 經...
ARM彙編偽指令
global,local,set,equ global 使得符號對聯結器可見,變為對整個工程可用的全域性變數,通俗講就是定義全域性變數 eg global symbol local set 給乙個全域性變數或區域性變數賦值,和.equ的功能一樣 eg set symbol expr set star...