Assm - Деление
|
Старожил Сообщения: 361 |
Профиль | Отправить PM | Цитировать idiv bx => Error: Division by zero
(ax = 65535 [т.е. -1], bx = 1) В чём проблема? Почему не получается разделить -1 на 1? Команда idiv bx работает так: ax = ax div bx dx = ax mod bx Получается, что не совсем так? |
|
Отправлено: 21:58, 10-04-2010 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать ManHack, а можно весь кусок кода?
Операция idiv документация Intel Все, нашел ошибку! При делении на BX(а BX - это слово) Операнд(т.е. делимое) должно быть двойным словом. Т.е. находится в DX:AX Тогда будет возможно деление в пределах -32,768 / +32,767 Что содержит DX до начала операции? Кусок из Питера Абеля Что за среда разработки? Фраза "деление на ноль" все же настораживает. Т.е. ИМХО сигнализируется неправильная ошибка. |
------- Отправлено: 06:36, 11-04-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 361
|
Профиль | Отправить PM | Цитировать var a, b, c, ans : integer; begin readln(a, b, c); asm mov bx, b mov ax, c imul bx neg ax mov cx, a add ax, cx mov cx, c sub bx, cx idiv bx mov ans, ax end; writeln('Value = ', ans); readln; end. Среда Turbo Assembler (ассемблер для Intel-совместимых, втроенный в Turbo Pascal 7.0) Т.е. всегда делится содержимое пары DX:AX на BX? Или в каких-то случаях делится только содержимое AX на BX? (в каких?) А каким образом вообще производится деление пары? Допустим, в AX у меня записано 12, а в DX записано 7, что тогда будет в BX? А что будет в BX, если в DX записано 65535, а в AX, допустим, 3? Мне просто интересно как формируется одно число из этой пары DX:AX. А ещё я видел, что некоторые пишут три регистра после idiv. Например, так: idiv eax, eax, ah У меня среда ругается, если я записываю больше одного слова. Как объясняется этот феномен? |
Отправлено: 23:56, 11-04-2010 | #3 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать Среда разработки Lazarus. Все выполнилось не чихнув.
Давай смотреть входные данные. BTW, а проще конструкции задать нельзя? Больно много действий перед idiv, что усложняет подготовку тестов. program Project1; {$mode objfpc}{$H+} uses Classes, SysUtils { you can add units after this }; var a, b, c, ans : integer; {$IFDEF WINDOWS}{$R Project1.rc}{$ENDIF} {$ASMMODE intel} begin // readln(a, b, c); a:=1;b:=2;c:=7; asm mov bx, b mov ax, c imul bx neg ax mov cx, a add ax, cx mov cx, c sub bx, cx idiv bx mov ans, ax end; end. |
------- Отправлено: 00:55, 12-04-2010 | #4 |
Старожил Сообщения: 361
|
Профиль | Отправить PM | Цитировать Моя программа призвана вычислять выражение (a - b*c)/(b - c), но достаточно разобраться как просто делить -1 на 1 (или что-то подобное), когда деление происходит пары чисел DX:AX?
И всё-таки, что насчёт конструкций вида " idiv eax, eax, ah "? Они вообще реальны? Как они работают и при каких условиях? Что-то толком про такой вариант использования idiv нигде не нашёл, ни у Юрова, ни у Абеля... |
|
Отправлено: 22:53, 12-04-2010 | #5 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Цитата ManHack:
И теперь такой вопрос: почему в наше время, когда на дворе уже вовсю разгуливает 64-битный код, народ так и норовит использовать 16-битные регистры без надлежащей необходимости? |
|
------- Отправлено: 17:07, 13-04-2010 | #6 |
Старожил Сообщения: 361
|
Профиль | Отправить PM | Цитировать Необходимость исходит в виде требований свыше ничего кроме ax, bx, cx и dx не использовать ^^
Но за код спасибо. Теперь я знаю, что мне нужна команда cwd. |
Отправлено: 23:21, 13-04-2010 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Загрузка - деление диска в Vist'e | Grizz | Microsoft Windows Vista | 11 | 23-05-2009 13:16 | |
Деление жесткого диска. | AMDell | Хочу все знать | 7 | 22-10-2007 14:00 | |
Деление сети на подосети! | Vertoletov | Сетевые технологии | 1 | 10-03-2005 16:30 | |
Деление трафика | Teo | Сетевые технологии | 1 | 13-12-2003 08:13 | |
Деление диска | Flip | Microsoft Windows 95/98/Me (архив) | 5 | 19-10-2002 20:09 |
|