Gia*_*sio 2 c assembly gcc x86-64
在x86_64上,我正在玩一个不支持多线程的玩具操作系统.
我尝试将两个全局寄存器变量关联到%gs和%fs,这样:
register Foo* foo asm("gs");
register Bar* bar asm("fs");
Run Code Online (Sandbox Code Playgroud)
但GCC抱怨"gs"和"fs"不是有效的注册名称.
我尝试了其他寄存器(例如r12和r15)并编译.我尝试使用%gs和%fs,编译错误仍然存在.
这种方式可以使用这些寄存器吗?
此外,我已经阅读了 amd64中这些寄存器的问题,但是我无法理解那里指出的问题:它是一个GCC错误还是在amd64中使用寄存器变量的问题?
兼容80386的CPU有六个段寄存器,分别命名为cs,ds,ss,es,fs和gs.这些段寄存器用于称为分段的特征,并且基本上充当指向段描述符表的指针,其表达式隐含地添加在地址计算中.†
这些段寄存器不能实际用于保存任意数据,因为除了某些特定方式(les和朋友)将值加载到它们之外,当加载无效值时会导致异常.它们用于以下目的:
arch_prctlLinux上的系统调用设置与fs和gs相关联的偏移量,但请记住,这样做会破坏libc对这些段描述符的段描述符表中存储的偏移量的期望,并可能使基本设施成为可能如errno无法使用.† 这是一个简化的描述,它实际上有点复杂.
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |