Перевести ассемблерную вставку с gcc на микрософт [upd: x64 !!\
_asm {
push eax
mov eax, 0x44
dec fs:[eax]
pop eax
}
так, не?
$ cat test.c
int foo
{
__asm__("decl %%fs:(%0)" : : "r" (0x44;
return 42;
}
$ gcc -S -c test.c
$ head -16 test.s
.text
.globl _foo
_foo:
LFB0:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $68, %eax
# 3 "test.c" 1
decl %fs:(%eax)
# 0 "" 2
movl $42, %eax
popq %rbp
LCFI2:
ret
Вроде без push/pop должно быть.это для случая, когда известно(есть гарантия что регистр eax не используется в момент вызова данной инструкции.
Если же такой гарантии нет, то push/pop необходим
"умно" работает с операндами в __asm__ и он почти никогда не сгенерирует push/pop.
Фишка в том, что gcc
да, в этом как раз дело, потому что если задача — портировать, то полагаться на вывод gcc недостаточно
А смотря чего хочется добиться. gcc с тем же успехом %edx вместо %eax будет в сгенеренном коде использовать, если %eax занят будет. Что хотел от "перевода" топикстартер - не понятно же.
Фишка в том, что gcc "умно" работает с операндами в __asm__ и он почти никогда не сгенерирует push/pop.Согласен.
ps
Инструкция decl в gcc более высокоуровневая, она понимает что регистры бывают используемые/неиспользуемые и выбирает неиспользуемый регистр.
Из-за портирования на более низкоуровневый язык, где таких понятий нет, приходится вручную фиксировать регистр и добавлять push/pop , либо в ручную отслеживать, что регистр не используется и убирать push/pop как излишние
А в нём вот такой вот ппц.
теперь это надо собрать под x64
Интрсинк такой использовать:
__incfsdword(0x44) ?
dec же был...
тут я не могу сообразить - надо dword или word
Оставить комментарий
yolki