.Model Tiny
.Code
org 100h
start:
xor ax, ax
xor bx, bx
xor dx, dx
lea DX,Inputx
mov ah,09h
int 21h
mov ax,5
mov bx,10
cmp ax,bx
jg xbigten
mov bx,1
cmp ax,bx
jg xoneten
sub ax,2
jmp xend
xbigten:
inc ax
mov cx,2
imul cx
mov cx,5
add ax,cx
jmp xend
xoneten:
mov cx,2
imul cx
inc ax
cwd
idiv cx
jmp xend
xend:
lea di, dResult - 2
call PrintDEC ; Преобразование числа в символьный вид
mov dx, offset sResult
mov ah, 09h
int 21h ; Печать результата на экране
int 20h ; Завершение работы программы
PrintDEC PROC
std
PH1: xor dx, dx ; dx =0 чтобы избежать переполнения при
; деление на 10
mov cx, 10
div cx
add dl, '0' ; преобразуем число в символьный вид
xchg ax, dx
stosb ; запоминаем в памяти по es:di
xchg ax, dx
test ax, ax ; Пока не ноль преобразуем в десятичный вид
jnz PH1
ret
ENDP PrintDEC
Inputx db 0Dh,0Ah
db 'Введите х: ','$'
sResult db 0Dh,0Ah
db 'Результат равен $'
dResult equ $
end start
Вот. Накалякал вчера ночью.
.model tiny;формат для СОМ файла
.386;тип проца
.387;тип сопроцессора (это я просто прогу ночью писал)
.code
org 100h
start:
lea dx, priv
mov ah,9
int 21h
;выведем просьбу ввести число
mov ch,3
lea di,chislo
;будем читать 3 символа в переменную.
_loop:
mov ah,1
int 21h
cmp al,30h
jl error
cmp al,39h
ja error
;проверяем число на диапазон. если оно не в интервале 0..9, то выводим мессагу.
sub al,30h
stosb
;преобразуем и фигачим в переменную
dec ch
jnz _loop
;конец цикла чтения
next_step:
lea si,chislo
;целимся в прочитанное
lodsw
xchg ax,bx
xchg bh,bl
shl bl,4
shl bx,4
lodsb
add bl,al
shl bl,4
rol bx,12
lea di,chislo2
xchg ax,bx
stosw
;что произойдёт - смотри в отладчике (следи за регистрами ax, bx)
jmp bolshe10
error:
lea dx,error1
mov ah,9
int 21h
;тут если ошибка
exit:
xor ax,ax
int 16h
ret
;тут завершение работы
bolshe10:
;сам подсчёт. я упустил проверки и пр. и сделал только первый вариант для всех Х.
finit
;инициализачия сопроцессора
fbld chislo2
;грузим наше число, как десятичное
fldz
;грузим 0
fcos
;косинус 0 = 1
fadd st(0),st(1)
;складываем число с 1
fild no1
;грузим 2
fmul st(0),st(1)
;умножаем результат на 2
fild no2
;грузим 5
fadd st(0),st(1)
;складываем результат с 5
fbstp chislo2
;выгружаем десятичное представление результата
jmp prres
prres:
lea dx,asd
mov ah,9
int 21h
;выводим слово "РЕЗУЛЬТАТ"
lea si,chislo2
inc si
lea di,chislo
mov cx,2
_lll:
xor ax,ax
lodsb
sub si,2
shl ax,4
shr al,4
add al,30h
add ah,30h
xchg ah,al
stosw
dec cx
jnz _lll
;тут действия тоже с отладчика видны. это преобразования числа в строку
mov ah,9
lea dx, chislo
int 21h
;выводим строку и валим на выход
jmp exit
no1 dw 2
no2 dw 5
error1 db 0ah,0dh,'Error: Symbol is bad$',0ah,0dh,'$'
priv db 'Enter value in xxx format, where 0<x<9, please: $'
asd db 0ah,0dh,'Result y=5+2*(x+1)=$'
chislo2 dt 0; для загрузки в сопроцессор нужна 80-битная переменная
chislo db 0,0,0,0,'$'
end start