Разработка и ромхакинг > Ромхакинг
Кто знаком с синтаксисом at&t? Помогите разобраться?
(1/1)
pristavkin:
void gbz80_inc(byte* reg)
{
asm volatile (
"movl $0, %1\n" // load 0 to NFLAG
"incb %2\n"
"lahf\n" // get flags
"andb $1,%%bh\n" // carry not affected
"andb $0xFE,%%ah\n"
"orb %%ah, %%bh \n"
: "=b" (flags), "=g" (NFLAG), "=q" (*reg)
: "2" (*reg), "0" (flags)
: "cc", "ah");
}
Собственно код. Первая часть понятно, а вот вторая
: "=b" (flags), "=g" (NFLAG), "=q" (*reg)
: "2" (*reg), "0" (flags)
: "cc", "ah");
не пойму как это до конца работает.
Может кто-нибудь объяснит, расскажет что всё это значит и как устроено. Спасибо.
Йобан Матич:
не ты ли?
http://www.wasm.ru/forum/viewtopic.php?id=34531
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
Читать Extended Asm.
копипаста:
--- Цитата ---после первого двоеточия - выходные параметры
после второго - входные параметры
после третьего - список регистров, которые будут использованы (т.е. затерты).
--- Конец цитаты ---
Вариант с интел синтаксисом
--- Код: ---typedef unsigned char byte;
extern int NFLAG;
extern unsigned short flags;
void gbz80_inc(byte* reg)
{
NFLAG = 0;
__asm mov eax,reg
__asm mov dl,[eax]
__asm mov bx,flags
__asm inc dl
__asm lahf
__asm and bh,1
__asm and ah,0xFE
__asm or bh,ah
__asm mov flags,bx
__asm mov eax,reg
__asm mov [eax],dl
}
--- Конец кода ---
pristavkin:
Ничего я не понял. Плиз давай те разберём :-\
Добавлено позже:
__asm mov eax,reg
__asm mov dl,[eax]
__asm mov bx,flags
__asm inc dl = "incb %2\n" // Почему dl? Так и не понял %2. Второй какой то параметр но я его нигде не нашел.
__asm lahf ="lahf\n" // тут понятно
__asm and bh,1 = "andb $1,%%bh\n" // Тут очему то bh. НО параметр записан черещ $ почему-то а не через проценты
__asm and ah,0xFE = andb $0xFE,%%ah.// Почему 2 процента
__asm or bh,ah = "orb %%ah, %%bh \n" // понятно
"movl $0, %1\n" куда то нолик грузим только не знаюкуда
__asm mov flags,bx
__asm mov eax,reg
__asm mov [eax],dl
: "=b" (flags), "=g" (NFLAG), "=q" (*reg)
: "2" (*reg), "0" (flags)
: "cc", "ah");
Тут между этими делами должна зависимость быть на я её не вижу :(
Йобан Матич:
Зачем тебе AT&T если есть пример на intel?
GCC умеет и intel синтаксис понимать.
У AT&T порядок операндов — вначале источник, затем приёмник.
http://ru.wikipedia.org/wiki/AT&T-синтаксис
%eax - регистр
%%eax - переменная
$0x10 - константа
0x10 - адрес
pristavkin:
Вообще нафиг не нужен но просто нужо перенес в инел код. Вот и сижу , пытаюсь понять, втыкаю, что всё то после : значит. Оно ведь там не просто так
Йобан Матич:
--- Цитата: pristavkin ---после : значит.
--- Конец цитаты ---
Во втором сообщении написано про :
GManiac:
--- Цитата ---не ты ли?
http://www.wasm.ru/forum/viewtopic.php?id=34531
--- Конец цитаты ---
--- Цитата ---ник: ajak
--- Конец цитаты ---
Всё понятно, Йобан Матич, спасибо за находку ;)
Йобан Матич:
Вот ещё похожая тема, по ошибке не на ту дал ссылку.
http://www.wasm.ru/forum/viewtopic.php?id=33750
romanich:
--- Цитата: Йобан Матич от 28 Сентября 2009, 17:11:17 ---Вот ещё похожая тема, по ошибке не на ту дал ссылку.
http://www.wasm.ru/forum/viewtopic.php?id=33750
--- Конец цитаты ---
ба! всё те же на манеже ;)
Навигация
Перейти к полной версии