|
本帖最后由 jetcan 于 2024-12-9 01:43 编辑
老师,您好!
在书中,3.11.10:打印64位模式下的第一条信息。代码如下:
mov r15, [rel position]
lea rbx, [r15 + welcome]
call put_string64
问题:
既然相对寻址 (rel),能找到标号 position 的地址?
为什么不能 mov rbx, rel welcome,或 lea rbx, [rel welcome],找到 welcome 标号的地址?
// (知道 mov rbx, rel welcome 不合法,这样写只为表达使用的是 RIP 相对地址)
(明白 welcome 为什么要加上 position 内核程序的起始地址:wecome + position = welcome 的绝对地址)
但,不明白,为什么 position 不需要加上内核的起始地址,但 welocme 一定要加上内核的起始地址?
=> 在执行 mov rbx, rel welcome 时,welcome 与 指向下一条指令的 RIP 之间的偏移量 + RIP,不正是 welcome 在内存中的地址吗?
----------------------------------------------------- 附:测试代码 -----------------------------------------------------
; 清除 4 级头表第 1 个表项,删除线性空间低端 2MB 的映射关系
mov rbx, PML4_PHY_ADDR + 0xffff800000000000
mov qword [rbx+0*4], 0
invlpg [0xffff80000000000]
; 在 64 位模式下显示的第一条信息!]
lea rbx, [rel welcome] ; RIP 相对寻址,从 welcome 标号所在的内存单元中,提取出有效地址
call put_string64
---------------------------------------------------------------------------------------------------------------------------
测试结果:
1. 没有删除 4 级分页系统中,线性地址空间低端 2MB 时,使用 lea rbx, [rel welcome],VitrualBox 可以正常显示字符串
2. 删除 4 级分页系统中,线性地址空间低端 2MB 时,使用 lea rbx, [rel welcome],VitrualBox 也可以正常显示字符串
是测试方法有问题?
还是老师目的是为了演示 lea 的功能,而没有对 welcome 进行 RIP 相对寻址?
对于 welcome 能不能直接使用 RIP 相对寻址,太迷惑了....... 希望老师百忙中能帮忙解答,谢谢!^_^
|
|