Эмуляция сравнения двух чисел или как сравнить два qword x32 cmp? - Assembler
Формулировка задачи:
Всем привет. Столкнулся с такой проблемой: в цпп коде нужно сравнить два числа при помощи инструкции cmp и получить после этого состояние флагов. Всё ничего, но сравнить надо два qword в x32 коде. То есть нельзя использовать 64-битные регистры.
Мой велосипед:
Теперь меня интересует аналогичен ли этот код вот этому:
Естественно под first и second подразумеваются qword.
Если я накосячил, то прошу поправить и наставить на путь истинный. Спасибо.
void cmp(BYTE* first_ptr,BYTE* second_ptr) { DWORD first_lower=*(DWORD*)first_ptr; DWORD first_upper=*(DWORD*)(first_ptr+4); DWORD second_lower=*(DWORD*)second_ptr; DWORD second_upper=*(DWORD*)(second_ptr+4); DWORD current_flags=0; __asm { mov ebx,esp mov eax,first_lower mov edx,second_lower cmp eax,edx pushf mov eax,first_upper mov edx,second_upper cmp eax,edx pushf pop eax pop edx or eax,edx mov current_flags,eax mov esp,ebx } std::bitset<32> result(current_flags); }
__asm { mov ebx,esp mov rax,first cmp rax,second pushf pop rax mov current_flags,rax mov esp,ebx }
Решение задачи: «Эмуляция сравнения двух чисел или как сравнить два qword x32 cmp?»
textual
Листинг программы
mov eax,[first_lower] mov edx,[first_upper] sub eax,[second_lower] sbb edx,[second_upper] pushf pop [current_flags]
Объяснение кода листинга программы
- mov eax,[first_lower] - переносит значение из памяти в регистр eax. Здесь [first_lower] - это переменная, которая содержит первый нижний предел.
- mov edx,[first_upper] - переносит значение из памяти в регистр edx. Здесь [first_upper] - это переменная, которая содержит первый верхний предел.
- sub eax,[second_lower] - выполняет вычитание значения из регистра eax с переменной [second_lower]. Здесь [second_lower] - это переменная, которая содержит второй нижний предел.
- sbb edx,[second_upper] - выполняет вычитание значения из регистра edx с переменной [second_upper]. Здесь [second_upper] - это переменная, которая содержит второй верхний предел.
- pushf - отправляет в стек текущее значение флагов регистра.
- pop [current_flags] - извлекает из стека текущее значение флагов и сохраняет его в переменной [current_flags].
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д