Эмуляция сравнения двух чисел или как сравнить два qword x32 cmp? - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем привет. Столкнулся с такой проблемой: в цпп коде нужно сравнить два числа при помощи инструкции cmp и получить после этого состояние флагов. Всё ничего, но сравнить надо два qword в x32 коде. То есть нельзя использовать 64-битные регистры. Мой велосипед:
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
}
Естественно под first и second подразумеваются qword. Если я накосячил, то прошу поправить и наставить на путь истинный. Спасибо.

Решение задачи: «Эмуляция сравнения двух чисел или как сравнить два qword x32 cmp?»

textual
Листинг программы
mov eax,[first_lower]
mov edx,[first_upper]
sub eax,[second_lower]
sbb edx,[second_upper]
pushf
pop [current_flags]

Объяснение кода листинга программы

  1. mov eax,[first_lower] - переносит значение из памяти в регистр eax. Здесь [first_lower] - это переменная, которая содержит первый нижний предел.
  2. mov edx,[first_upper] - переносит значение из памяти в регистр edx. Здесь [first_upper] - это переменная, которая содержит первый верхний предел.
  3. sub eax,[second_lower] - выполняет вычитание значения из регистра eax с переменной [second_lower]. Здесь [second_lower] - это переменная, которая содержит второй нижний предел.
  4. sbb edx,[second_upper] - выполняет вычитание значения из регистра edx с переменной [second_upper]. Здесь [second_upper] - это переменная, которая содержит второй верхний предел.
  5. pushf - отправляет в стек текущее значение флагов регистра.
  6. pop [current_flags] - извлекает из стека текущее значение флагов и сохраняет его в переменной [current_flags].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы