Берем простой код:
void main() {
int x = abs(-1);
}
Собираем и дизассемблируем его:
$ gcc sample.c -o sample && objdump -d ./sample
Получаем листинг, где нет условной команды:
80483a1: e8 ee ff ff ff call 8048394
Ответ
ассемблерная операция sar это обычный сдвиг вправо.
Вот ваш код:
int myabs(int x)
{
//mov %eax,%edx
//sar $0x1f,%edx
int minus_flag = x>>0x1F;//0x1F = 31
//xor %edx,%eax
int y = minus_flag ^ x;
//sub %edx,%eax
y -=minus_flag;
return y;
}
Комментариев нет:
Отправить комментарий