IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Проблема с вводом числа
сообщение
Сообщение #1


Гость






.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


У меня следующее задание:
Представить алгоритм и программу вычисления при заданном X значения функции
Y =5+2*( X +1) при X >10. Y =( X **2+1)/2 при 1< X <10. Y = X -2 при X <=1.

Сам алгоритм написал, мучался с выводом, вроде получилось...
Но теперь проблема с вводом =) Для проверки я вручную ложил в ах (тут я ложил 5)... Знаю насчёт mov ah, 01h - но она не поможет, т.к. диапазон от 0 до 9...

Помогите пожалуйста с вводом числа... при 1 выводит мне 65535, 10 я не могу... это понятно... Но что тогда делать?

Заранее благодарю за прочтение!!!...

p.s. в Азы (встроенный ассемблер) есть Тектовый ввод/вывод... апшибка
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


Вот. Накалякал вчера ночью.
.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


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 2:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name