使用道具 举报
Post by Tetris 新的AMD64 CPU扩展了原有的几个通用寄存器至64位,把原有寄存器名开头的"E"变成了"R",例如EAX变成RAX,EFLAGS变成RFALGS,总之所有E打头的换成R就是。
Post by kj501 这话说得不够准确。AMD并没有用“R”开头的64位寄存器代替“E”开头的32位寄存器。而是为了向后兼容,对32位寄存器进行了64位扩展,形成新的64 位寄存器。这个新的64位寄存器(如RAX)的低32位部分就是对应的32位寄存器(如EAX)。这各intel在从16位的8086扩展到32位的80386时的做法是一致的。也是寄存器EAX的低16位部分就是16位的AX,这个AX又可以分为8位的AH和AL。
Post by Tetris 最让人兴奋的是,64-bit mode下使用了64位平展地址,80386下最让人头痛的段选择子+段内偏移的方式终于可以彻底告别。而段寄存器也几乎没有什么作用了,但在某下特别应用下可以通过设置段寄存器在64-bit mode使用32位地址。
Post by rickxbx linux 已经很少使用段了 可以看一个有趣的现象(注意95行): 84 #define SAVE_ALL \ 85 cld; \ 86 pushl %es; \ 87 pushl %ds; \ 88 pushl %eax; \ 89 pushl %ebp; \ 90 pushl %edi; \ 91 pushl %esi; \ 92 pushl %edx; \ 93 pushl %ecx; \ 94 pushl %ebx; \ 95 movl $(__USER_DS), %edx; \ 96 movl %edx, %ds; \ 97 movl %edx, %es;
Post by Tetris 上面的代码是正在从内核态向用户态切换吧?
Post by rickxbx 呵呵,猜错了. 是从用户态向核心态时的代码,所以我称之为"有趣" 可能这是个失误,也有可能是提醒我们 "嘿,对 段这个东西,别太在意!" 事实时,用这样的代码编译出来的内核是能够正常运行的.
Post by Tetris 呵呵,强烈怀疑这段代宏从来就没有被展开过,怎么可能是 movl %edx, %ds ds是16位寄存器,上面的指令编译都不过。
本版积分规则 发表回复 回帖后跳转到最后一页