找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 129|回复: 3

请教:《x86 编写64位多处理器多线程操作系统》x64 位模式下相对寻址的疑惑

[复制链接]

10

主题

13

回帖

162

积分

至尊会员

积分
162

至尊会员

发表于 2024-12-6 14:21:52 | 显示全部楼层 |阅读模式
本帖最后由 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 相对寻址,太迷惑了....... 希望老师百忙中能帮忙解答,谢谢!^_^


3

主题

12

回帖

107

积分

至尊会员

积分
107

至尊会员

发表于 2024-12-6 15:41:41 | 显示全部楼层
如果用mov rbx, [rel welcome],这条指令,不是把welcome标号的地址给RBX,而是把welcome标号地址里的8字节的内容给RBX,.put_string64例程需要的是RBX里装的是字符串的地址.以上均属个人理解.请以老师的回答为准

10

主题

13

回帖

162

积分

至尊会员

积分
162

至尊会员

 楼主| 发表于 2024-12-6 17:20:41 | 显示全部楼层
本帖最后由 jetcan 于 2024-12-6 19:50 编辑

波克比,谢谢你热心的回答,你说的非常好,感谢!

我问题写错了,应该没有中括号,问题已重新更正,衷心感谢热心的你

还要请老师或各位同学回答解惑,谢谢了


2

主题

6

回帖

230

积分

至尊会员

积分
230

至尊会员

发表于 2024-12-6 21:49:34 来自手机 | 显示全部楼层
我觉得可以的,只是寻址方式不同,welcome 你用 rip 寻址就不用加上内核加载起始地址
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-12-22 09:09 , Processed in 0.224339 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表