2013-03-18 10 views
-1

На x86 16-битной сборки, если есть в ax и 0x10 (16) в cl1, следующий код не ставит 0x1000 в cl:16 бит MUL сборка

mul cl ; ax = 0x 10 
mul cl ; ax = 0x 100 
mul cl ; ax = 0x0000 (not 0x1000) 

Почему Безразлично» t этот код работает так, как ожидалось?

ответ

6

Ваш источник составляет 8 бит (cl), поэтому умножение выполняется только по al.

Использовать вместо mul cx.

Объяснение: Если ax = 100h, то al = 00h. Так как результат mul cl размещен в ax, то вы делаете это в основном, чтобы заменить содержимое ax00h*cl, что составляет 00h.

Опкод MUL

CPU: i8086 + Тип инструкции: Пользователь

Затронутые ФЛАГОВ: CF, OF, AF, PF, SF, ZF

Инструкция: MUL ЦСИ

Примечание. Без знака умножает аккумулятор на источник. Если значение «src» равно байтовое значение, тогда AL используется как другой множимый, а результат находится в AX. Если «src» является значением слова, тогда AX умножается на «src» и DX: AX получает результат. Если «src» является значением двойного слова, , то EAX умножается на «src» и EDX: EAX получает результат. 386+ использует ранний алгоритм, который умножает любое значение в EAX как можно быстрее в 8 или 16-битных регистрах.

++++++++++++++++++++++++++++++++++++++
Часы (i486): MUL reg8 13-18 MUL reg16 13-26 MUL reg32 13-42 MUL mem8 13-18 MUL mem16 13-26 MUL mem32 13-42

+0

будет текстовые сообщения это сразу большое спасибо – Milmar

+1

@Milmar Ok. Остерегайтесь содержимого 'ch'. Лучше всего установить 'cx' в' 10h' в начале, вместо того, чтобы устанавливать 'cl' в' 10h'. На всякий случай. – Jean

+0

это сделало именно то, что я очень хотел поблагодарить за это i push cx в любом случае мне было просто неизвестно, что использование cl будет означать, что оно не пойдет на значение, которое мне нужно – Milmar

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