Как реализовать мод оператора в сборке - PullRequest
6 голосов
/ 22 ноября 2011

Я изучаю разделение на ассемблере.Согласно книге, из которой я учусь, результат операции idiv помещается в eax, а остаток в edx.

Упражнение в книге - реализовать number = result % divisor в сборке.

Я бы подумал, что это будет эквивалентно обычной операции деления, за исключением того, что в результате получится edx.

Однако это не сработало, и edx вернул, казалось бы, мусор.

Почему?Как вы реализовали вышеуказанный псевдокод в сборке?

1 Ответ

17 голосов
/ 22 ноября 2011

Integer по модулю может быть реализовано двумя способами:

Во-первых, используя DIV или IDIV, где остаток будет помещен в EDX, но сначала вам нужно обнулить EDX, или заключить в кавычки intel:

Operand Size -----------| Dividend | Divisor | Quotient | Remainder
Quadword/doubleword     | EDX:EAX  |  r/m32  |   EAX    |   EDX. 

Например:

eax = eax % 9

когда без знака становится:

XOR EDX,EDX ;clear the destinations for outputs. this stops the garbage remainder  
MOV ECX,9
DIV ECX
MOV EAX,EDX

когда подписано, это:

MOV ECX,9
CDQ ;this will clear EDX due to the sign extension
IDIV ECX
MOV EAX,EDX

Второй способ - это оптимизация, используемая, когда по модулю используется степень двойки, в этом случае вы AND на единицу меньше, чем степень двух, например: eax = eax % 8 становится AND EAX,7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...