2010-09-11 197 views
1

我有下面的代碼:彙編MOV問題

mov ax,@data 
mov ds,ax 

爲什麼我不能寫只是這樣嗎?

mov ds,@data 

所有來源:

.MODEL small 
    .STACK 100h 
    .DATA 
    HelloMessage DB 'Hello, world',13,10,'$' 
    .CODE 
    .startup 
    mov ax,@data 
    mov ds,ax 
    mov ah,9 
    mov dx,OFFSET HelloMessage 
    int 21h 
    mov ah,4ch 
    int 21h 
    END 

謝謝!

回答

4

你不能,因爲指令集不包含一個指令來做到這一點。它只是x86的衆多特性之一。

這些類型的限制對於彙編語言來說是相當正常的。大多數體系結構包含一些專門處理的寄存器(例如處理器狀態字),但通常比x86體系結構少。

不提供所有可能的移動指令的原因是減小指令集的大小,以便指令佔用更少的內存。總體而言,在兩個步驟中很少需要進行移動更爲有效。

+0

+1你也可以說,不能用標準的'mov'指令修改'ds'的原因是在大多數指令中只保留3位來編碼目的寄存器,而ax,bx, cx,dx,si,di,sp,bp已經使用了所有可用的可能性。但那會簡化一些事情。 – 2010-09-11 08:10:41

+0

是的,這是保持指令小的具體設計決定。 – starblue 2010-09-11 08:25:50

+0

在這種情況下,'mov ds,ax'會進入嗎?我很確定這是一個'mov',用'ds'作爲目標寄存器;)你有一個合理的論點,我只是在玩! – Lazarus 2010-09-11 08:26:08

0

我不是專家,但這是我如何理解這個約束的工作。

段寄存器用於控制寄存器指令使用的是哪一段存儲器,因此您最不想要的是從存儲器加載段寄存器(本例中爲數據段寄存器)位置。修改DS的行爲可能導致正在讀取的存儲器位置在更新DS的過程中改變,即現在加載到DS中的第一個比特/字節使得它在剩餘部分被讀取之前指向另一個段。將值讀入累加器(AX)或另一個通用寄存器是更安全的,因此當它加載到段寄存器時,該值在處理器中,因此在加載過程中不會出現數值損壞的情況。

+1

我不認爲這是原因,因爲在完整的值被讀取後DS可以很容易地被更新。 – starblue 2010-09-11 08:03:11

+0

如果這是解釋,那麼就不會有像'mul ax'這樣的指令,因爲ax'可能會在它被倍增時被「損壞」。 – 2010-09-11 08:06:28

+0

@starblue,如果處理器在將數據加載到DS之前已經具有讀取值的位置(比如'mov ax,@ data'然後'mov ds,ax'),那麼它可以很容易地進行更新,但是設計的效率可能會提高只需將裝入的值導入寄存器即可。我並不是說我絕對是對的,我只是說這並不合情理。 – Lazarus 2010-09-11 08:18:41

1

通用寄存器爲「斧頭」的設計,如果你嘗試將數據直接傳遞到特殊舉行指向數據的16個位號碼(在你的情況下,數據中的字符串)

所以註冊(ds或數據段在這裏)它將無法正常工作,因爲它不知道以這種方式接受數據。所以我們首先得到'數字'或數據開始的內存位置&將該點傳遞給ds寄存器。