我正在尝试反汇编一些经典程序,以了解它是如何工作的。我有时会看到类似的东西
MOV DWORD PTR ds:0xXXXXXX, YYYYYh
其中XXXXXX是32位地址,YYYYY是32位值
但之前没有任何东西在ds寄存器中输入值。我看到调试器的值,但我不知道她来自哪里。
这条指令会做什么?
将YYYYY放在ds + 0xXXXXXX地址?
答案 0 :(得分:4)
根据sysv ABI for i386 (PDF here, see page 3-29)的要求:
%CS,%DS,ES%,%SS
初始化段寄存器,以便用户进程可以 使用32位虚拟处理代码,数据和堆栈段 地址。改变其价值观的程序不符合 ABI并且具有未定义的行为。
Linux内核在启动程序时会在%ds
中放置一个可用值。