试图在上下文 w 中理解这条指令。段寄存器
trying to understand this instruction in context w. Segment registers
我正在尝试理解这条指令:
0x80496fa <yellow_preflight+18>: mov eax,ds:0x804c220
这些是运行时的寄存器值:
EAX: 0x000000D2 EBX: 0xB7FB6FF4 ECX: 0xBFFFF438 EDX: 0xBFFFF3A4 o d I t S z A P c
ESI: 0x00000000 EDI: 0x00000000 EBP: 0xBFFFF468 ESP: 0xBFFFF450 EIP: 0x080496FF
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B
所以根据我的理解,如果这只是一个普通的 mov 指令 w/o
'ds:' 源地址中的前缀。然后 eax 应该保存 '0x0804c220'
价值。但是当我进一步执行时,eax 的值变为
EAX: 0xB7FB7440
而不是预期值。所以我试图找到这种行为的解释。提前致谢。
ds:0x804c220
是一个地址;该指令将该地址的值移动到 eax
.
ds:
是所谓的段覆盖前缀。
例如,假设您在源代码中写下了这个(NASM 语法):
mov eax, [0x804c220]
您没有使用段前缀,但汇编程序将使用默认段进行这种内存访问,ds
(数据段)。它会自行将您的代码转换为:
mov eax, [ds:0x804c220]
这就是为什么在源代码中使用 ds:
前缀对您的示例没有影响。但是当你使用不同的段覆盖前缀时,它就会有所不同。例如,在这种情况下,汇编程序将使用 fs
而不是默认的 ds
段:
mov eax, [fs:0x804c220]
我正在尝试理解这条指令:
0x80496fa <yellow_preflight+18>: mov eax,ds:0x804c220
这些是运行时的寄存器值:
EAX: 0x000000D2 EBX: 0xB7FB6FF4 ECX: 0xBFFFF438 EDX: 0xBFFFF3A4 o d I t S z A P c
ESI: 0x00000000 EDI: 0x00000000 EBP: 0xBFFFF468 ESP: 0xBFFFF450 EIP: 0x080496FF
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B
所以根据我的理解,如果这只是一个普通的 mov 指令 w/o 'ds:' 源地址中的前缀。然后 eax 应该保存 '0x0804c220' 价值。但是当我进一步执行时,eax 的值变为
EAX: 0xB7FB7440
而不是预期值。所以我试图找到这种行为的解释。提前致谢。
ds:0x804c220
是一个地址;该指令将该地址的值移动到 eax
.
ds:
是所谓的段覆盖前缀。
例如,假设您在源代码中写下了这个(NASM 语法):
mov eax, [0x804c220]
您没有使用段前缀,但汇编程序将使用默认段进行这种内存访问,ds
(数据段)。它会自行将您的代码转换为:
mov eax, [ds:0x804c220]
这就是为什么在源代码中使用 ds:
前缀对您的示例没有影响。但是当你使用不同的段覆盖前缀时,它就会有所不同。例如,在这种情况下,汇编程序将使用 fs
而不是默认的 ds
段:
mov eax, [fs:0x804c220]