我正在学习x86汇编语言,并且我理解段的用途和用法。数据段保存重要的数据,也可以用来存储额外的数据(即内存分段模型)。不过,这是我的问题。如果段可以用来存储额外的数据,我如何确保我在其中存储的数据不会覆盖任何现有的数据?
例如,CS寄存器指向代码段。代码段包含程序的代码。如果我使用带偏移量的CS寄存器来存储一些数据,我如何知道将数据放在哪里,从而不会覆盖它所存储的代码?
请让我知道。我使用Intel语法汇编和NASM汇编。
谢谢
发布于 2009-10-23 08:52:43
数据段从不存储任何数据。段寄存器只是“基地址”指针,用于创建仅使用16位寄存器的20位指针。例如:
MOV DS, 0001
MOV DI, 0013
MOV AL, DS:[DI] ' this reads from address x00023 in memory
MOV DS, 0002
MOV DI, 0003
MOV AL, DS:[DI] ' this too reads from address x00023 in memory
MOV DS, 0000
MOV DI, 0023
MOV AL, DS:[DI] ' this too reads from address x00023 in memory
至于你的问题,如何确保不会用数据覆盖代码:这完全取决于你,确保你确切地知道你在内存中存储代码和数据的位置!
发布于 2009-10-23 10:34:38
这是汇编,所以你要负责的所有事情。把你的代码和数据分开就像把两个数字分开一样简单。每个内存位置最多使用一次。
发布于 2009-10-23 12:07:30
除了前面已经说过的,我想补充的是,您通常不希望在代码段中存储任何“数据”。这就是为什么你有一个数据段(DS指向的基址),甚至是一个“额外的”数据段(-> ES)。显然,由于您的基本假设必须是代码段中的任何内容都将被执行,因此在其中写入随机数据值将是非常不明智的。
如果您必须在代码段中存储数据,请确保它永远不会被执行,如下所示:
..some code here..
jmp AfterDataDeclaration
db 12 ; declare some data here
AfterDataDeclaration:
..some more code here..
编辑:如果你想访问任何特定的数据,你总是需要一个参考点,通常你可以通过标签来声明它。汇编程序会让你象征性地访问它,而不需要知道它的实际地址。
在一种情况下,你可能想要在代码段中写一些东西,如果你想在那里修补机器代码(即,自修改代码)。
https://stackoverflow.com/questions/1612121
复制相似问题