Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2013, 16:21   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию div, что не так?

Доброго дня!
Код:
      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive
;#########################################################################
    .data
    divisor_8    db 10d       
    divisor_16   dw 10d     
    divisor_32   dd 10d 
;#########################################################################
    .code
start:
    mov eax, 16d
    div byte ptr [divisor_8]

    mov eax, 16d
    div word ptr [divisor_16]  ;Происходит какая-то ошибка, дальше не идет
    
    mov eax, 16d
    div dword ptr [divisor_32]
;-------------------------------------------------------------------------
end start
Отладчик замирает на div word ptr [divisor_16], дальше не идет. Я что-то не так написал или процессор не поддерживает такую инструкцию?
220Volt вне форума Ответить с цитированием
Старый 16.02.2013, 17:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.kolasc.net.ru/cdo/program...mbler/div.html
Т.е.
Код:
    mov eax, 16d
    xor edx,edx
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.02.2013, 18:12   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Код:
    mov ax, 16d
    div [divisor_8]
    xor dx,dx
    mov ax, 16d
    div [divisor_16]  ;Происходит какая-то ошибка, дальше не идет
    xor edx,edx
    mov eax, 16d
    div [divisor_32]
Mikl___ вне форума Ответить с цитированием
Старый 16.02.2013, 18:23   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Благодарю за ответы. xor dx,dx помогает, не понимаю почему (только разбираюсь с ассемблером). Не могли бы объяснить причину?
П.с. я понял что xor dx, dx обнуляет dx.
220Volt вне форума Ответить с цитированием
Старый 16.02.2013, 19:02   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не могли бы объяснить причину?
А по той ссылке почитать что я дал?
Цитата:
если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax
Поскольку перед делением ты не контролируешь значение в DX то соответственно в нем содержится какой то мусор, оставшийся от прошлых вычислений. А в купе с АХ это дает огромнейшее число, которое в свою очередь вызывает арифметическое переполнение.
Например в Ах число 10 в ДХ какое нить 1234656789
Итого: 123465678910. У процессора просто пупок развязывается когда он с такими числами пытается работать
I'm learning to live...

Последний раз редактировалось Stilet; 16.02.2013 в 19:06.
Stilet вне форума Ответить с цитированием
Старый 17.02.2013, 04:58   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А по той ссылке почитать что я дал?
Да
Цитата:
Сообщение от Stilet Посмотреть сообщение
Цитата:
если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax?
Статья ошибочна, рекомендую изучить пример под отладчиком:
Код:
      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive
;#########################################################################
    .data      
    divisor_16   dw 0fh 
    divisor_8   db 0fh       
;#########################################################################
    .code
start:
    xor edx, edx
    mov eax, 0ffh
    div byte ptr [divisor_8]

    xor edx, edx
    mov eax, 0ffffh
    div word ptr [divisor_16]

    mov edx, 0ffh
    mov eax, 0ffh
    div word ptr [divisor_16]

;-------------------------------------------------------------------------
end start

Последний раз редактировалось 220Volt; 17.02.2013 в 05:05.
220Volt вне форума Ответить с цитированием
Старый 17.02.2013, 05:20   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

220Volt
Цитата:
Статья ошибочна, рекомендую изучить пример под отладчиком
и чем же справочник Юрова-Хорошенко тебе не угодил? и что нового можно увидеть в отладчике?
Код:
	xor edx, edx <-- для чего? делится содержимое ТОЛЬКО ах на содержимое divisor_8
	mov eax, 0ffh
	div byte ptr [divisor_8]; FF/F=11h в al=11h остаток ah=0
	xor edx, edx <-- здесь можно делать xor dx,dx -- делим содержимое dx:ax на divisor_16
	mov eax, 0ffffh <-- здесь можно mov ax,0ffffh
	div word ptr [divisor_16]; FFFF/F=1111h в ax =1111h остаток dx=0
всё в соответствии с тем, что написано в справочнике
  • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
  • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
  • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.
Код:
    mov edx, 0ffh
    mov eax, 0ffh
    div word ptr [divisor_16]; содержимое dx:ax на divisor_16
делим на калькуляторе FF00FF/F=11.0011h получили число больше, чем может войти в 16-ти разрядный регистр АХ — в результате переполнение и, как написал Stilet "У процессора просто пупок развязывается когда он с такими числами пытается работать" к этому справочнику не хватает строк, которые есть у другого классика по ассемблеру — Питера Абеля
  • если делитель размером в байт, то делитель не должен быть больше или равен содержимому регистра AH;
  • если делитель размером в слово, то делитель не должен быть больше или равен содержимому регистра DX;
  • если делитель размером в двойное слово, то делитель не должен быть больше или равен содержимому регистра EDX.
ситуация излечивается следующим образом
Код:
.data
divisor_32   dd 0fh
.code
	mov edx, 0
	mov eax, 0ff00ffh
	div dword ptr [divisor_32]; FF00FF/0F=110011h частное EAX=110011h остаток EDX=0

Последний раз редактировалось Mikl___; 17.02.2013 в 05:56.
Mikl___ вне форума Ответить с цитированием
Старый 17.02.2013, 05:50   #8
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

220Volt, с индукцией у Вас явно нелады.
vadimych вне форума Ответить с цитированием
Старый 17.02.2013, 07:03   #9
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Mikl___
Если вас не затруднит, покажите ситуацию, когда делимое находится в паре ригистров ax и dx (с корректным завершением).
220Volt вне форума Ответить с цитированием
Старый 17.02.2013, 09:22   #10
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Я понял, был не прав – статья верна. Спасибо за ответы
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что нужно делать чтобы высота div зависила то дочурного div? Duddu HTML и CSS 2 25.04.2012 21:23
Как вывести со страницы определенный <div id="">то что вывести</div> makar3000 PHP 6 11.08.2011 12:56
Что-то не так в программе...не пойму что Karina_Vamp Помощь студентам 5 24.12.2010 21:06