我正在尝试拆解一些经典程序以了解其工作原理。我有时会看到类似的东西
MOV DWORD PTR ds:0xXXXXXX, YYYYYh
Run Code Online (Sandbox Code Playgroud)
其中 XXXXXX 是 32 位地址,YYYYY 是 32 位值
但之前没有将值放入 ds 寄存器。我在调试器中看到一个值,但我不知道她来自哪里。
这个指令会做什么?
将 YYYYY 放在 ds+0xXXXXXX 地址处?
小智 5
根据 i386 的 sysv ABI 的要求(此处为 PDF,请参阅第 3-29 页):
%cs、%ds、%es、%ss
段寄存器被初始化,以便用户进程可以使用 32 位虚拟地址来寻址代码、数据和堆栈段。更改其值的程序不符合 ABI 并且具有未定义的行为。
Linux 内核%ds在启动程序时会放入一个可用值。