Поиск:

Ответ в темуСоздание новой темы Создание опроса
> !!!HELP!!!Деление на ноль, не получается проверка деления на ноль 
:(
    Опции темы
Siborn
Дата 18.12.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



помогите сделать, чтобы при делении шла проверка на деление на ноль и, если делится на ноль, чтобы выходило сообщение о том, что на ноль делить нельзя


вот код

m4:
cmp al,'/' ;сравнение al со знаком /
jne menu ;если не равно, то переход на menu
call input ;вызов процедуры ввода
mov eax,op1 ;копирование ор1 в ах
div d ;деление ах на d
mov op1,eax ;копирование ах в ор1
jmp menu ;переход на menu

PM MAIL   Вверх
Siborn
Дата 18.12.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



блин ну ктонить пажалуста....мне курсач сдавать заффтра а он не пашит (
PM MAIL   Вверх
Siborn
Дата 18.12.2005, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо за помощь smile


PM MAIL   Вверх
Леша
Дата 18.12.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 7.11.2004
Где: Менск, Беларуская НР

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



Код

;---------------------------------
data    segment    para public 'data'
message    db    "The division error was occured$"
data    ends

stk    segment    stack
    db    256 dup ('?')
stk    ends

code    segment    para public 'code'
main    proc
    assume    cs:code,ds:data,ss:stk
    mov    ax,data
    mov    ds,ax
    
    cli
    mov     ax,2500h
    lea     dx,DVROK
    int     21h
    sti

    mov    ax,1234h
    mov    dx,5678h
    mov    bx,0
    div    bx
    jmp    endim
    
DVROK:
    mov    dx,offset message    
    mov    ah,09h
    int    21h
    iret

endim:
    mov    ax,4c00h
    int    21h

main    endp
code    ends
end    main


Это сообщение отредактировал(а) Леша - 18.12.2005, 18:05
PM MAIL ICQ   Вверх
Siborn
Дата 18.12.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасиба канешна, но я уже сделал...и гораздо проще кстати

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


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Siborn, во-первых не забывай, что тебе здесь никто ничего не должен.
Во-вторых то, что курсач тебе сдавать завтра это проблема, которую ты себе создал сам.
В третьих на выходных всегда меньше народу на форуме и поэтому нечего тут ждать быстрого ответа.

И откуда твое d взялось кстати тоже не понятно...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Siborn
Дата 18.12.2005, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



cardinal
ок извини был неправ погорячился
вовторых курсач был готов неделю назад, но препод тварь сделал нам подарок на выходные - сделать коечто ещо помимо стандартного задания курсача...
втретьих странна...обычно наоборот

чтобы понять откуда d можно было глянуть в темку где весь код курсача есть
а вообще это вторая переменная на которую нужно делить

но уже ненада...уже сделал.....



вот только почемуто иногда при операциях с большиим числами он неправильно считаит (((

и при умножении 65535 на 65535 выводит результат 4294836225 но при попытке ввести это число как первую переменную выдаётся ошибка о том что это ичсло очень большое (
не подскажите в чём дело?
PM MAIL   Вверх
cardinal
Дата 18.12.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Цитата(Siborn @ 18.12.2005, 19:42)
но при попытке ввести это число как первую переменную выдаётся ошибка о том что это ичсло очень большое

Если делаешь так
Код

mov eax, 0xfffe0001

то ошибки быть не должно. То есть проверь везде, что ты с 32 разрядным регистром работаешь, а не с ax, ah или al.

Не забывай пользоваться тегами.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Siborn
Дата 18.12.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не немного по другому
но спасибо проверю везде ах и еах

PM MAIL   Вверх
Akina
Дата 18.12.2005, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(Siborn @ 18.12.2005, 14:45)
помогите сделать, чтобы при делении шла проверка на деление на ноль и, если делится на ноль, чтобы выходило сообщение о том, что на ноль делить нельзя

Что-то я вообще не понял сути вопроса... тебе нужно проверить делимое на равенство нулю? или тебе нужно INT 0 отловить (который, кстати, и при переполнении тоже...)?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Siborn
Дата 19.12.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Akina
мне нужно было сделать проверку на "деление на ноль"
тоесть если делитель ноль - то должна выводиться ошибка "на ноль делить нельзя"
но с этим я справился уже....

сейчас до завтра разрешили доделать... нужно сделать чтобы при вычитании выдавался отрицательный результат (
вот код вычитания:

Код

cmp al,'-'                                 
jne m3                                 
call input                                      
mov eax,d                                        
sub op1,eax                                                  
jmp menu 


m3 - метка следующей операции
d - (вторая переменная (которую вычитаю)
op1 - первая переменная (из которой вычитаю)

я посидел на паре подумал и вот что придумал: (только неправильно считает почиму то (

Код

cmp al,'-'                                   
jne m3                              
call input                                    
mov eax,d                                           
cmp eax,op1
jg otr
dals:
sub op1,eax                                                
jmp menu                                             
otr:
mov ah,9
lea dx,otric
int 21h
sub eax,op1
jmp menu


вот здесь я поставил проверку на то какая переменная больше и если больше вторая переменная (которую вычитаю) то нужно из неё вычесть первую

но почему то прога выводит результат саму вторую переменную с минусом (

вот весь код можете проверить (написано в фаре компилить тасмом и тлинком из паскаля):
Код

;Љ «мЄг«пв®а. ‚лЇ®«­пҐв +,-,*,/
;„«п Їа®б¬®вࠠ१г«мв в  ­г¦­® ­ ¦ вм =
;-------------------------------­ з «® бҐЈ¬Ґ­в  ¤ ­­ле-------------------------
dseg segment
.386
.model small
.stack 100h
op1 dd 0
d dd 0
osn dd 10
about db 10,13,'Calc v1.0 “¬­®¦ Ґв, ¤Ґ«Ёв, бЄ« ¤лў Ґв Ё ўлзЁв Ґв. ?Ґ а Ў®в Ґв б ®ваЁж вҐ«м­л¬Ё зЁб« ¬Ё Ё зЁб« ¬Ё б § Їпв®© ','$'
vvod db 10,13,'ўў®¤ЁвҐ ЇаЁ¬Ґа ў ўЁ¤Ґ: зЁб«®1_§­ Є ®ЇҐа жЁЁ_зЁб«®2_§­ Є а ў­®',10,13,'$'
s db 10,13,'нв® ­Ґ зЁб«®',10,13,'$'
gr db 10,13,'нв® зЁб«® ®зҐ­м Ў®«м讥',10,13,'$'
n db 10,13,'¤Ґ«Ёвм ­  ­®«м ­Ґ«м§п','$'
otric db '-','$'
dey db 0
dseg ends
;---------------------------­ з «® бҐЈ¬Ґ­в  Є®¤ -------------------------------
code segment use16
assume cs:code, ds:dseg
 ;гбв ­®ўЄ  бўп§Ё ¬Ґ¦¤г бҐЈ¬Ґ­в ¬Ё Ё бҐЈ¬Ґ­в­л¬Ё аҐЈЁбва ¬Ё
start:
mov ax,dseg
mov ds,ax

mov ah,9
lea dx,about
int 21h

mov ah,9                                       ;бва®Є  б ®Ўа §ж®¬ ўў®¤  ЇаЁ¬Ґа 
lea dx,vvod
int 21h

call input                                               ;ўў®¤ ЇҐаў®Ј® ®ЇҐа ­¤ 
mov eax,d                                                       ;Ё § ­ҐбҐ­ЁҐ ҐЈ®
mov op1,eax                                                    ;ў ЇҐаҐ¬Ґ­­го ®а1

menu:
mov al,dey                                        ;ў al Є®ЇЁа㥬 б®¤Ґа¦Ё¬®Ґ dey
cmp al,'='                                    ;ба ў­Ґ­ЁҐ al б® §­ Є®¬ =
jne m1                                 ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  m1
call output                                      ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
mov ah,7h                                             ;®¦Ё¤ ­ЁҐ ­ ¦ вЁпя 
int 21h                                                        ;Є« ўЁиЁ
mov ah,4ch                                                 ;ўл室 ў DOS
int 21h

m1:
cmp op1,65535
jg gran
cmp al,'+'                                    ;ба ў­Ґ­ЁҐ al б® §­ Є®¬ +
jne m2                                 ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  m2
call input                                       ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
mov eax,d                                            ;Є®ЇЁа®ў ­ЁҐ d ў  е 
add op1,eax                                                  ;op1=op1+ax
jmp menu                                               ;ЇҐаҐе®¤ ­  menu

m2:
cmp op1,65535
jg gran
cmp al,'-'                                    ;ба ў­Ґ­ЁҐ  1 б® §­ Є®¬ -
jne m3                                 ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  m3
call input                                       ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
mov eax,d                                            ;Є®ЇЁа®ў ­ЁҐ d ў  е
cmp eax,op1
jg otr
dals:
sub op1,eax                                                  ;op1=op1-ax
jmp menu                                               ;ЇҐаҐе®¤ ­  menu
otr:
mov ah,9
lea dx,otric
int 21h
sub eax,op1
jmp menu

m3:
cmp op1,65535
jg gran
cmp al,'*'                                    ;ба ў­Ґ­ЁҐ al б® §­ Є®¬ *
jne m4                                 ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  m4
call input                                       ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
mov eax,op1                                        ;Є®ЇЁа®ў ­ЁҐ ®а1 ў  е
mul d                                                ;г¬­®¦Ґ­ЁҐ  е ­  d
mov op1,eax                                        ;Є®ЇЁа®ў ­ЁҐ  е ў ®а1
jmp menu                                               ;ЇҐаҐе®¤ ­  menu

m4:
cmp op1,65535
jg gran
cmp al,'/'                                    ;ба ў­Ґ­ЁҐ al б® §­ Є®¬ /
jne menu                             ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  menu
call input 
sub edx,edx                                      ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
mov eax,op1                                        ;Є®ЇЁа®ў ­ЁҐ ®а1 ў  е
cmp d,0                         ;ба ў­Ґ­ЁҐ Є®¤  бЁ¬ў®«  б Є®¤®¬ ­г«пя
je nolik
div d                                                  ;¤Ґ«Ґ­ЁҐ  е ­  d
mov op1,eax                                        ;Є®ЇЁа®ў ­ЁҐ  е ў ®а1
jmp menu                                               ;ЇҐаҐе®¤ ­  menu
nolik:

mov ah,9
lea dx,n
int 21h
jmp menu
;------------------------------Їа®жҐ¤гал---------------------------------------
;----------------------------Їа®жҐ¤га  ўў®¤ -----------------------------------
input proc                                               ;Їа®жҐ¤га  ўў®¤  зЁб« 
mov d,0                                                   

begin:
mov ah,1h                             ;®¦Ё¤ ­ЁҐ ­ ¦ вЁп Є« ўЁиЁ Ё ўлў®¤ 
int 21h         ;ўўҐ¤с­­®Ј® бЁ¬ў®«  ­  нЄа ­, ў  1 Ї®«гз Ґ¬ Є®¤ бЁ¬ў®« 
cmp al,'='
jne h
mov dey,al
ret

h:
cmp al,'0'                         ;ба ў­Ґ­ЁҐ Є®¤  бЁ¬ў®«  б Є®¤®¬ ­г«пя
jge dal1                     ;Ґб«Ё Ў®«м襠Ё«Ё а ў­®, в® ЇҐаҐ©вЁ ­  dal1
mov dey,al
ret

dal1:
cmp al,'9'                            ;ба ў­Ґ­ЁҐ Є®¤  бЁ¬ў®«  б Є®¤®¬ 9
jle dal2                     ;Ґб«Ё ¬Ґ­м襠Ё«Ё а ў­®, в® ЇҐаҐе®¤ ­  dal2
mov ah,9h                                                         ;ўлў®¤ бва®ЄЁ
lea dx,s                                                  ;б б®®ЎйҐ­ЁҐ¬ ® ўў®¤Ґ
int 21h                                                  ;­Ґ¤®ЇгбвЁ¬®Ј® бЁ¬ў®« 
jmp begin                                                     ;ЇҐаҐе®¤ ­  begin

dal2:
sub al,'0'    ;ўлзЁв ­ЁҐ Ё§ Є®¤  бЁ¬ў®«  Є®¤ ­г«п, зв®Ўл Ї®«гзЁвм зЁб«®
cbw                                                ;а биЁаҐ­ЁҐ al ¤® ax
mov esi,eax                                        ;б®еа ­Ґ­ЁҐ зЁб«  ў si
mov eax,d    ;Є®ЇЁа®ў ­ЁҐ ў  е зЁб« , Є®в®а®Ґ еа ­Ёвбп ў d (б­ з «  = 0)
mul osn                                             ;г¬­®¦Ґ­ЁҐ  е ­  10
jnc dal3                     ;Ґб«Ё ­Ґ Ўл«® ЇҐаҐ­®б , в® ЇҐаҐе®¤ ­  dal3

gran:
mov ah,9h                                                         ;ўлў®¤ бва®ЄЁ 
lea dx,gr                                                  ;б б®®ЎйҐ­ЁҐ ® ўў®¤Ґ
int 21h
mov ah,7h
int 21h                                                 ;б«ЁиЄ®¬ Ў®«ми®Ј® зЁб« 
mov ah,4ch                                                     ;ўл室 ў ¤®б DOS
int 21h

dal3:
add eax,esi                ;¤®Ў ў«Ґ­ЁҐ Є г¦Ґ ўўҐ¤с­­®¬г зЁб«г ­®ў®© жЁдал
mov d,eax                               ;§ ­ҐбҐ­ЁҐ Ї®«г祭­®Ј® зЁб«  ў d
jmp begin                                      ;ЇҐаҐе®¤ ­  ­ з «® ўў®¤ 
input endp
;-----------------------------Їа®жҐ¤га  ўлў®¤ ---------------------------------
output proc
mov eax,op1                                      ;Є®ЇЁа®ў ­ЁҐ б®¤Ёа¦Ё¬®Ј® d ў  е
mov cx,0                                                          ;®Ў­г«Ґ­ЁҐ бе

out_dec:
mov dx,0                                                  ;®Ў­г«Ґ­ЁҐ dx
div osn                                   ;¤Ґ«Ґ­ЁҐ б®¤Ґа¦Ё¬®Ј® dx ­  10
push dx                                           ;ᮤҐа¦Ё¬®Ґ dx ў бвнЄ
inc cx                                                   ;㢥«ЁзҐ­ЁҐ cx
cmp eax,0                                              ;ба ў­Ґ­ЁҐ ax б 0
jne out_dec                       ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  out_dec

dmet:
pop dx                                           ;ᮤҐа¦Ё¬®Ґ бвнЄ  ў dx 
add dl,'0'                                  ;ЇаЁЎ ў«Ґ­ЁҐ Є dl Є®¤  ­г«пя
mov ah,2h                                       ;ўлў®¤ бЁ¬ў®«  ­  нЄа ­
int 21h
loop dmet                                                    ;жЁЄ« dmet
ret
output endp
code ends
end start
end


з.ы. комменты блин не видно тут (
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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