Перевести ассемблерную вставку с gcc на микрософт [upd: x64 !!\

yolki


__asm__("decl %%fs:(%0)" : : "r" (0x44;

yolki


_asm {
push eax
mov eax, 0x44
dec fs:[eax]
pop eax
}


так, не?

shlyumper

Вроде без push/pop должно быть.

$ 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

Dasar

Вроде без push/pop должно быть.
это для случая, когда известно(есть гарантия что регистр eax не используется в момент вызова данной инструкции.
Если же такой гарантии нет, то push/pop необходим

shlyumper

Фишка в том, что gcc "умно" работает с операндами в __asm__ и он почти никогда не сгенерирует push/pop.

Serab

да, в этом как раз дело, потому что если задача — портировать, то полагаться на вывод gcc недостаточно :)

shlyumper

А смотря чего хочется добиться. gcc с тем же успехом %edx вместо %eax будет в сгенеренном коде использовать, если %eax занят будет. Что хотел от "перевода" топикстартер - не понятно же.

Dasar

Фишка в том, что gcc "умно" работает с операндами в __asm__ и он почти никогда не сгенерирует push/pop.
Согласен.
ps
Инструкция decl в gcc более высокоуровневая, она понимает что регистры бывают используемые/неиспользуемые и выбирает неиспользуемый регистр.
Из-за портирования на более низкоуровневый язык, где таких понятий нет, приходится вручную фиксировать регистр и добавлять push/pop , либо в ручную отслеживать, что регистр не используется и убирать push/pop как излишние

yolki

мне нужно было проект, который собирается gcc в mingw собрать в вижуалстудии, потому что я его присоединяю к другому проекту.
А в нём вот такой вот ппц.

yolki

так!
теперь это надо собрать под x64
Интрсинк такой использовать:
__incfsdword(0x44) ?

rosali

> __incfsdword
dec же был... :confused:

yolki

ну там в одной функции inc, в другой - dec.
тут я не могу сообразить - надо dword или word :confused:
Оставить комментарий
Имя или ник:
Комментарий: