Поиск:

Ответ в темуСоздание новой темы Создание опроса
> деление чисел 
:(
    Опции темы
denks
Дата 19.8.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Здравствуйте. Решил начать изучение асма с простейших математических операций. Разобрал операции add,sub,imul,shl. Вот возникла небольщая проволочка с оператором div (деление). Помогите разобраться новичку. На базе вот этого кода пожалуйста. Здесь складываются два числа. Мне надо разделить. Спасибо.
Код

.386    
.model flat,stdcall    
option casemap:none    
include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
.data   
dwNumber1 = 43 ; первое число ; можно dwNumber1 dd 43
dwNumber2 = 15 ; второе число ;можно dwNumber2 dd 15
dwResult dd 0 ; результат сложения
szText db 3 dup(0)   ;0,0,0 - на 1 больше чем кол-во симоволов в результирующем числе
zcaption db "результат сложения",0
szFormat db '%d',0 ; %d - для типа integer
;////////////////////////////////////Начало основной программы
.code
start:
;///////////////////////////////////
mov eax,dwNumber1 ; кладём в eax первое число
add eax,dwNumber2 ; добавляем к числу которое в eax второе число
mov dwResult,eax ; dwResult = eax
invoke wsprintf, ADDR szText, ADDR szFormat, dwResult ; позволяет произвести форматированную запись в буфер последовательности символов и значений аргументов
invoke MessageBox, 0, ADDR szText, addr zcaption, MB_OK
invoke ExitProcess, 0
    
end start



PM MAIL   Вверх
sgi1981
Дата 19.8.2006, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Цитата(denks @ 19.8.2006,  20:39)
Здравствуйте. Решил начать изучение асма с простейших математических операций. Разобрал операции add,sub,imul,shl. Вот возникла небольщая проволочка с оператором div (деление). 

Код

.386    
.model flat,stdcall    
option casemap:none    
include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\user32.inc
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
.data   
dwNumber1 = 43 ; первое число ; можно dwNumber1 dd 43
dwNumber2 = 15 ; второе число ;можно dwNumber2 dd 15
dwResult dd 0 ; результат сложения
szText db 3 dup(0)   ;0,0,0 - на 1 больше чем кол-во симоволов в результирующем числе
zcaption db "результат сложения",0
szFormat db '%d',0 ; %d - для типа integer
;////////////////////////////////////Начало основной программы
.code
start:
;///////////////////////////////////
mov eax,dwNumber1 ; кладём в eax первое число
xor edx,edx;обнуляем старшую половину делимого
div dwNu[Bmber2 ; делим число, хранящееся в паре edx:eax на dwNumber2
mov dwResult,eax ; dwResult = eax - целая часть результата (остаток от деления в edx - не трогаем)
invoke wsprintf, ADDR szText, ADDR szFormat, dwResult ; позволяет произвести форматированную запись в буфер последовательности символов и значений аргументов
invoke MessageBox, 0, ADDR szText, addr zcaption, MB_OK
invoke ExitProcess, 0
    
end start


Алгоритм выполнения операции беззнакового деления div.
Если делитель размером в байт, то делимое должно быть изначально в регистре ax. После деления div r8(m8) - частное помещается в al, остаток - в ah.

Если делитель размером в слово, то делимое должно быть изначально в паре регистров dx:ax, причем младшая часть делимого находится в ax. После деления div r16(m16) - частное помещается в ax, остаток - в dx. 

Если делитель размером в двойное слово, то делимое должно быть изначально в паре регистров edx:eax, причем младшая часть делимого находится в eax. После деления div r32(m32) - частное помещается в eax, остаток - в edx. 

При выполнении операции деления возможно возникновение исключительной ситуации 0 - ошибка деления. Эта ситуация возбуждается в одном из двух случаяев: делитель равен 0 или частное слишком велико для его размещения в регистрах eax/ax/al.

Важно.
Для деления чисел со знаком используется команда idiv
Алгоритм работы её аналогичен.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
denks
Дата 19.8.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Спасибо большое.
PM MAIL   Вверх
denks
Дата 20.8.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



Ещё вопрос. Компилирую приведённый код, получаю ошибку компилятора
error A2001 : immediate operand not allowed
Подскажите пожалуйста, что нужно подправить. Спасибо.

Добавлено @ 10:20 
Спасибо, уже разобрался. Нужно заменить
dwNumber1 = 43
dwNumber2 = 15
--------------------------------
на dwNumber1 dd43
     dwNumber2 dd 15
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.