在x86_64上,我正在玩一个不支持多线程的玩具操作系统。
我尝试将两个global register variables与%gs和%fs相关联,这样:
<ComboBox Height="33" HorizontalAlignment="Left" Margin="128,107,0,0" Name="comboBox1" VerticalAlignment="Top" Width="245">
<ComboBox.Resources>
<Style TargetType="ComboBoxItem">
<EventSetter Event="GotFocus" Handler="GotFocusHandler" />
<EventSetter Event="LostFocus" Handler="LostFocusHandler" />
</Style>
</ComboBox.Resources>
<ComboBoxItem Content="Cat 1" />
<ComboBoxItem Content="Cat 2" />
<ComboBoxItem Content="Cat 3" />
<ComboBoxItem Content="Cat 4" />
</ComboBox>
private void GotFocusHandler(object sender, RoutedEventArgs e)
{
string HighlightedText = (sender as ComboBoxItem).Content.ToString();
//do some thing
}
private void LostFocusHandler(object sender, RoutedEventArgs e)
{
string HighlightedText = (sender as ComboBoxItem).Content.ToString();
//do some thing
}
但是GCC抱怨“gs”和“fs”不是有效的注册名称。
我尝试了其他寄存器(例如r12和r15)并进行了编译。 我尝试使用%gs和%fs,编译错误仍然存在。
是否可以这种方式使用这些寄存器?
而且在amd64中I've read about issues with these registers,但是我无法理解那里指出的问题:它是一个GCC错误还是在amd64中使用寄存器变量的问题?
答案 0 :(得分:5)
80386兼容CPU有六个段寄存器,命名为cs,ds,ss,es,fs和gs。这些段寄存器用于称为分段的功能,并且基本上充当指向段描述符表的指针,其地址计算中隐含地添加了指针。†< / SUP>
这些段寄存器无法实际用于保存任意数据,因为除了某些特定方式(les
和朋友)将值加载到它们之外,当加载无效值时会导致异常。它们用于以下目的:
arch_prctl
系统调用来设置与fs和gs关联的偏移量,但请记住,这样做会破坏libc对于这些段描述符的段描述符表中存储的偏移量的期望并且可能会使errno
无法使用基本设施。†这是一个简化的描述,它实际上有点复杂。