2013-08-08 3 views
3

Извините, если этот вопрос повторяется - я искал похожие, но ничего не нашел. Кроме того, я должен сказать, что я новичок в ассемблере (на x86, по крайней мере)x86 Сборка: сравнение (синтаксис GAS)

Я считаю, что стандартный способ реализации прыжками в x86 является сделать ваше сравнение с чем-то вроде:

cmpl %ebx, %eax 

какие магазины результат в EFLAGS регистре, а затем выполните следующую команду прыжок использует этот EFLAGS регистр:

je some_label 

Но что, если я хочу, чтобы сохранить результат сравнения, чтобы сделать прыжок позже? Я думал о делать что-то вроде:

cmpl %eax, %ebx 
je storetrue 
storefalse: pushl $0 
jmp done 
storetrue: pushl $1 
done: 
... 

Нужно ли мне делать это так, или есть более прямой способ, который не требует дополнительных прыжков?

+2

[Флаги регистрируются - мы можем их читать или писать напрямую?] (Http://stackoverflow.com/q/1406783/995876) – Esailija

+1

Использовать [условное перемещение] (http://x86.renejeschke.de/html/ file_module_x86_id_34.html). –

+0

Это полезно, но это не объясняет точно, как получить результат сравнения при создании копии (par of) регистра флагов – AlexJ136

ответ

4

Несколько методов приходят на ум.

  1. Как уже упоминалось в комментариях к вопросу, вы можете использовать условную инструкцию перемещения.
  2. Вы можете использовать инструкцию SETxx, чтобы установить один из 8-разрядных регистров в 0 или 1.
  3. Вы можете использовать инструкцию PUSHF для сохранения копии регистра EFLAGS в стек. Его можно восстановить с помощью инструкции POPF.
  4. Вы можете создать свой код, чтобы он не использовал инструкции, которые изменяют регистр EFLAGS в следующий раз, когда вы хотите использовать результаты этого сравнения.
  5. В зависимости от ваших вариантов использования вы можете создать простое арифметическое выражение, которое приведет к 0 или 1 или другому желаемому значению (лично я предпочитаю комбинацию 0 или -1, поскольку тогда она становится тривиальной для преобразования что для любой пары X или Y, использующей И, за которой следует ADD).

Надеюсь, это поможет.

+0

Итак, если бы я использовал сравнение, то pushf, сделайте кое-что, что изменит cflags, а затем popf, затем прыгайте, Я действительно делаю тот же самый прыжок, который я бы сделал, если бы я прыгнул сразу после первоначального сравнения? – AlexJ136

+0

@ AlexJ136 - Пока данные, которые вы выпадаете из стека с помощью POPF, это то же самое, что вы вставляете в стек с помощью PUSHF, тогда да. – Sparky

Смежные вопросы