2011-11-17 27 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