Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с делением  (Прочитано 14063 раз)
0 Пользователей и 1 Гость смотрят эту тему.
kvych
Гость
« : 23-08-2008 07:59 » 

Привет! Если не в лом, объясните, почему ета прога на команде DIV бросает исключение "unknown software exception (0xc0000095)"
Я только начинаю изучать ассемблер...

.386
.model   flat,stdcall
.data
fg dd 10
htable db "0123456789abcdef",0
.code
start:
mov eax, 20000
mov ebx, fg
div ebx     ;<------
ret
end start

Ассемблер и линкер MASM32. Отладчик - OllyDbg
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-08-2008 09:34 » 

А это программа?
Вроде бы синтаксис после .code д.б. примерно:
main PROC
; здесь текст программы
exit
main ENDP
END main
А вообще-то лучше читать первоисточники. Могу порекомендовать Кип Р. Ирвин "Язык ассемблера для процессоров INTEL".
Записан
kvych
Гость
« Ответ #2 : 23-08-2008 09:43 » 

Basurman:Ну да, ето не прога, я просто изучаю команди. Синтаксис у меня нормальний, всьо работает, вот только именно DIV и IDIV вызывают исключение.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 23-08-2008 10:51 » 

А ты уверен, что падает именно там? Единственное исключение, которое может произойти это деление на нуль, насколько я знаю. Если у тебя не бракованный процессор, то скорее всего иши ошибку в другом месте. Например на этом mov ebx, fg или после этого ret
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 23-08-2008 19:03 » 

...kvych..., как должен завершаться процесс в Win32? Разве простым возвратом управления? Изучи этот момент.
И еще совет: когда читаешь "переменную" используй синтаксис со скобками - это понятнее и читабельнее. Кстати, такие короткие глобальные имена - тоже ужас непростительный.
Код:
mov ebx, [fg]

Basurman, вовсе не нужно оформлять как процедуру - это не обязательно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-08-2008 12:41 » 

Я вообще то хотел подсказать - где и что искать.
Ну дам более конкретно:
1. Поскольку используется "div ebx", а делимое двойное слово - не мешало бы добавить "xor edx, edx" или "mov edx, 0". Отсутствие этого, исключения не вызовет, но результат деления непредсказуем - поскольку неизвестно содержимое edx (делимое находится в паре edx:eax). Т.е в данном случае частное может вдруг быть более 2000;
2. В тексте программы должно присутствовать следующее:
  2.1. Exitprocess Proto, dwExitcode:Dword
  2.2. Invoke Exitprocess, 0
       или
       xor eax, eax
       push eax
       call Exitprocess
  В каком порядке и в каких местах, автор темы разберётся сам. Это вроде бы и должно устранить указанное исключение, если он конечно привёл текст программы, а не извлечения из оного.

To RXL: ну конечно не обязательно. Просто если придерживаться определённого стиля, количество ошибок весьма сильно сократится. Правда побочным эффектом может быть увеличение кода.
« Последнее редактирование: 24-08-2008 18:25 от Basurman » Записан
kvych
Гость
« Ответ #6 : 24-08-2008 13:22 » 

Как я понял, для команды DIV тот регистр, куда будет сбрасыватся остаток (ah, dx или edx) надо первоначально обнулить.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 24-08-2008 13:45 » 

...kvych..., внимательно читай мануал по командам:

div bl ; использует AX
div bx ; использует DX:AX
dib ebx ; использует EDX:EAX

AX, DX:AX и EDX:EAX выступаю как делимое, так и приемник результата: частное помещается в первую половину, остаток - во вторую половину.

div ebx
; EAX = EDX:EAX / EBX
; EDX = EDX:EAX mod EBX
« Последнее редактирование: 24-08-2008 13:47 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 10-11-2008 10:05 » 

...kvych..., прогони код под отладчиком и посмотри где проблемы!!!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-11-2008 12:11 » 

Ребята, август месяц... Зачем было топик поднимать?
Он уже или нашел решение, или забил.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 10-11-2008 15:03 » new

RXL, Блин, точно Улыбаюсь Не обратил внимание на число! Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines