Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2020, 08:19   #1
daskpt
Новичок
Джуниор
 
Регистрация: 12.06.2020
Сообщений: 4
По умолчанию Ввод чисел с клавиатуры - главный вопрос, с какой целью (перспективой) преподавать ассемблер в ВУЗах

MASM. Даны 3 числа a, b, c (вводятся с клавиатуры) найти:
1)2+a-b+c
2)a*b/c
Просто я их сделал а как сделать ввод с клавиатуры не знаю.
Код:
masm
model small
.stack 256
.data 
	a dw 1   ;2+a-b+c=5
	b dw 2
	c dw 4
	
.code
.startup
jmp main
main:

mov ax,2
add ax,a
sub ax,b
add ax,c

call ProcOutNum
.exit
end
1 задача
Код:
masm
model small
.stack 256
.data 
	a dw 2   ;a*b/c
	b dw 4
	c dw 2
	
.code
.startup
jmp main
main:

mov ax, a
mul b

mov dx, 0
mov bx, c
div bx

call ProcOutNum
.exit
end
2 задача.
daskpt вне форума Ответить с цитированием
Старый 13.06.2020, 16:23   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Числа ведь могут состоять не только из одной цифры ?
Ввести строку цифр и преобразовать их в число (ввод строки символов - не проблема?).
строка "3456" -> ("3" & 0Fh) + 10*( ("5" & 0Fh) + 10*( ("4" & 0Fh) + ("3" & 0Fh))*10)) = 3456 число;
https://ru.wikipedia.org/wiki/Схема_Горнера

Последний раз редактировалось digitalis; 13.06.2020 в 16:37.
digitalis вне форума Ответить с цитированием
Старый 13.06.2020, 17:13   #3
daskpt
Новичок
Джуниор
 
Регистрация: 12.06.2020
Сообщений: 4
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Числа ведь могут состоять не только из одной цифры ?
Ввести строку цифр и преобразовать их в число (ввод строки символов - не проблема?).
строка "3456" -> ("3" & 0Fh) + 10*( ("5" & 0Fh) + 10*( ("4" & 0Fh) + ("3" & 0Fh))*10)) = 3456 число;
https://ru.wikipedia.org/wiki/Схема_Горнера
У меня проблема с вводом, я не знаю как его делать. Все до чего я смог дойти это вот это
Код:
masm
model small
.stack 256
.data 
	A dw ?   
	B dw ?
	C dw ?
     asResult        db      "Y=", '$'
        asPromptA       db      'Input A (-32768..+32767): ', '$'
        Error01         db      'Error entering a number',0Dh, 0Ah, '$'
        asCrLf          db      0Dh, 0Ah, '$'
        KeyBuf          db      7, 0, 7 dup(0)      ;max,len,string,CR(0dh)
	
.code
.startup
jmp start
include io1.inc
start:
@@InputA:
        lea     dx,     [asPromptA]
        mov     ah,     09h
        int     21h
        mov     ah,     0Ah
        lea     dx,     [KeyBuf]
        int     21h
        ; перевод строки (на новую строку)
        mov     ah,     09h
        lea     dx,     asCrLf
        int     21h
        ; преобразование строки в число
        lea     si,     KeyBuf+1
        lea     di,     [A]
        ; проверка на ошибку
        jnc     @@NoError
                ; если есть ошибка ввода - напечатать сообщение об ошибке
                lea     dx, Error01
                mov     ah,09h
                int     21h
        jmp     @@InputA        ;повторить ввод
 
        ; если нет ошибки ввода - напечатать число
@@NoError:
        ;вычисления

mov ax,2
add ax,a
sub ax,b
add ax,c

call ProcOutNum
.exit
end
Но оно как я полагаю не передает строку в переменную и как это сделать я не имею понятия
daskpt вне форума Ответить с цитированием
Старый 14.06.2020, 11:05   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Пример ввода строки:https://www.cyberforum.ru/asm-beginn...ead380071.html
Далее.
На асме не буду, 100 лет уже не писал, на словах:
0) Берём самую старшую цифру
а) Выделяем из неё число (например, цифра "5" имеет код 35h, делаем ей харакири операцию И с константой 0Fh, т.е. выделяем 4 младших бита, получаем чистую 5) , закидываем её в переменную.
б) Если дальше цифр нет - результат достигнут, если есть, то:
в) Проделываем со следующей цифрой то, что написано в п. а), умножаем содержимое переменной на 10 и к результату прибавляем полученное в п а)
и так до упора.

Последний раз редактировалось digitalis; 14.06.2020 в 11:12.
digitalis вне форума Ответить с цитированием
Старый 14.06.2020, 11:53   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

digitalis, тут проблема не с вводом, а с глазами и руками
https://www.cyberforum.ru/asm-beginn...l#post14644294
ТС зачем-то переименовал готовые процедуры ввода и вывода, а также при копировании удалил вызов Str2Num.

В общем, не важно откуда руки растут - главное, что золотые.

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

Последний раз редактировалось FPaul; 14.06.2020 в 12:01.
FPaul вне форума Ответить с цитированием
Старый 14.06.2020, 13:02   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Ну что ж. "Были когда-то и мы чайника'ми..."
digitalis вне форума Ответить с цитированием
Старый 14.06.2020, 13:22   #7
daskpt
Новичок
Джуниор
 
Регистрация: 12.06.2020
Сообщений: 4
По умолчанию

Спасибо за помощь но она не понадобилась
Код:
masm
model small
.stack 256
.data
msg1 db 'Input a:$'
msg2 db 'Input b:$'
msg3 db 'Input c:$'
a dw ?
b dw ?
c dw ?
.code
.startup
jmp main
include io1.inc
main:
lea dx, msg1
mov ah, 09h
int 21h
mov ah,01h
int 21h ;
sub al,30h
mov ah,0
mov bx,10
mov cx,ax

m1: mov ah,01h
int 21h
cmp al,0dh
je m2

sub al,30h
cbw
xchg ax,cx
mul bx
add cx,ax
jmp m1

m2: mov a,cx
lea dx, msg2
mov ah, 09h
int 21h
mov ah,01h
int 21h ;
sub al,30h
mov ah,0
mov bx,10
mov cx,ax

m3: mov ah,01h
int 21h
cmp al,0dh
je m4

sub al,30h
cbw
xchg ax,cx
mul bx
add cx,ax
jmp m3
m4: mov b,cx

lea dx, msg3
mov ah, 09h
int 21h
mov ah,01h
int 21h ;
sub al,30h
mov ah,0
mov bx,10
mov cx,ax

m5: mov ah,01h
int 21h
cmp al,0dh
je m6

sub al,30h
cbw
xchg ax,cx
mul bx
add cx,ax
jmp m5
m6: mov c,cx
mov ax,2
add ax,a
sub ax,b
add ax,c


mov dh,1
mov dl,5
call ProcOutNum
.exit
end
daskpt вне форума Ответить с цитированием
Старый 14.06.2020, 14:34   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Ну и слава богу, что резко так "стал в курсе". Главное - результат.
digitalis вне форума Ответить с цитированием
Старый 14.06.2020, 14:45   #9
daskpt
Новичок
Джуниор
 
Регистрация: 12.06.2020
Сообщений: 4
По умолчанию

Не думаю что сидеть 3 дня это резко.
daskpt вне форума Ответить с цитированием
Старый 14.06.2020, 18:16   #10
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Не понимаю, зачем в 21-ом веке учить дос с его прерываниями?
Сейчас уже Win-10 на дворе, и пока ты через досю до неё дойдёшь, то уже состаришься. Имхо тратить свою жизнь нужно на полезные и актуальные вещи, а не усердно изучать то, что тебе никогда уже не понадобиться. С таким-же успехом практиковать азы можно и в защищённом режиме.. хоть польза какая-то будет, да и откроешь для себя массу нового.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблер. Ввести с клавиатуры массив из 7 целых чисел, найти и вывести на эк- ран сумму тех элементов массива, которые при делении на 5 дают в остатке 1 или 3 kosplay321 Помощь студентам 5 11.01.2018 20:53
Ввод чисел с клавиатуры в Java. Faridik Помощь студентам 3 09.09.2014 19:00
Программа для ввода строковых данных с клавиатуры. Запретить ввод пробела в строку (Ассемблер) Victor Babin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.12.2012 09:38
Ввод с клавиатуры целых десятичных чисел Илья555 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 26.04.2011 09:12
Ввод чисел с клавиатуры SAVIK Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 26.05.2008 12:54