LINUX.ORG.RU

Что делает этот асм-код, не могу перевести в Intel формат

 , , , ,


0

1

Есть такой код на асме, не особо понимаю, что он делает , и, соответственно, как его перевести в Intel синтаксис

xorl %%ebx, %%ebx ;xor ebx,ebx
negl %%eax ;neg eax
rcl $3, %%ebx ;rcl ebx,3
movl 0f( , %%ebx ), %%eax ;тут непонятно
jmp *%%eax ;тут тоже - переход на то, что указывает еах?
0:
.long 1f ;тоже неясно, и ниже все неясно
.long 2f
1:
: : "a" (val) : "%ebx"

jmp 3f
2:
3:

в оригинале это макрос для Си

#define IF_ZERO(val) \
asm(" xorl %%ebx, %%ebx\n\t" \
" negl %%eax\n\t" \
" rcl $3, %%ebx\n\t" \
" movl 0f( , %%ebx ), %%eax \n\t" \
" jmp *%%eax \n" \
"0: \n\t" \
" .long 1f\n\t" \
" .long 2f\n" \
"1: \n" \
: : "a" (val) : "%ebx");
#define ELSE_ZERO \
asm(" jmp 3f\n\t" \
"2: \n");
#define ENDIF_ZERO \
asm("3: \n");

xorl %%ebx, %%ebx  ; обнуляем ebp

negl %%eax         ; "The CF flag set to 0 if the source operand is 0; otherwise it is set to 1"

rcl $3, %%ebx      ; Сдвиг с учетом CF, в зависимости от него мы получим в ebx 0 или 1
movl 0f( , %%ebx ), %%eax ; mov eax, [rbx + 0f] - не знаю как точно это написать в Intel синтаксисе, 0f это метка, которая дальше называется 0
jmp *%%eax         ; прыгаем по адресу в eax
0:
.long 1f           ; адрес метки 1
.long 2f           ; адрес метки 2
1:
: : "a" (val) : "%ebx"

jmp 3f
2:
3:

Суть вроде бы понятна - в зависимости от значения в eax (ноль или не ноль) прыгаем на 1: или 2:.

Но выглядит довольно заморочено (neg+rcl, например), мне кажется можно было бы сделать проще.

Deleted
()
Ответ на: комментарий от Deleted

Спасибо за ответы! Все понял, еще посмотрю мануал.

Заморочено, потому что это пример на тему обфускации (замена стандартного IF !eax ) из какой-то книжки.

zer0cat
() автор топика

как его перевести в Intel синтаксис

Как один из вариантов: можно скомпилировать (с -g3), потом вызвать для объектного файла objdump с опциями -S -M intel

anonymous
()
Ответ на: комментарий от anonymous

Там метки становятся абсолютными.

zer0cat
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.