注册 登录
编程论坛 汇编论坛

MOV 指令的问题

wfoo 发布于 2014-09-26 09:54, 3684 次点击
这个是IDA反汇编出来的代码:
.text:FFFFFFFF8020014A 48 8B 25 3F 00 00 00                    mov     rsp, cs:off_FFFFFFFF80200190
.text:FFFFFFFF80200151 6A 00                                   push    0
.text:FFFFFFFF80200153 9D                                      popfq
.text:FFFFFFFF80200154 0F 01 15 A5 AE 3D 00                    lgdt    fword ptr cs:unk_FFFFFFFF805DB000
.text:FFFFFFFF8020015B B8 18 00 00 00                          mov     eax, 18h

这是Intel® 64 and IA-32 Architectures Software Developer’s Manual的指令说明:
Opcode     Instruction        Op/En    64-Bit mode   Compat/Leg Mode       Description
8B /r         MOV r16,r/m16        RM        Valid         Valid                 Move r/m16 to r16.
8B /r         MOV r32,r/m32        RM        Valid         Valid                 Move r/m32 to r32.
0F 01 /2      LGDT m16&32          M         N.E.          Valid                 Load m into GDTR.
0F 01 /2      LGDT m16&64          M         Valid         N.E.                  Load m into GDTR.

目标代码为64位,Manual说明MOV(8B)指令是把r/m32的数MOV到r32寄存器中,为什么IDA反出来的汇编却是相对地址呢(0xFFFFFFFF80200151 + 0x0000003F = 0xFFFFFFFF80200190)?
那个lgdt指令也是这样?

[ 本帖最后由 wfoo 于 2014-9-26 09:56 编辑 ]
8 回复
#2
zklhp2014-09-26 10:28
我在想 你确定这是一段代码而不是数据么
#3
wfoo2014-09-26 10:35
确定是代码
#4
wfoo2014-09-26 10:37
那段代码是linux刚被解压,然后就掉到那里执行,前面可能还有30多条指令。
#5
wfoo2014-09-26 10:43
unk_FFFFFFFF805DB000这个地址上的数据也是符合GDT需要的数据格式。
#6
hu9jj2014-09-28 07:59
某些数据段也有可能恰好能被反汇编成伪代码的,首先必须确定要反汇编的确实是指令段且未被加密过。
#7
wp2319572014-09-29 08:16
不懂呀
#8
wfoo2014-09-30 00:25
回复 6 楼 hu9jj
那段数据我可以肯定是代码,从linux的镜像第一条代码我一直分析到了那里。那段代码是真正开始运行elf格式的内核代码了,也就是刚刚开始把cpu设置为保护模式并开启64位模式,然后就是那段代码初始化堆栈,清零rflags寄存器,设置全局描述符表,初始化内存分页所需要的目录表项。也就是把释放的elf代码映射到虚拟地址FFFFFFFF80000000.
#9
wfoo2014-09-30 00:30
后来查资料我也把问题弄明白了,64位的r/m操作数有点特别,当mod为0x4(对应的寄存器是rsp)的时候,基址寄存器为rip,也就是这样刚好为相对地址。
1