|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 17, 2003 12:19:43 Надо перемножить два числа в bcd формате: mov ax,0005h mov bx,0013h mul bx aam Почему aam? потому что я не нашол ф-и bcd корекции после умножения... Это ф-я аски корекции умножения. В примере из книги - 5 умножают на 5 после чего производят эту корекцию и получают в старшей тетраде ax 2 а в младшей 5 вместо 19h... В моем примере я вместо 65 разбитой по тетрадам получаю 95 8(. Подскажите плз. почему? Я кажеться не правильно понимаю суть аски корекции... Обьясните, если не сложно, где я ошибся и как это исправить... С почтением. Ворон. |
|
|
Дата: Июн 17, 2003 13:02:09 · Поправил: P2M Raven [code] mov ax,103h ; 13 - десятичное aad ; приготовиться к умножению в AX станет 0Dh mov bl,5 mul bl aam ; в AX было 41h, станет 605h [/code] итого команда MUL не знает (и знать не обязана) что Вы работаете с BCD, она работает с не BCD. |
|
|
Дата: Июн 17, 2003 13:27:33 Спасибо большое. Т.е. не только результат разбит на младшую и старшую тетрады таким способом, но и входные данные должны быть так записаны? С благодарностью и уважением. Ворон. |
|
|
Дата: Июн 17, 2003 14:18:04 Извините, еще вопрос. mov ax,0700h mov bx,0002h aad div bx Это должно дать 0305h в ах но я получаю сообщение "Devide overflow" а в td "Devide by zero". после aad в ax 46 как и должно быть. Где я снова ошибся? Как бороться? С благодарностью за внимание и надеждой на ответ. Ворон |
|
|
Дата: Июн 17, 2003 15:17:14 а что у нас в DX при делении лежит... |
|
|
Дата: Июн 17, 2003 15:46:23 ***а что у нас в DX при делении лежит...*** 000ah... Обнулил.. Ошибка исчезла. Но получаеться нечто еще более странное - в результате имеем 46 (это нормально) а после деления - 23. это уже не нормально очень хотелось бы получить 0305h... Обьясните пожалуста начинающему - 1. при чем здесь dx (дело в том что в него должен записываться остаток? как влияет то что там уже чот то лежало?) 2. почему я получаю 23. 46 же 16 речное? Как исправить? С уважением. Ворон. |
|
|
Дата: Июн 17, 2003 16:22:26 Если заглянуть в хелп от интела то можно увидеть следующее: aam: ah = al/10 al = al mod 10 aad: al = ah*10+al ah = 0 чтобы получить 305h нужно после деления использовать aam |
|
|
Дата: Июн 18, 2003 00:41:30 *** 1. при чем здесь dx *** Делимое кладется в пару регистров dx:ax... |
|
|
Дата: Июн 18, 2003 05:50:01 Raven . Т.е. не только результат разбит ... но и входные данные должны быть Совершенно справедливо. я получаю сообщение "Devide overflow" ... при чем здесь dx Т.к. в качестве делителя используется регистр BX, то в качестве делимого подразумевается пара регистров DX:AX. Overflow (переполнение) происходит когда результат деления не помещается в соответствующем регистре. В Вашем случае DX:AX / BX => 0a0700h / 2h => 657152 / 2 = 328756, что согласитесь больше чем 655535, которое может поместиться в AX. По поводу AAM и AAD и продолжение про при чем здесь dx На моей памяти Вы второй раз (первый: Вывод в видеопамять с помощью строковых ф-й.?) используете мнемонику команды в буквальном смысле. Я не знаю, почему команды AAM и AAD (также AAA и AAS) содержат after и before, но это вводит Вас в заблуждение. Afaik их (AAM и AAD) использование не зависит от того бут ли следовать да ними DIV или есть ли перед ними MUL. Рекомендую Вам достать книгу, в которой содержатся не только перечень команд, но и описание на псевдоязыке, что и как происходит с регистрами/операндами при выполнении каждой команды. Я, в качестве настольной книги, использую “В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование (в 4-х книгах)”. |
|
|
Дата: Июн 18, 2003 09:39:14 Всем большое спасибо за ответы и внимание. 2P2M: Огромное спасибо за ответ, постараюсь найти эту книгу и не доставать вас более непониманием элементарных (хотя боюсь, не всегда очевидных) вещей. С искренней благодарностью и уважением. Ворон. |
|
|
Дата: Июн 18, 2003 11:48:39 · Поправил: Four-F [ P2M: Afaik их (AAM и AAD) использование не зависит от того бут ли следовать да ними DIV или есть ли перед ними MUL. ] Не люблю крючкотворства, но эта фраза может ввести в заблуждение. Вот что написано в доке: AAM - ASCII Adjust AX After Multiply Adjusts the result of the multiplication of two unpacked BCD values to create a pair of unpacked (base 10) BCD values. The AX register is the implied source and destination operand for this instruction. The AAM instruction is only useful when it follows an MUL instruction that multi-plies (binary multiplication) two unpacked BCD values and stores a word result in the AX register. The AAM instruction then adjusts the contents of the AX register to contain the correct 2-digit unpacked (base 10) BCD result. AAD - ASCII Adjust AX Before Division Adjusts two unpacked BCD digits (the least-significant digit in the AL register and the most-significant digit in the AH register) so that a division operation performed on the result will yield a correct unpacked BCD value. The AAD instruction is only useful when it precedes a DIV instruction that divides (binary division) the adjusted value in the AX register by an unpacked BCD value. Так что при операциях с неупакованными двоично-десятичными числами очень даже важно до или после использовать эти инструкции. |
|
|
Дата: Июн 18, 2003 13:02:01 Four-F фраза может ввести в заблуждение Наверное, я "криво" сформулировал. Я имел в виду, что использовать AAM и AAD необязательно after и before MUL и DIV соответственно, а надо понимать, что делает команда. Доку я читал и не понимаю, почему там only useful. Я всегда использовал AAM и AAD так как написАл Black_mirror, т.е. так как написано в документации, например, для перевода из числа в строку и наоборот для чисел в диапазоне от 0 до 99 мне совершено не надо ни MUL ни DIV. |
|
|
Дата: Июн 18, 2003 15:39:45 · Поправил: Four-F Хе-хе. Это ты просто используешь побочный эффект или недокументированную возможность. Но Intel то их не для этого разрабатывала, а для того что в доке написано. Это народ уже потом прочухал как их еще использовать можно. Например, известный трюк для перевода шестнадцатеричной цифры в ее строковое представление: mov al, 0Fh cmp al, 10 sbb al, 69h das ; щас в al 46h, т.е. "F" Но das совсем не для этого, а для того что у Intel написано "DAS - Decimal Adjust AL after Subtraction" |
|
|
Дата: Июн 19, 2003 04:10:19 Four-F Разве то, что написАл Black_mirror недокументированно? Afaik только это и документировано. В регистре AX значение в пределах ста можно получить разными способами. Я не знаю ни каких особенностей получения такого значения при помощи команды MUL на которые опирается AAM. :( Если Вам что-либо известно поделитесь. [offtopic] Наверное, я не умею их (AAM и иже с ней) готовить. :) [/offtopic] |
|
|
Дата: Июн 19, 2003 04:11:24 Four-F Разве то, что написАл Black_mirror недокументированно? Afaik только это и документировано. В регистре AX значение в пределах ста можно получить разными способами. Я не знаю ни каких особенностей получения такого значения при помощи команды MUL на которые опирается AAM. :( Если Вам что-либо известно поделитесь. [offtopic] Наверное, я не умею их (AAM и иже с ней) готовить. :) [/offtopic] |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.062 |