2011-11-17 28 views
1

我創建的召開基本信息,以及一些字節字符串..例如,一個結構:彙編語言86:膠印間接操作的一個結構

EXAMPLESTRUCT STRUCT 
somePrompt BYTE 20 DUP (0) 
;other fields 
EXAMPLESTRUCT ENDS 

我的意圖是建立一個結構數組有關該特定結構的消息,線沿線的初始化:

ex1 EXAMPLESTRUCT <"Enter first"> 
ex2 EXAMPLESTRUCT <"Enter second"> 

直接引用該結構域的地址(MOV EDX,OFFSET ex1.somePrompt)工作得很好,但使用間接尋址時,我一直得到的偏移量錯誤:

mov esi,OFFSET ex1 
mov edx,OFFSET (EXAMPLESTRUCT PTR [esi]).somePrompt ;Error here 

那麼,是我的代碼錯了,還是這只是由於某種原因非法使用OFFSET?

唯一的解決辦法,我發現是使結構包含指針,然後初始化它們在已經取得的消息指向:

WORKAROUND STRUCT 
somePTR DWORD ? 
;... 
WORKAROUND ENDS 

.data 
msg BYTE "Hello World",0 
struct1 WORKAROUND <OFFSET msg> 

,然後沿顯示的

mov esi,OFFSET struct1 
mod edx,(WORKAROUND PTR [esi]).somePTR 
行的消息

任何其他解決方案/解決方法,或者我應該堅持指針?

回答

1

你想使用lea指令。

lea edx,(EXAMPLESTRUCT PTR [esi]).somePrompt 

多一點關於leaWhat's the purpose of the LEA instruction?

OFFSET是一個編譯時構造。當您使用OFFSET指令時,彙編器必須能夠在編譯時將其解析爲一個值。這就是爲什麼你得到一個錯誤 - 因爲彙編程序不知道esi的值是什麼。

+0

非常有用的指令,非常感謝,做了伎倆。 – user994121