Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
1

Понять логику asm кода

24.06.2014, 16:14. Просмотров 218. Ответов 0
Метки нет (Все метки)

Есть некий кусок asm кода (взят с бинарника, подогнан под Visual Studio C++):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned int delta1 = 600;
unsigned int delta2 = 1100;
 
__asm {
    mov eax, [delta2]
    neg eax
    or  eax, [delta2]
    sar eax, 0x1F
    mov edx, [delta2]
    sub edx, [delta1]
    and edx, eax
    mov eax, [delta2]
    add [delta1], edx
}
При его выполнении delta1 становится равна delta2.

Пытаюсь портировать его на C++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// > mov eax, [delta2]
// > neg eax
// int delta2_signed = -static_cast<int>(delta2);
// > or  eax, [delta2]
// delta2 | delta2_signed
// > sar eax, 0x1F
// (signed int)(delta2| -delta2_signed ) >> 31
// > mov edx, [delta2]
// > sub edx, [delta1]
// delta2 - delta1
// >> and edx, eax
// ((signed int)(delta2| -delta2_signed ) >> 31) & (delta2 - delta1)
// >> mov eax, [delta2]
// int res = ((signed int)(delta2| -delta2_signed ) >> 31) & (delta2 - delta1);
// >> add [delta1], edx
// delta1 += res
 
int delta2_signed = static_cast<int>(delta2);
delta1 += ((signed int)(delta2| -delta2_signed ) >> 31) & (delta2 - delta1);
Т.е. мы берём разницу между delta2 и delta1 и добавляем её к delta1.
Почему тогда не использовать просто delta1 = delta2

Добавлено через 18 минут
Тему можно закрыть, я протупил. Учитывал что дельта не может быть меньше 0, а про сам нуль забыл.
Это эквивалент:

C++
1
2
if(delta2)
    delta1 = delta2
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2014, 16:14
Ответы с готовыми решениями:

Средства обратной разработки: из ASM кода нужно понять, по какой формуле производится расчет
Здравствуйте! Помогите разобраться с заданием. Дана программа, в ней есть...

Перевод кода (C++ -> Asm)
#include &lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; void main() { ...

Дизассемблирование: получение кода asm из com
Здравствуйте! По учёбе очень нужно из программы в формате .com получить...

Перевод asm кода в машинный код
Задача: записать в память процесса определенный asm код... Нашел информацию о...

Как происходит вызов asm функций из C++ кода?
Всем привет. У меня есть функции написанные на АСМе (MASM) расскажите...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2014, 16:14

Приведите примеры кода с комментариями (asm или debug)
1. Вывести на экран текст 2. Рассчитать сумму всех элементов массива 3. Найти...

Перевод кода Cи → Asm
День добрый! Возникла такая ситуация - необходимо проверить около миллиона...

вызов функции СИ printf из asm кода
Помогите пожалуйста разобраться с вызовом библиотечных функций СИ из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru