2014-11-13 47 views
-2

因此,我進行了以下練習「;使用遠端地址(32位地址)修改內存中兩個字的內容。提示:使用LDS和LES指令。使用LDS和LES指令

而當我運行下面的代碼時,出現以下錯誤:「無法使用當前假定的段寄存器進行尋址」。你能向我解釋這個錯誤是什麼意思,以及如何正確編寫程序?

_DATA SEGMENT PUBLIC 'DATA' 
X DW 10 
Y DW 15 
ADR_X DD X 
ADR_Y DD Y 

_DATA ENDS 

_CODE SEGMENT PARA PUBLIC 'CODE' 
ASSUME CS: _CODE 

START PROC FAR 

PUSH DS 
XOR AX, AX 
MOV AX, _DATA ; initializing the segment register 
MOV DS, AX 

LDS SI,ADR_X 
LES DI,ADR_Y 

MOV WORD PTR[SI],20 
MOV WORD PTR ES:[DI],30 

RET 
START ENDP 
_CODE ENDS 

END START 
+0

它已經有一段DOS控制檯窗口,但你可能需要用'承擔DS:_DATA'也爲不合格' [SI]'參考工作。其他注意事項:當你同時執行'LDS'時,明確設置DS是多餘的,然後,您按DS,但不會再次彈出它。 –

+0

在執行LES指令之前,LDS可能會修改DS(在這種情況下,它不會是通用解決方案)。首先執行LES,或者您可以將ADR_X和ADR_Y移至ret之後,以便使用CS訪問它們(彙編器應爲您執行默認CS覆蓋)。 – rcgldr

回答

0

實例微軟風格的代碼意味着MSDOS或者支持16位實模式

dgroup group _data,_bss,stack 
_data segment public 'data' 
x  dw  10 
y  dw  15 
adr_x dd  x 
adr_y dd  y 
_data ends 
_bss segment public 'bss' 
_bss ends 
stack segment stack 'stack' 
     dw  2048 dup (?)   ; stack 
stack ends 
_text segment para public 'code' 
     assume cs:_text,ds:dgroup,es:nothing,ss:dgroup 
start proc far 
     mov  ax,_data    ; init ds 
     mov  ds,ax 
     les  di,adr_y    ; get addresses 
     lds  si,adr_x 
     mov  word ptr ds:[si],20  ; set values 
     mov  word ptr es:[di],30 
     mov  ax,04c00h    ; exit to dos 
     int  21h 
start endp 
_text ends 
     end  start