Я только что прочитал о поддержке префиксов сегментов% fs и% gs на платформах Intel в GCC. Было упомянуто, что «То, как вы получаете указатели на основе% gs или управляете значением самого% gs, выходит за рамки gcc;»__seg_fs на GCC. Можно ли эмулировать его только в программе?
Я ищу способ, когда я вручную могу установить значение% fs (я на IA32, RH Linux) и работать с ним. Когда я просто устанавливаю% fs =% ds, тест ниже работает нормально, и это ожидается. Но я не могу изменить тест, чтобы иметь другое значение% fs и не получить ошибку сегментации. Я начинаю думать, что изменение значения% fs - это не единственное, что нужно сделать. Поэтому я ищу совет, как сделать часть памяти, адресованную% fs, которая не равна DS.
#include <stddef.h>
typedef char __seg_fs fs_ptr;
fs_ptr p[] = {'h','e','l','l','o','\0'};
void fs_puts(fs_ptr *s)
{
char buf[100];
buf[0] = s[0];
buf[1] = s[1];
buf[2] = s[2];
buf[3] = '\0';
puts(buf);
}
void __attribute__((constructor)) set_fs()
{
__asm__("mov %ds, %bx\n\t"
"add $0, %bx\n\t" //<---- if fs=ds then the program executes as expected. If not $0 here, then segmentation fault happens.
"mov %bx, %fs\n\t");
}
int main()
{
fs_puts(p);
return 0;
}