Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Получение модуля числа без операции сравнения

Берем простой код: void main() { int x = abs(-1); } Собираем и дизассемблируем его: $ gcc sample.c -o sample && objdump -d ./sample Получаем листинг, где нет условной команды: 80483a1: e8 ee ff ff ff call 8048394 80483a6: 89 c2 mov %eax,%edx 80483a8: c1 fa 1f sar $0x1f,%edx 80483ab: 31 d0 xor %edx,%eax 80483ad: 29 d0 sub %edx,%eax Как на C/C++ получить абсолютное значение целого числа без операции сравнения?


Ответ

ассемблерная операция 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; }

Комментариев нет:

Отправить комментарий