Новичок
Профиль
Группа: Участник
Сообщений: 22
Регистрация: 20.12.2008
Репутация: нет Всего: нет
|
В общем с кодировкой и со сравниванием чисел я разобрался. Всё работает. Но теперь функция неправильно считает. Пробовал вставлять код который писал 500mhz, но пишет что эти регистры "undefined symbol". Не знаю что делать. Помогите кто сможет, пожалуйста! Выкладываю свой полный код для решения функции Y = (A-D*C/A+E) + (A*B+C/D-E) – (A-B/C+D*E). Надо чтобы на экране я ммог вводить перменные, но и текст должен выводиться. Также тут есть An-это верхний предел А, h-шаг изменения перменной А. | Код | DATA SEGMENT MS1 DB 'Вычисление функции Y в пределах с шагом H ' DB 13,10,' ----------------------------------------------------------- ' DB 13,10,'? ?' DB 13,10,'? Y = (A-D*C/A+E)+(A*B+C/D-E)-(A-B/C+d*E) ?' DB 13,10,'? ?' DB 13,10,' ----------------------------------------------------------','$' MS3 DB 'Результаты вычислений :','$' MS4 DB 'Введите : ','$' MS5 DB 2,6,'При A=','$' MS6 DB ' Y=','$' MS7 DB 'Нажмите <Enter> для выхода...','$' ER DB 'Значение D и E не должны быть равны !' DB 13,10,' ' DB 13,10,'Пожалуйста, повторите ввод ... нажмите <Enter>','$' PR_A DB 'Начальная A=','$' PR_An DB 'Количество повторений N=','$' PR_H DB 'Шаг H=','$' OVERFLOW DB 13,10,'Переполнение разрядной сетки','$' PR_BBIN DB ' B=','$' PR_CBIN DB ' C=','$' PR_DBIN DB ' D=','$' PR_EBIN DB ' E=','$' P_A DW 2 DUP (' '),'$' ABIN DW 0 ; Место для двоичного числа A BBIN DW 0 ; Место для двоичного числа B CBIN DW 0 ; Место для двоичного числа C DBIN DW 0 ; Место для двоичного числа D EBIN DW 0 ; Место для двоичного числа E AnBIN DB 0 ; Место для двоичного числа An HBIN DW 0 ; Место для двоичного числа H F DW 5 dup(0),13,10,'$' ; Место для результата Y BUFF DB 3,6 DUP(0),'$' ; промежуточный буфер DATA ENDS CODE SEGMENT START PROC FAR ASSUME CS:CODE, DS:DATA ;-------инициализация EXE-программы----------------------------- PUSH DS OR AX,AX PUSH AX MOV AX,DATA MOV DS,AX AGAIN: ; -------- Вывод комментариев --------------------------------- CALL CLEAR ; обращение к процедуре очистки экрана MOV DX,0000H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,MS1 ; загрузка адреса текста CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV DX,0600H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,MS4 ; загрузка адреса текста CALL DISPLAY ; обращение к процедуре вывода на дисплей ;------------------- Ввод [B] --------------------------------- MetB: MOV DX,0700H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,PR_BBIN ; загрузка адреса текста запроса на ввод CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV AH,0AH ; загрузка кода функции DOS ввода ASCII-кода LEA DX,BUFF ; загрузка адреса области буфера INT 21H ; прерывание, передача управления в DOS CMP BUFF+1,00 ; проверка на пустое значение JE MetB MOV CL,BUFF+1 ; запись количества введенных цифр LEA SI,BUFF+2 ; загрузка старшего разряда LEA DI,BBIN ; загрузка адреса переменной CALL ASBI ; Вызов процедуры перевода ASCII -> 2 ;------------------- Ввод [C] --------------------------------- MetC: MOV DX,0800H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,PR_CBIN ; загрузка адреса текста запроса на ввод CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV AH,0AH ; загрузка кода функции DOS ввода ASCII-кода LEA DX,BUFF ; загрузка адреса области буфера INT 21H ; прерывание, передача управления в DOS CMP BUFF+1,00 JE MetB MOV CL,BUFF+1 ; запись количества введенных цифр LEA SI,BUFF+2 ; загрузка старшего разряда LEA DI,CBIN ; загрузка адреса переменной CALL ASBI ; Вызов процедуры перевода ASCII -> 2 ;---------------------- Ввод [D] ------------------------------ MetD: MOV DX,0900H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,PR_DBIN ; загрузка адреса текста запроса на ввод CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV AH,0AH ; загрузка кода функции DOS ввода ASCII-кода LEA DX,BUFF ; загрузка адреса области буфера INT 21H ; прерывание, передача управления в DOS CMP BUFF+1,00 ; проверка на пустое значение JE MetC MOV CL,BUFF+1 ; запись количества введенных цифр LEA SI,BUFF+2 ; загрузка старшего разряда LEA DI,DBIN ; загрузка адреса переменной CALL ASBI ; Вызов процедуры перевода ASCII -> 2 ;---------------------- Ввод [E] ------------------------------ MetE: MOV DX,0A00H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,PR_EBIN ; загрузка адреса текста запроса на ввод CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV AH,0AH ; загрузка кода функции DOS ввода ASCII-кода LEA DX,BUFF ; загрузка адреса области буфера INT 21H ; прерывание, передача управления в DOS CMP BUFF+1,00 ; проверка на пустое значение JE MetA MOV CL,BUFF+1 ; запись количества введенных цифр LEA SI,BUFF+2 ; загрузка старшего разряда LEA DI,EBIN ; загрузка адреса переменной CALL ASBI ; Вызов процедуры перевода ASCII -> 2 ;------------------ Ввод [A] --------------------------------- MetA: MOV DX,0B00H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,PR_A ; загрузка адреса текста запроса на ввод CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV AH,0AH ; загрузка кода функции DOS ввода ASCII-кода LEA DX,BUFF ; загрузка адреса области буфера INT 21H ; прерывание, передача управления в DOS CMP BUFF+1,00 ; проверка на пустое значение JE MetA MOV CL,BUFF+1 ; запись количества введенных цифр LEA SI,BUFF+2 ; загрузка старшего разряда LEA DI,ABIN ; загрузка адреса переменной CALL ASBI ; Вызов процедуры перевода ASCII -> 2 ;------------------ Ввод [An] --------------------------------- MetAn: MOV DX,0C00H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,PR_An ; загрузка адреса текста запроса на ввод CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV AH,0AH ; загрузка кода функции DOS ввода ASCII-кода LEA DX,BUFF ; загрузка адреса области буфера INT 21H ; прерывание, передача управления в DOS CMP BUFF+1,00 ; проверка на пустое значение JE MetAn MOV CL,BUFF+1 ; запись количества введенных цифр LEA SI,BUFF+2 ; загрузка старшего разряда LEA DI,AnBIN ; загрузка адреса переменной CALL ASBI ; Вызов процедуры перевода ASCII -> 2 ;---------------------- Ввод [H] ------------------------------ MetH: MOV DX,0D00H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,PR_H ; загрузка адреса текста запроса на ввод CALL DISPLAY ; обращение к процедуре вывода на дисплей MOV AH,0AH ; загрузка кода функции DOS ввода ASCII-кода LEA DX,BUFF ; загрузка адреса области буфера INT 21H ; прерывание, передача управления в DOS CMP BUFF+1,00 ; проверка на пустое значение JE MetH MOV CL,BUFF+1 ; запись количества введенных цифр LEA SI,BUFF+2 ; загрузка старшего разряда LEA DI,HBIN ; загрузка адреса переменной CALL ASBI ; Вызов процедуры перевода ASCII -> 2 ; ----------- Проверка на допустимые значения D=E -------------- MOV BX,DBIN CMP EBIN,BX ; сравнение D с E JNE NEXT ; переход к вычислению функции CALL ERR ; вызов процедуры выдачи сообщения об ошибке JMP AGAIN ; возврат к вводу данных NEXT: ;---------- вывод комментариев --------------------------------- CALL CLEAR ; вызов процедуры очистки экрана MOV DX,0000H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,MS3 ; загрузка адреса текста CALL DISPLAY ; обращение к процедуре вывода на дисплей ;----------- цикл определения значений функции ----------------- MOV DX,0202H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию SUB BX,BX ; обнуление (BX) SUB DX,DX ; обнуление (DX) SUB DI,DI ; обнуление (DI) SUB CX,CX MOV CL,AnBIN M1: MOV BX,ABIN ; A->(BX) MOV DI,DBIN ; D->(DI) MOV CL,ANBIN ; An->(CL) XOR AX,AX MOV AX,CBIN ; C->(AX) MUL DI ; (D*C) -> (AX) SUB AX,DX ;A-(D*C) PUSH BX MOV BX,ABIN SUB AX,AX MOV AX,EBIN ADD AX,BX ; (A+E) POP BX DIV AX ; (A-D*C/A+E) MOV DX,AX ; результат в (DX) PUSH DX SUB BX,BX SUB DI,DI MOV DI,BBIN MOV BX,ABIN MUL DI XOR AX,AX MOV AX,CBIN ADD AX,BX PUSH AX MOV BX,DBIN MOV AX,EBIN SUB BX,AX POP AX DIV BX POP DX MOV AX,DX SUB DX,DX MOV DX,BX ADD DX,AX PUSH DX SUB BX,BX SUB DI,DI MOV BX,ABIN XOR AX,AX MOV AX,BBIN SUB BX,AX PUSH BX MOV DI,DBIN MOV BX,EBIN MUL DI MOV AX,CBIN ADD AX,BX POP BX DIV AX POP DX SUB DX,AX JNC R1 LEA DX,OVERFLOW CALL DISPLAY JMP EXIT R1: PUSH CX ; сохранение в стеке (СX) LEA SI,F+4 ; загрузка адреса переменной MOV [SI-1],DH MOV [SI],DL CALL BIAS ; преобразование аргумента в ASCII LEA SI,P_A+2 ; загрузка адреса переменной MOV [SI-1],BH MOV [SI],BL CALL BIAS ; преобразование аргумента в ASCII LEA DX,MS5+2 ; загрузка адреса переменной CALL DISPLAY ; вызов процедуры вывода на экран LEA DX,P_A ; загрузка адреса переменной CALL DISPLAY ; вызов процедуры вывода на экран JMP S2 ; безусловный переход на метку S2 S1: JMP M1 ; безусловный переход на метку М1 S2: LEA DX,MS6 ; загрузка адреса переменной CALL DISPLAY ; вызов процедуры вывода на экран LEA DX,F ; загрузка адреса переменной CALL DISPLAY ; вызов процедуры вывода на экран ADD BX,HBIN ; прибавление шага к текущему Х POP CX ; извлечение из стека LOOP S1 EXIT: MOV DX,1800H ; задание координат курсора CALL CURS ; установка курсора в заданную позицию LEA DX,MS7 ; загрузка адреса текста CALL DISPLAY ; обращение к процедуре вывода на дисплей ; ------ Приостановка для просмотра результатов ---------------- MOV AH,0AH ;загрузка кода функции DOS ввода ASCII-кода INT 21H ;прерывание, передача управления в DOS RET START ENDP ;-------------- Процедура очистки экрана ---------------------- CLEAR PROC NEAR MOV AX,0600h ; загрузка кода перемещения изображения на экране MOV BH,07h ; черно-белый режим MOV CX,0000h ; координаты верхнего левого угла MOV DX,184FH ; --- " --- правого нижнего - " INT 10H ; прерывание, выход в BIOS RET CLEAR ENDP ;-------------- Процедура установки курсора ------------------- CURS PROC NEAR MOV AH,02H ; загрузка кода операции установки курсора MOV BH,00 ; N страницы экрана (0) INT 10H ; прерывание, выход в BIOS RET CURS ENDP ;------------ Процедура вывода на дисплей ---------------------- DISPLAY PROC NEAR MOV AH,09H ; ввод кода функции DOS вывода на дисплей INT 21H ; прерывание, передача управления в DOS RET ; возврат в головную программу DISPLAY ENDP ;-------- Процедура преобразование ASCII -> 2 ------------------ ASBI PROC NEAR ; (адрес ASCII-кода заносится в SI, ; длина числа - в CL перед обращением к ASBI) MOV BX,10 ; Множитель для преобразования XOR DX,DX XOR AX,AX LOOP1: MOV AL,[SI] ; Выбор ASCII-кода символа PUSH AX ; (AX) в стек MOV AX,DX ; пересылка (DX) в (АХ) MUL BX ; умножение (АХ) на (ВХ) MOV DX,AX ; пересылка (АХ) в (DX) POP AX ; (АХ) из стека AND AX,000FH ; преобразование ADD DX,AX ; Добавление к двоичному результату INC SI ; инкремент (SI) LOOP LOOP1 ; Если не последняя цифра, то ? продолжать MOV [DI],DX RET ASBI ENDP ;----- Перевод из 2 с/с в ASCII послед. делением на 10 --------- BIAS PROC NEAR MOV CX,10 XOR DX,DX XOR AX,AX MOV AH,[SI-1] MOV AL,[SI] M2: CMP AX,10 JB M3 ; если в АХ число < 10, то ? выход XOR DX,DX DIV CX ; деление содержимого AX на 10; остаток - в DL OR DL,30H ; формирование кода ASCII очередной цифры MOV [SI],DL ; сохранение ASCII ? символа DEC SI JMP M2 M3: OR AL,30H ; формирование кода ASCII старшей цифры MOV [SI],AL ; сохранение ASCII ? символа RET BIAS ENDP ERR PROC NEAR CALL CLEAR MOV DX,0000 CALL CURS LEA DX,ER CALL DISPLAY MOV AH,0AH LEA DX,BUFF INT 21H RET ERR ENDP CODE ENDS END START
|
После вполнения вычислений происходит вот что: http://s2.ipicture.ru/uploads/20111203/CDUw8bnk.pngи так бесконечно... Добавлено через 7 минут и 8 секунд| Цитата(iff @ 3.12.2011, 18:34) | Цитата(Rurir @ 30.11.2011, 11:18 ) | написал код для первой функции, т.е. для (A-D*C/A+E) переменная а тут изменяется с шагом h, поэтому и вводится An
SUB BX,BX ; обнуление (BX) SUB DX,DX ; обнуление (DX) SUB DI,DI ; обнуление (DI) MOV BX,ABIN ; A->(BX) MOV DI,DBIN ; D->(DI) MOV CL,ANBIN ; An->(CL) M1: XOR AX,AX MOV AX,СBIN ; C->(AX) MUL DI ; (D*C) -> (AX) SUB AX,DX ;A-(D*C) PUSH BX MOV BX,ABIN SUB AX,AX MOV AX,EBIN ADD AX,BX ; (A+E) POP BX DIV AX ; (A-D*C/A+E) MOV DX,AX ; результат в (DX)
Что неправильно? Как связать её с другими двумя членами функции? |
Поскольку здесь автор ко всем переменным обращается без квадратных скобок, подумал, что компилятор поддерживает именно такой синтаксис. |
Ну да, поддерживает. Я делаю эту работу с похожей работы, там всё работает, только функция другая... И в чём отличие стоят квадратные скобки или нет?
|