дано уравнение вида y=135x+(cx-2042b)/a^2. На экран нужно вывести сообщение "Решение такого то уравнения"(ну с этим то я разобрался), далее вывести сообшения "Приступить к решению, цифра 1", "Выйти в ДОС, клавиша 2"(Здесь я насколько понял надо применить условные операторы, и сделать метки, только не соображу как это реализовать, на паскале бы давно сделал, а вот в ассемблере пока туго). Далее надо будет вввести значения a,b,c b наверно х. и решить это уравнение.
Кто может помогите, ну или хотябы подскажите некоторые моменты, может сам разберусь.
Спасибо за внимание!!
Задача на Ассемблере
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
Код: Выделить всё
title РГЗ 3-й вариант
stdin=0
stdout=1
stderr=2
assume SS:StackSg, DS :D ataSg, CS:CodeSg ;Сегментным регистрам
;присвоены имена сегментов
StackSg segment stack ;начало сегмента стека
db 128 dup(?) ;стек размером 128 байт
StackSg ends ;конец сегмента стека
DataSg segment ;начало сегмента данных
a db ?
b db ?
c db ?
x db ?
y db ?
m db 10 ;множитель при перводе строки в число
Msg db 'Программа расчёта выражения y=135x+((cx-2087*b)/a^2); (1 вариант)',10,10,13,'$'
str1 db 'Клавиша "1" - приступить к решению',0Ah,0AH,0Dh,'Клавиша "2" - выход в DOS',10,10,13,'$'
str2 db 'Клавиша "V" - вывод результата на другую видеостраницу',10,10,13,'Клавиша "F" - запись результата в файл',10,10,13,'$'
MsgErr db 'Внимание!!! Деление на 0!! Введите другие данные!',10,10,13,'$'
zaprosA db 'Введите a: $'
zaprosB db 'Введите b: $'
zaprosC db 'Введите c: $'
zaprosX db 'Введите x: $'
probel db 10,10,13,'$'
buf db 8,8 dup (0)
bufout db 9 dup (?)
DataSg ends ;конец сегмента данных
CodeSg segment ;начало сегмента кода
Bxod: ;метка точки входа в программу
mov AX, DataSg ;адрес сегмента данных в АХ
mov DS, AX ;перевод адреса в DSв
mov AH, 09h ;номер функции 21-го прерывания*
lea DX, probel ;адрес строки сообщения в DX
int 21h ;вызов 21-го прерывания-
;-вывод строки на экран
lea DX, Msg
int 21h
lea DX, str1
int 21h
vibor:
mov AH, 07h ;ф-я ввода с клавиатуры без эха
int 21h
cmp AL, '2' ;нажата клавиша 2?
je perexod ;если да, идём на безусловный переход (усл. переход действует только в пределах 128 байт, а безусл. неограниченно)
cmp AL, '1' ;нажата клавиша 1?
jne vibor ;если нет (т.е. любая, кроме 1 или 2), возвращаемся на ввод
je dalee ;если да, идём далее
perexod:jmp vixod
dalee:
mov AH, 09h
lea DX, zaprosA
int 21h
mov AH, 0ah ;ввод с клавиатуры с эхом
lea DX, buf
int 21h
call conv
mov a, DL
mov AH, 09h
lea DX, zaprosB
int 21h
mov AH, 0ah ;ввод с клавиатуры с эхом
lea DX, buf
int 21h
call conv
mov b, DL
mov AH, 09h
lea DX, zaprosC
int 21h
mov AH, 0ah ;ввод с клавиатуры с эхом
lea DX, buf
int 21h
call conv
mov c, DL
mov AH, 09h
lea DX, zaprosX
int 21h
mov AH, 0ah ;ввод с клавиатуры с эхом
lea DX, buf
int 21h
call conv
mov x, DL
Код: Выделить всё
;Вычисление выражения:
xor AX,AX
mov AL, a ;помещаем в АL множитель a
cmp AX, 0
jne dalee_1
mov AH, 09h
lea DX, MsgErr
int 21h
jmp dalee
dalee_1:
mov AL, c ;помещаем в AL с
imul x ;умножаем на х
mov BX, AX ;переноси результат из АХ в ВХ
mov AX, 2807 ;помещаем в АХ число 2807
cbw
imul b ;умножаем на b
sub AX, BX ;вычитаем
push AX ;заносим числитель в стек
mov AL, a ;помещаем в AL а
cbw
imul a ;возводим в квадрат
mov BX, AX ;переноси результат из АХ в ВХ
pop AX ;достаем из стека числитель
cwd ;расширяем числитель до двойного слова DX:AX
idiv BX ;делим числитель на знаменатель в АХ-целая часть, в DX-остаток
push BX
push DX
push AX
mov AX, 135
imul x
mov BX, AX ;перемещаем DX:AX в CX:BX
mov CX, DX
pop AX ;достаем из стека целую часть дроби
cwd ;расширяем её до двойного слова DX:AX
add AX, BX ;складываем с ранее найденным произведением
adc DX, CX
;После вычислений в DX:AX-целая часть результата, в стеке DX-остаток от деления и ВХ-знаменатель дроби
;Конвертируем DX:AX в строку десятичных цифр
mov SI, DX ; сохраняем старшее слово в SI
mov BX, 10 ; делитель
mov CX, SP ; в СХ запоминаем вершину стека
big:
cmp DX, BX ; Войдёт ли результат деления в 16 бит?
jb smal ; да, DX < BX, так что результат уместится в AX!
xchg AX, SI ; старшее слово - в AX, сохраняем младшее слово в SI
xor DX, DX ; обнуляем DX
div BX ; делим старшее слово, остаток помещается в DX
xchg AX, SI ; меняем обратно
div BX ; делим младшее слово
push DX ; сохраняем остаток (0..9) в стек!
mov DX, SI ; prepare for next round
jmp big
smal: ; Remainder fits in lower 16 bits (AX)
div bx ; Divide, result stays in AX, remainder in DX
push dx ; Save remainder
xor dx,dx ; Prepare for next round
test ax,ax ; Any more digits?
jnz smal
; Все цифры собраны в стеке, теперь выводим их в строку:
mov DI, offset bufout
store:
pop ax
add al,'0'
mov [di],al
inc di
cmp cx,sp
jne store
mov al, '$'
mov [DI], al
mov AH, 09h
mov DX, offset bufout
int 21h
vixod:
mov AH, 4Ch ;номер функции 21-го прерывания*
int 21h ;передача управления в DOS
conv proc
mov DI, 0
lea BX, buf+1 ;В ВХ адрес второго элемента буфера
mov CX, [BX] ;в СХ кол-во введённых символов
xor CH, CH ;Обнуляем СН
mov SI, 1 ;в SI множитель
met:
push SI ;сохраняем SI (множитель) в стеке
mov SI, CX ;в SI помещаем номер текущего символа
mov AX, [BX+SI] ;в АХ помещаем текущий символ
xor AH, AH ;обнуляем АН
pop SI ;Извлекаем множитель (SI) из стека
sub AX, 30h ;получаем из символа (АХ) цифру
mul SI ;умножаем цифру (АХ) на множитель (SI)
add DI, AX ;складываем с результирующим числом
mov AX, SI ;помещаем множитель (SI) в АХ
mul m ;увеличиваем множитель (АХ) в 10 раз
mov SI, AX ;перемещаем множитель (АХ) назад в SI
loop met ;переходим к предыдущему символу
mov AH, 09h
lea DX, probel
int 21h
mov DX, DI
ret
conv endp
CodeSg ends; конец сегмента кода
end Bxod; конец программы с точкой входа
вот собственно сама задача
Проблема с делением если деление происходит без остатка то все работает и решается,
ну а если деление с остатком то вылазиет какая то ерунда.
И еще как в регистр АХ записать например число 2087
Проблема с делением если деление происходит без остатка то все работает и решается,
ну а если деление с остатком то вылазиет какая то ерунда.
И еще как в регистр АХ записать например число 2087
это не уравнение! это функция:
y=135x+(cx-2042b)/a^2
если вычислить значение, то a,b,c,x
если решить уравнение, то a,b,c,y
по другим моментам смотрите в другой раздел
с переходами вроде все нормально...
y=135x+(cx-2042b)/a^2
если вычислить значение, то a,b,c,x
если решить уравнение, то a,b,c,y
по другим моментам смотрите в другой раздел
с переходами вроде все нормально...