В программе есть ошибки, необходимо исправить - Assembler
Формулировка задачи:
Помогите, пожалуйста, посчитать мою формулу представленную на рисунке.
В программе 7 ошибок, не знаю как их исправить.
title prim assume cs:cod, ds:d, ss:s s segment stack dw 128 dup (?) s ends d segment ;резервируем области под переменные a, b, c a dw ? b dw ? c dw ? ;размещаем строки – подсказки для ввода переменных msga db ‘Введите a:$’ msgb db ‘Введите b:$’ msgc db ‘Введите c:$’ ;размещаем строки – сообщения об ошибках err1 db ‘Деление на ноль (первая дробь)$’ err2 db ‘Деление на ноль (вторая дробь)$’ ;описываем данные для процедур ввода и вывода целых чисел . . . d ends c od segment ;описываем процедуры ввода и вывода целых чисел cr = 0dh ;cr присваиваем значение кода символа ;возврата каретки (клавиши «Enter») lf = 0ah ;lf присваиваем значение кода символа ;перевода строки IntegerIn proc start: mov ah,0ah ;функцией 0a вводим строку ;символов и размещаем ее в ;области string lea dx,string int 21h xor ax,ax ;обнуляем ax, в котором ;будем формировать число lea si,string+2 ;устанавливаем si на ;первый символ введенной ;строки mov negflag,ax ;обнуляем флаг ;отрицательности числа ;(предполагаем, что оно ;будет неотрицательным) cmp byte ptr [si],'-';первый символ – это ;минус? jne m2 ;если нет – на m2 not negflag ;отмечаем, что число ;отрицательное ;(negflag не равен 0) inc si ;продвигаем si со ;знака числа к первой ;цифре jmp m ;прыгаем на разбор ;строки цифр m2: cmp byte ptr [si],'+';первый символ – это ;плюс? jne m ;если нет – на m inc si ;продвигаем si со ;знака числа к первой ;цифре ;анализируем текущий символ m: cmp byte ptr [si],cr ;если это cr – строка ;закончилась, выходим ;из цикла разбора ;символов je ex1 cmp byte ptr [si],'0';если код символа ;меньше кода '0' – ;это не цифра jb err ;прыгаем на метку err cmp byte ptr [si],'9';если код символа ;больше кода '9' – ;это не цифра ja err ;прыгаем на метку err mov bx,10 ;домножаем полученное ;число на основание ;системы счисления mul bx sub byte ptr [si],'0';вычитаем код символа ;'0' (получаем ;очередную цифру) add al,[si] ;добавляем цифру к ;числу adc ah,0 inc si ;продвигаем si к ;следующему символу jmp m ;организуем цикл ;функцией 09 выводим сообщение об ошибке err: lea dx,errmsg mov ah,9 int 21h jmp start ;повторяем ввод ex1: cmp negflag,0 ;число положительное? je ex ;если да – выходим neg ax ;меняем знак числа ex: ret IntegerIn endp IntegerOut proc xor cx,cx ;обнуляем счетчик цифр mov bx,10 ;в bx помещаем делитель cmp ax,0 ;проверяем знак числа jge m ;если неотрицательное – на m neg ax ;иначе – меняем знак числа pushax ;сохраняем число перед вызовом ;функции, использующей ax mov ah,2 ;функцией 02 выводим знак '-' mov dl,'-' int 21h pop ax ;восстанавливаем число в ax m: inc cx ;считаем количество ;получающихся цифр xor dx,dx ;преобразуем делимое к 32 ;разрядам div bx ;получаем очередную цифру pushdx ;сохраняем ее в стеке or ax,ax ;проверяем есть ли еще цифры jnz m ;если да – на метку m ;при выходе из цикла в стеке лежат цифры, в cx – их ;количество m1: pop dx ;извлекаем цифру из стека add dx,'0' ;преобразуем в код символа mov ah,2 ;функцией 02 выводим на экран int 21h loopm1 ;повторяем cx раз ret ;возвращаемся из процедуры IntegerOut endp ;устанавливаем ds на сегмент данных string db 255, 0, 255 dup (?) errmsg db 'Недопустимый символ, можно' db 'использовать только цифры',cr,lf,'$' start: mov ax,d mov ds,ax ;вводим значение переменныой a Mov ah,09 ;выводим строку – подсказку для a Lea dx,msga Int 21h Call IntegerIn ;вводим число Mov a,ax ;помещаем его в область a ;вводим значение переменныой b Mov ah,09 ;выводим строку – подсказку для b Lea dx,msgb Int 21h Call IntegerIn ;вводим число Mov b,ax ;помещаем его в область b ;вводим значение переменныой c Mov ah,09 ;выводим строку – подсказку для c Lea dx,msgc Int 21h Call IntegerIn ;вводим число Mov c,ax ;помещаем его в область c ;проверяем знаменатели на равенство 0 Cmp c,0 ;проверяем первый знаменатель Jnz m ;если не 0 – на m Mov ah,09 ;выводим сообщение об ошибке Lea dx,err1 Int 21h Jmp err ;выходим m: Mov ax,b ;считаем второй знаменатель Add ax,c Jnz m1 ; если не 0 – на m1 Mov ah,09 ;выводим сообщение об ошибке Lea dx,err2 Int 21h Jmp err ;выходим ;рассчитываем значение выражения m1: Mov bx,ax ;помещаем второй знаменатель в bx Mov ax,a ;считаем второй числитель Imul ax Mov cx,3 Imul cx Idiv bx ;считаем значение второй дроби Push ax ;сохраняем его в стеке Mov ax,a ;считаем первый числитель Add ax,b Mov bx,c ;считаем значение первой дроби Cwd Idiv bx Pop bx ;извлекаем из стека значение второй ;дроби Sub ax,bx ;вычитаем call IntegerOut ;выводим результат ;завершаем работу программы mov ax,4c00h ;с кодом завершения 0 – без ошибок int 21h err: mov ax,4cffh ;с кодом завершения 0ffh (-1) – с ошибкой int 21h c od ends end start
Решение задачи: «В программе есть ошибки, необходимо исправить»
textual
Листинг программы
c od segment
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д