Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > !!!HELP!!!Деление на ноль


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


вот код

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

Автор: Siborn 18.12.2005, 14:58
блин ну ктонить пажалуста....мне курсач сдавать заффтра а он не пашит (

Автор: Siborn 18.12.2005, 15:34
спасибо за помощь smile


Автор: Леша 18.12.2005, 18:04
Код

;---------------------------------
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

Автор: Siborn 18.12.2005, 19:44
спасиба канешна, но я уже сделал...и гораздо проще кстати

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

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

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

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

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



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

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

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

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

mov eax, 0xfffe0001

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

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

Автор: Siborn 18.12.2005, 22:32
не немного по другому
но спасибо проверю везде ах и еах

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

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

Автор: Siborn 19.12.2005, 11:39
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


з.ы. комменты блин не видно тут (

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)