彙編assume 偽指令

2021-06-23 01:41:41 字數 1019 閱讀 7377

這幾天在看王爽大大的 組合語言。對於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...