GCC의 Intel 플랫폼에서 % fs 및 % gs 세그먼트 접두사에 대한 지원을 읽었습니다. "% gs 기반 포인터를 얻는 방법 또는 % gs 자체의 값을 제어하는 방법은 gcc의 범위를 벗어났습니다."__seg_fs 프로그램에서 바로 에뮬레이트 할 수 있습니까?
수동으로 % fs 값을 설정할 수있는 방법을 찾고 있는데 (IA32, RH Linux에 있음) 작업하고 있습니다. % fs = % ds를 설정하면 아래의 테스트가 제대로 작동하며 예상됩니다. 그러나 % fs의 다른 값을 가지기 위해 테스트를 변경할 수 없으며 세그먼테이션 오류가 발생하지 않습니다. % fs의 값을 변경하는 것이 유일한 방법은 아니라고 생각합니다. 그래서 나는 DS와 같지 않은 % fs에 의해 다루어지는 메모리의 일부분을 만드는 방법에 대한 조언을 찾고있다.
#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;
}