Здравствуйте. Я тут попробовал сделать сабж, столкнулся с некоторым не совсем понятным явлением. Вот этот код под 64 бит
const char msg[] = {'H','e','l','l','o',',',' ','W','o','r','l','d','\n'};
const char sz = sizeof(msg);
void _start(void)
{
asm volatile (
"mov $1, %%rax\n\t" // 1 - SYS_write
"mov $1, %%rdi\n\t" // 1 - STDOUT_FILENO
"mov %0, %%rsi\n\t" // msg
"mov %1, %%rdx\n\t" // size
"syscall\n"
:
: "g" (msg), "g" (sz)
: "%rsi", "%rdx"
);
asm volatile (
"mov $60, %rax\n\t" // 60 - SYS_exit
"mov $0, %rdi\n\t" // 0 - EXIT_SUCCESS
"syscall\n");
__builtin_unreachable();
}
Если же вынести объявление-инициализацию переменных в _start :
void _start(void)
{
const char msg[] = {'H','e','l','l','o',',',' ','W','o','r','l','d','\n'};
const char sz = sizeof(msg);
asm volatile (
"mov $1, %%rax\n\t" // 1 - SYS_write
"mov $1, %%rdi\n\t" // 1 - STDOUT_FILENO
"mov %0, %%rsi\n\t" // msg
"mov %1, %%rdx\n\t" // size
"syscall\n"
:
: "g" (msg), "g" (sz)
: "%rsi", "%rdx"
);
asm volatile (
"mov $60, %rax\n\t" // 60 - SYS_exit
"mov $0, %rdi\n\t" // 0 - EXIT_SUCCESS
"syscall\n");
__builtin_unreachable();
}
gcc version 4.5.1 20101208
Почему так?