2016-11-05 2 views
0

Я застрял в моем ассемблерном коде, где я хочу сравнить два значения стека .Сравните два значения из стека?

x86, Синтаксис AT & T

cmpl -4(%ebp), 4(%ebp) 

Error: too many memory references for `cmp'

Я думаю, что это не представляется возможным сравнить два значения на основе мультипликатора и EBP. Какие-либо предложения ?

+3

В x86 невозможно использовать два операнда памяти с простыми инструкциями типа «CMP». Поэтому скопируйте/'MOV' одно из значений памяти в' EAX', а затем сравните другое с 'EAX'. – zx485

+0

Первые несколько хитов google для '' слишком много ссылок на память для «' все имеют ответы. например http://stackoverflow.com/questions/2531682/gas-too-many-memory-reference. Большинство из них касаются mov, а не cmp, но MOVS и CMPS существуют. Ответ Иры дает хорошее представление о том, что CMP отличается от желания добавить, например, так как вы можете сделать это по-другому. –

ответ

1

Вы можете сравнить два значения в памяти с помощью инструкции CMPSD.

Op хочет сделать что-то эквивалентно:

cmpl -4(%ebp), 4(%ebp) 

Он может сделать это путем размещения адреса ячеек памяти, представляющих интерес в ESI и EDI соответственно, а затем с помощью CMPSD memory-to-memory string-compare instruction:

lea -4(%ebp), %esi 
    lea 4(%ebp), %edi 
    cmpsd 

(простите мое неопытное злоупотребление AT & T синтаксис).

Это не так, как это было бы на практике. Другие ответы, представленные здесь (загрузка значения в регистр и сравнение), гораздо более практичны. Если ничего другого, эти решения записывают только один регистр, и этот хак сжигает два.

Занятие: в ассемблере существует почти всегда один способ кожи кошки.

+0

@PeterCordes: спасибо за редактирование. –

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