Пишу калькулятор с графическим интерфейсом под ДОС c использованием мыши. Компилирую TASM 3.1 (пакет ALAB, cooтветсвенно Turbo Debugger). Используется сопроцессор. Такая проблема. Создал процедуру обработки ошибок(errcheck в коде) (например деление на 0). Обработка основана на получении слова состояния сопроцессора(fstsw) и проверки 3 бита слова на равенство 1(как раз для примера деления на 0). Для теста поставил если флаг ze=1 то выход из программы. Т.е. если пользователь поделил на 0, программа завершается. Компилирую екзешник. В режиме отладки по шагам все работает как надо, проверяется флаг, выходит из программы. При запуске ехе программа никак не реагирует на деление на 0. Не могу понять в чем проблема.... Код (Text): .486p model use16 huge .stack 100h .data x dw 0 ;koordinaty lev verxnego ugla dlya knopok y dw 0 ;koordinaty lev verxnego ugla dlya knopok lenx dw 0 ; dlina knopki po x leny dw 0 ; dlina knopki po y xx db 0 ;posiciya x dlya vyvoda simvola na knopke yy db 0 ;posiciya y dlya vyvoda simvola na knopke bnflag db 0 ; flag knopki = 4 esli popali ; mozhna ubrat' mousex dw 0;koordinaty x pri nazhatii myshki mousey dw 0;koordinaty y pri nazhatii myshki floatfl db 0;flag vvoda = 1 esli byla nazhata "." num dw 0 ;identifikator nazhatoi klavishi bttn db 0;hranit simvol, izobrazhennyy na klavishe ten dw 10;dlya vychisleniya desyatyx dolei op db 0 ; zdes' hranitsa vypolnyaemoe deystvie divide db 0;kol-va nazhatiy klavishy / mult db 0;kol-va nazhatiy klavishy * minus db 0;kol-va nazhatiy klavishy - plus db 0;kol-va nazhatiy klavishy + equal db 0;kol-va nazhatiy klavishy = sw dw 0;status word errpos db 00h trash dd 0;peremennaya dlya sbrosa nenuzhnyx chisel tmp dd 0 tmp2 dd 0 errmsg1 db 'Dividing by zero$',0Ah,0Dh .code start: mov ax,@data mov ds,ax mov ax,0012h int 10h finit fldz mov ax,1 int 33h call intrfc c: call onclick call errcheck mov bnflag,0 jmp c exit: mov ax,4C00h int 21h intrfc proc ;rasstoyanie mezhdu knopkami po y 12 ;rasstoyanie mezhdu knopkami po x 12 ;knopka 20x20 ;rasstoyanie mezhdu simvolami po xx 02h ;rasstoyanie mezhdu simvolami po yy 04h ;----1-----; mov bttn,'1' mov x,60 mov y,60 mov xx,04h mov yy,08h mov lenx,20 mov leny,20 call kvadrat call button ;----4-----; mov bttn,'4' mov x,60 mov y,92 mov xx,06h mov yy,08h mov lenx,20 mov leny,20 call kvadrat call button ;----7------; mov bttn,'7' mov x,60 mov y,124 mov xx,08h mov yy,08h mov lenx,20 mov leny,20 call kvadrat call button ;----2------; mov bttn,'2' mov x,92 mov y,60 mov xx,04h mov yy,0Ch mov lenx,20 mov leny,20 call kvadrat call button ;----5------; mov bttn,'5' mov x,92 mov y,92 mov xx,06h mov yy,0Ch mov lenx,20 mov leny,20 call kvadrat call button ;----8------; mov bttn,'8' mov x,92 mov y,124 mov xx,08h mov yy,0Ch mov lenx,20 mov leny,20 call kvadrat call button ;----3------; mov bttn,'3' mov x,124 mov y,60 mov xx,04h mov yy,10h mov lenx,20 mov leny,20 call kvadrat call button ;----6------; mov bttn,'6' mov x,124 mov y,92 mov xx,06h mov yy,10h mov lenx,20 mov leny,20 call kvadrat call button ;----9------; mov bttn,'9' mov x,124 mov y,124 mov xx,08h mov yy,10h mov lenx,20 mov leny,20 call kvadrat call button ;----0------; mov bttn,'0' mov x,60 mov y,156 mov xx,0Ah mov yy,08h mov lenx,20 mov leny,20 call kvadrat call button ;----.------; mov bttn,'.' mov x,92 mov y,156 mov xx,0Ah mov yy,0Ch mov lenx,20 mov leny,20 call kvadrat call button ;----=------; mov bttn,'=' mov x,124 mov y,156 mov xx,0Ah mov yy,10h mov lenx,20 mov leny,20 call kvadrat call button ;----+------; mov bttn,'+' mov x,156 mov y,60 mov xx,04h mov yy,14h mov lenx,20 mov leny,20 call kvadrat call button ;----minus------; mov bttn,'-' mov x,156 mov y,92 mov xx,06h mov yy,14h mov lenx,20 mov leny,20 call kvadrat call button ;----*------; mov bttn,'*' mov x,156 mov y,124 mov xx,08h mov yy,14h mov lenx,20 mov leny,20 call kvadrat call button ;----/------; mov bttn,'/' mov x,156 mov y,156 mov xx,0Ah mov yy,14h mov lenx,20 mov leny,20 call kvadrat call button ;-----X------; mov bttn,'X' mov x,580 mov y,28 mov xx,02h mov yy,49h mov lenx,20 mov leny,20 call kvadrat call button ret intrfc endp button proc ;-------vyvodim symvol(bttn) na knopku---------------------; ;v xx -> stroka po x ;v yy -> stolbec po y ;v bttn -> simvol na knopke pusha mov ah,02h ; ustanavlivaet pozic kursora na dx mov dh,xx mov dl,yy int 10h mov ah,0Ah ; vyvod simvola v graf rezhime mov al,bttn ;simvol mov bl,0Fh ;video atribut mov cx,1 ;kol-vo int 10h popa ret button endp kvadrat proc ;-------risuem kvadrat knopki, gde x&y koordinaty levogo verxnego ugla----; ;v lenx -> dlina po x knopki ;v leny -> dlina po y knopki ;v x -> levaya verxnyaa x koordinata ;v y -> levaya verxnyaa y koordinata pusha mov bx,lenx add bx,x mov lenx,bx mov bx,leny add bx,y mov leny,bx mov dx,y mov cx,x mov ax,0C0Fh risX1: int 10h inc cx cmp cx,lenx jb risX1 mov cx,x mov dx,leny risX2: int 10h inc cx cmp cx,lenx jb risX2 mov cx,x mov dx,y risY1: int 10h inc dx cmp dx,leny jb risY1 mov cx,lenx mov dx,y risY2: int 10h inc dx cmp dx,leny jb risY2 mov cx,lenx mov dx,leny int 10h popa ret kvadrat endp numeric proc cmp floatfl,1 jne intinp call flinppr jmp n_end intinp: call intinppr n_end: ret numeric endp flinppr proc ret flinppr endp intinppr proc fimul ten fiadd num ret intinppr endp onclick proc far ;poluchenie koordinat myshi pri schelchke pusha mov ax,0005h mov bx,0 int 33h cmp ax,00000001b jne c mov mousex,cx mov mousey,dx call coords popa ret onclick endp coords proc far ;v mousex - x koord-ta click ;v mousey - y koord-ta click l1: ;------1---------; mov bnflag,0 cmp mousex,60d jl l2 inc bnflag cmp mousex,80d jg l2 inc bnflag cmp mousey,60d jl l2 inc bnflag cmp mousey,80d jg l2 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 ;sbros flagov operaciy mov num,1 call numeric ;procedura opredelyaushaya vvod cifr jmp crdex l2: ;------2---------; mov bnflag,0 cmp mousex,92d jl l3 inc bnflag cmp mousex,112d jg l3 inc bnflag cmp mousey,60d jl l3 inc bnflag cmp mousey,80d jg l3 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,2 call numeric jmp crdex l3: ;------3---------; mov bnflag,0 cmp mousex,124d jl l4 inc bnflag cmp mousex,144d jg l4 inc bnflag cmp mousey,60d jl l4 inc bnflag cmp mousey,80d jg l4 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,3 call numeric jmp crdex l4: ;------4---------; mov bnflag,0 cmp mousex,60d jl l5 inc bnflag cmp mousex,80d jg l5 inc bnflag cmp mousey,92d jl l5 inc bnflag cmp mousey,112d jg l5 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,4 call numeric jmp crdex l5: ;------5---------; mov bnflag,0 cmp mousex,92d jl l6 inc bnflag cmp mousex,112d jg l6 inc bnflag cmp mousey,92d jl l6 inc bnflag cmp mousey,112d jg l6 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,5 call numeric jmp crdex l6: ;------6---------; mov bnflag,0 cmp mousex,124d jl l7 inc bnflag cmp mousex,144d jg l7 inc bnflag cmp mousey,92d jl l7 inc bnflag cmp mousey,112d jg l7 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,6 call numeric jmp crdex l7: ;------7---------; mov bnflag,0 cmp mousex,60d jl l8 inc bnflag cmp mousex,80d jg l8 inc bnflag cmp mousey,124d jl l8 inc bnflag cmp mousey,144d jg l8 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,7 call numeric jmp crdex l8: ;------8---------; mov bnflag,0 cmp mousex,92d jl l9 inc bnflag cmp mousex,112d jg l9 inc bnflag cmp mousey,124d jl l9 inc bnflag cmp mousey,144d jg l9 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,8 call numeric jmp crdex l9: ;------9-------; mov bnflag,0 cmp mousex,124d jl l0 inc bnflag cmp mousex,144d jg l0 inc bnflag cmp mousey,124d jl l0 inc bnflag cmp mousey,144d jg l0 inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,9 call numeric jmp crdex l0: ;------0---------; mov bnflag,0 cmp mousex,60d jl lclose inc bnflag cmp mousex,80d jg lclose inc bnflag cmp mousey,156d jl lclose inc bnflag cmp mousey,176d jg lclose inc bnflag mov divide,0 mov mult,0 mov minus,0 mov plus,0 mov num,0 call numeric jmp crdex lclose: ;------X---------; mov bnflag,0 cmp mousex,580d jl lplus inc bnflag cmp mousex,600d jg lplus inc bnflag cmp mousey,28d jl lplus inc bnflag cmp mousey,48d jg lplus inc bnflag mov num,0 jmp exit lplus: ;------+---------; mov bnflag,0 cmp mousex,156d jl lequal inc bnflag cmp mousex,176d jg lequal inc bnflag cmp mousey,60d jl lequal inc bnflag cmp mousey,80d jg lequal inc bnflag mov mult,0 mov divide,0 mov minus,0 mov equal,0;sbrasyvaem schetchik ravno mov op,'+' inc plus cmp plus,1 jne crdex fldz jmp crdex lequal: ;------=-------; mov bnflag,0 cmp mousex,124d jl lminus inc bnflag cmp mousex,144d jg lminus inc bnflag cmp mousey,156d jl lminus inc bnflag cmp mousey,176d jg lminus inc bnflag mov minus,0 mov plus,0 mov mult,0 add equal,1 cmp equal,1 jne eq_1 fxch st(1) eq_1: cmp op,'+' jne eq_2 fadd st,st(1) call clean eq_2: cmp op,'-' jne eq_3 fsub st,st(1) call clean eq_3: cmp op,'*' jne eq_4 fmul st,st(1) call clean eq_4: cmp op,'/' jne crdex fdiv st,st(1) call clean jmp crdex lminus: ;------minus-------; mov bnflag,0 cmp mousex,156d jl lmult inc bnflag cmp mousex,176d jg lmult inc bnflag cmp mousey,92d jl lmult inc bnflag cmp mousey,112d jg lmult inc bnflag mov mult,0 mov divide,0 mov plus,0 mov equal,0;sbrasyvaem schetchik ravno mov op,'-' inc minus cmp minus,1 jne crdex fldz jmp crdex lmult: ;------*-----; mov bnflag,0 cmp mousex,156d jl ldivide inc bnflag cmp mousex,176d jg ldivide inc bnflag cmp mousey,124d jl ldivide inc bnflag cmp mousey,144d jg ldivide inc bnflag mov plus,0 mov minus,0 mov divide,0 mov equal,0;sbrasyvaem schetchik ravno mov op,'*' inc mult cmp mult,1 jne crdex fldz jmp crdex ldivide: ;------/-----; mov bnflag,0 cmp mousex,156d jl lnext inc bnflag cmp mousex,176d jg lnext inc bnflag cmp mousey,156d jl lnext inc bnflag cmp mousey,176d jg lnext inc bnflag mov plus,0 mov minus,0 mov mult,0 mov equal,0;sbrasyvaem schetchik ravno mov op,'/' inc divide cmp divide,1 jne crdex fldz jmp crdex lnext: crdex: ret coords endp clean proc ;ochistka st(2) fxch st(2) fstp trash fxch st(1) ret clean endp errcheck proc far ;procedura obrabotki oshibok fstsw sw mov ax,sw and ax,100b cmp ax,100b jne err_1 jmp exit err_1: ret errcheck endp end start
в ДОСе не запускал ибо лень было искать драйвер мыши. Скопировал код проверки status word сопроцессора в отдельную программу и имитировал деление на 0, в результате работали и ехе файл и пошаговый режим. Здесь мне кажется дело в другом.
Не совсем понял про программу и иммитацию. НО мне кажется дело как раз в обработчке. У ВЫНь свой в досе совсем все по-другому. Т.е. дело в оси. Точно ответить я не могу. Нужно знать как на это сработает обработчик ВЫНь, а как доса (хотя не знаю какие там в досе обработчики...). Хотя, м\б я вообще охинею несу) А, к стати, м\б дело в том, что там другой код ошибки и флаг просто тупо не выставляется. В отладчике-то его б\з проблем поставить можно (что ты и сделал как я понял). А при исполнении программы не срабатывает- код другой
/offtop Aspire Код (Text): Какое интерсное сокращение б\з :/ ГГ. Это как раз один из тех случаев, когда с головой ушел в форум. А ведь я это сообщение 3 раза прочел и 2 раза отредактировал и все равно не заметил)