Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать решение функции на ассемблере 
:(
    Опции темы
Rurir
Дата 3.12.2011, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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)


Что неправильно? Как связать её с другими двумя членами функции?

Поскольку здесь автор ко всем переменным обращается без квадратных скобок, подумал, что компилятор поддерживает именно такой синтаксис.

Ну да, поддерживает. Я делаю эту работу с похожей работы, там всё работает, только функция другая...
И в чём отличие стоят квадратные скобки или нет?
PM MAIL   Вверх
iff
Дата 3.12.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


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

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



Цитата(Rurir @  3.12.2011,  19:24 Найти цитируемый пост)
 чём отличие стоят квадратные скобки или нет

в одной из недавних тем был такой вопрос. в intel-синтаксисе это означает адрес элемента данных или его значение (если скобки есть).

Добавлено через 5 минут и 1 секунду
И ещё, вы правильно написали выражение?
У вас написано: A*B+C/D-E
А вы говорите, что значение D и E не должны быть равны, да и у вас в коде вычисляется A*B+C/(D-E) (по-моему, тщательно не разбирался)
Так A*B+C/D-E или A*B+C/(D-E)?


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
Rurir
Дата 3.12.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да,извиняюсь что запутал вас. Да и себя) Тут второй вариант,т.е.  (A*B+C)/(D-E)
Поэтому D и E не должны быть равны..На ноль делить нельзя.

Но дело то не в цикле определения значений функции...

Это сообщение отредактировал(а) Rurir - 3.12.2011, 21:54
PM MAIL   Вверх
Rurir
Дата 5.12.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребят,ну что, кто-нибудь поможет разобраться?
PM MAIL   Вверх
500mhz
Дата 5.12.2011, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



Цитата

Пробовал вставлять код который писал 500mhz, но пишет что эти регистры "undefined symbol"

какие регистры? измени еах на ах 


--------------------

PM MAIL ICQ   Вверх
Rurir
Дата 7.12.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(500mhz @ 5.12.2011,  18:37)
Цитата

Пробовал вставлять код который писал 500mhz, но пишет что эти регистры "undefined symbol"

какие регистры? измени еах на ах

Попробовал и с вашим кодом,в котором поменял регистры...Всё равно также:
http://s2.ipicture.ru/uploads/20111203/CDUw8bnk.png

Думаю тут проблема в определении цикла перменной А, программа считает бесконечно, а нужно до An с шагом h изменения переменной A.
То есть если А=1, Аn=7, а шаг h=1, то должно быть только 7 результатов. Да и при выводе результатов А совсем другая,чем вводишь...
PM MAIL   Вверх
iff
Дата 7.12.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


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

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



Попробуйте использовать отладчик, что-бы выяснить на каком шаге программа ведёт себя неправильно.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
Rurir
Дата 7.12.2011, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот в чём ошибка:
http://s1.ipicture.ru/uploads/20111207/mlA1e7ql.png

Кто знает как от такого избавиться?
PM MAIL   Вверх
500mhz
Дата 8.12.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



ну так ты вылитаеш куда то вообще, где то call или jmp не пральный


--------------------

PM MAIL ICQ   Вверх
Rurir
Дата 18.1.2012, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В оющем,я избавился от вылетания, теперь другая проблема-после ввода всех переменных выодится "Переполнение деления". Что может быть неправильно? И вообще посмотрите пожалуйста на код,может где есть ошибки? 
Заранее спасибо!


Код

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> для выхода...','$'
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               ; Место для двоичного числа A1
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
NEXT:
;---------- вывод комментариев ---------------------------------
CALL CLEAR     ; вызов процедуры очистки экрана
MOV DX,0000H   ; задание координат курсора
CALL CURS      ; установка курсора в заданную позицию
LEA DX,MS3     ; загрузка адреса текста
CALL DISPLAY   ; обращение к процедуре вывода на дисплей
;----------- цикл определения значений функции -----------------
MOV DX,0202H      ; задание координат курсора
CALL CURS         ; установка курсора в заданную позицию
SUB BX,BX         ; обнуление (BX)
MOV BX,ABIN       ; A1->(BX)
SUB DX,DX         ; обнуление (DX)
SUB DI,DI         ; обнуление (DI)
SUB CX,CX         ; обнуление (CX)
MOV CL,AnBIN      ; An->(CL)
M1:   
PUSH BX           ; сохранение в стеке (BX)
XOR AX,AX         ; обнуление (AX)
;D*C
     mov di,[DBIN]
     mul [CBIN]
     ;((D*C)/A)
     div [ABIN]
     ;A-((D*C)/A)
     mov AX,[ABIN]
     sub AX,DI
     ;+E
     add AX,[EBIN]
     push AX

     ;(A*B+C/D-E)
     mov dx,[ABIN]
     mul [BBIN]
     push DX
     mov DX,[CBIN]
     div [DBIN]
     pop AX
     add DX,AX
     sub DX,[EBIN]
     push DX

     ;(A-B/C+D*E)
     mov DX,[DBIN]
     mul [EBIN]
     push DX
     mov DX,[BBIN]
     div [CBIN]
     mov AX,[ABIN]
     sub AX,DX
     pop DX
     add DX,AX

     pop ax
     pop cx
     add ax,cx
     sub cx,dx
     xchg dx,cx  ;в dх возвращаем результат
     POP BX            ; извлечение из стека
   JNC R1            ; проверка на переполнение разрядной сетки
   LEA DX,OVERFLOW   ; загрузка адреса текстового сообщения
   CALL DISPLAY      ; вызов процедуры вывода на экран
   JMP EXIT          ; переход на выход           

R1:
PUSH CX              ; сохранение в стеке (СX)
LEA SI,F+4           ; загрузка адреса переменной
MOV [SI-1],DH
MOV [SI],DL
 LEA SI,P_A+2         ; загрузка адреса переменной
MOV [SI-1],BH
 MOV [SI],BL
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          ; прибавление шага к текущему A
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
ASBI    PROC NEAR    ; Процедура преобразование ASCII -> 2
             ; (адрес 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           

BIAS    PROC NEAR     ; Перевод из 2 с/с в ASCII послед. делением на 10
    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
CODE ENDS
END START

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


Новичок



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

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



С переполнением деления тоже разобрался!
Теперь новая проблема: после ввода всех данных результат выводится не цифрами а символами..Как решить проблему?

user posted image


Код

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> дл  выхода...','$'
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               ; Место для  двоичного числа A1
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 DISPLA ; обращение к процедуре вывода на дисплей
MOV DX,0600H ; задание координат курсора
CALL CURS    ; установка курсора в заданную позицию
LEA DX,MS4   ; загрузка адреса текста
CALL DISPLA ; обращение к процедуре вывода на дисплей
;-------------------  Ввод [B] ---------------------------------
MetB:
MOV DX,0700H   ; задание координат курсора
CALL CURS      ; установка курсора в заданную позицию
LEA DX,PR_BBIN     ; загрузка адреса текста запроса на ввод
CALL DISPLA   ; обращение к процедуре вывода на дисплей
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 DISPLA    ; обращение к процедуре вывода на дисплей
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 DISPLA   ; обращение к процедуре вывода на дисплей
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 DISPLA   ; обращение к процедуре вывода на дисплей
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 DISPLA   ; обращение к процедуре вывода на дисплей
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 DISPLA   ; обращение к процедуре вывода на дисплей
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 DISPLA   ; обращение к процедуре вывода на дисплей
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
NEXT:
;---------- вывод комментариев ---------------------------------
CALL CLEAR     ; вызов процедуры очистки экрана
MOV DX,0000H   ; задание координат курсора
CALL CURS      ; установка курсора в заданную позицию
LEA DX,MS3     ; загрузка адреса текста
CALL DISPLA   ; обращение к процедуре вывода на дисплей
;----------- цикл определени  значений функции -----------------
MOV DX,0202H      ; задание координат курсора
CALL CURS         ; установка курсора в заданную позицию
SUB BX,BX         ; обнуление (BX)
MOV BX,ABIN       ; A1->(BX)
XOR DX,DX         ; обнуление (DX)
SUB DI,DI         ; обнуление (DI)
SUB CX,CX         ; обнуление (CX)
MOV CL,AnBIN      ; An->(CL)
M1:   
PUSH BX           ; сохранение в стеке (BX)
XOR AX,AX         ; обнуление (AX)
MOV DI,DBIN       ; D->(DI)
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 DISPLA
POP BX
   JNC R1            ; проверка на переполнение разр дной сетки
   LEA DX,OVERFLOW   ; загрузка адреса текстового сообщени 
   CALL DISPLA      ; вызов процедуры вывода на экран
   JMP EXIT          ; переход на выход           

R1:
PUSH CX              ; сохранение в стеке (СX)
LEA SI,F+4           ; загрузка адреса переменной
MOV [SI-1],DH
MOV [SI],DL
 LEA SI,P_A+2         ; загрузка адреса переменной
MOV [SI-1],BH
 MOV [SI],BL
LEA DX,MS5+2         ; загрузка адреса переменной
CALL DISPLA         ; вызов процедуры вывода на экран
LEA DX,P_A           ; загрузка адреса переменной
CALL DISPLA         ; вызов процедуры вывода на экран
JMP  S2              ; безусловный переход на метку S2
S1:
JMP M1               ; безусловный переход на метку М1
S2:
LEA DX,MS6           ; загрузка адреса переменной
CALL DISPLA         ; вызов процедуры вывода на экран
LEA DX,F             ; загрузка адреса переменной
CALL DISPLA         ; вызов процедуры вывода на экран
ADD BX,HBIN          ; прибавление шага к текущему A
POP CX               ; извлечение из стека
LOOP S1  
EXIT:
MOV DX,1800H ; задание координат курсора
CALL CURS    ; установка курсора в заданную позицию
LEA DX,MS7  ; загрузка адреса текста 
CALL DISPLA ; обращение к процедуре вывода на дисплей
;--------------- приостановка дл  просмотра результатов --------
   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
DISPLA PROC NEAR  ; Процедура вывода на дисплей
        MOV AH,09H ; ввод кода функции DOS вывода на дисплей
        INT 21H    ; прерывание, передача управлени  в DOS
        RET        ; возврат в головную программу
DISPLA ENDP
ASBI    PROC NEAR    ; Процедура преобразование ASCII -> 2
             ; (адрес 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           

BIAS    PROC NEAR     ; Перевод из 2 с/с в ASCII послед. делением на 10
    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
CODE ENDS
END START


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

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

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


 




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


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

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