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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2009, 12:44   #1
lordus
 
Регистрация: 12.11.2009
Сообщений: 3
По умолчанию Непонятно вводом с клавиатуры

Начал изучать ассемблер сейчас разбираю маленькие програмки для обучени.
Научился выводить на экран; вводить с клавы и то что ввел выводить на экран; научился слаживать два одноразрядных числа.
Но вот когда я решил это все вместе соеденить возникла проблема, все вместе не работает. После некоторых мучений я обнаружил, что когда я ввожу цифру с клавы к ней добавляется непонятный 16-ый код.
Например:
vvedit neobhodimoe chyslo A - 6 -сдесь я ввел цифру 6
vvedit neobhodimoe chyslo B - 7 -сдесь я ввел цифру 7
но оказывается я ввел не только цифры "6" и "7" я еще ввел какието символы "4☺". И соответственно я не могу произвести корректное сложение.
to chto vvedeno - 4☺6
to chto vvedeno - 4☺7

Внимание вопросы:
Когда вводим с клавы добавляються нечитаемые символы?
Если символы вводятся, то как от них избавиться?

Код:
;
;спроба ввести з клави два числа і їх скласти

.MODEL small
.STACK 100h
.DATA

	zaproshA	db 'vvedit neobhidne chyslo A - $'
	zaproshB	db 'vvedit neobhidne chyslo B - $'
	zaprosh2 	db 'vvedene chyslo - $'
	;chyslo1 	db '7'
	;chyslo2 	db '8'
	chyslo	db 255 dup("$")
	rezult_al 	db 255 dup("$") ; тільки так необхідно об*являти змінну.
	rezult_ah 	db 255 dup("$")
	chysloA	db 255 dup("$")
	chysloB	db 255 dup("$")
	tmp		db 255 dup("$")
	CR_LF   	db 13,10,"$"				;дані які необхідні для переведення на нову строку

.CODE
Main:
;занесення всіх даних з .DATA до стеку "ds"
	mov ax, @Data
	mov ds, ax
	
;Друк запрошення
    mov	ah,	09h			;функція виведення на екран
    mov	dx, offset zaproshA
    int 21h
	
;введення ,багатьох символів
    mov	dx, offset chysloA
    mov      ah, 0ah			;функція введеня рядка
    int        21h
	
; переведення строки - аналог /n
    mov ah, 09h				;функція виведення на екран
    mov dx, offset CR_LF
    int 21h


;Введення другого числа	
	
	
;Друк запрошення
	mov	ah,	09h					;функція виведення на екран
	mov	dx, offset zaproshB
	int     21h
	
;введення ,багатьох символів
    mov	dx, offset chysloB
    mov ah, 0ah						;функція введеня рядка
    int 21h
	
; переведення строки - аналог /n
    mov ah, 09h				;функція виведення на екран
    mov dx, offset CR_LF
    int 21h
	

;складання двох чисел

	mov al, chysloA
	mov bl, chysloB
	add al,bl			;складаємо два числа
	aaa					;ASCII - корекція
	pushf

	or ah,30h			;перетворити в ASCII - цифру
	or al,30h			;перетворити в ASCII - цифру
	popf
	sub ah, 05h			;оскільки чомусь в AH зберігається число на 5 більше ніж треба ми ці п*ять віднімаємо
	mov rezult_ah, ah	
	mov rezult_al, al

; виведення строки 
    mov ah, 09h					;функція виведення на екран
    mov dx, offset rezult_ah
    int 21h
    mov dx, offset rezult_al
    int 21h

	
;завершеня программи	
    mov	ax, 4c00h
    int	21h
END Main
lordus вне форума Ответить с цитированием
Старый 12.11.2009, 13:18   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Посмотрите что должно содержаться в буфере до и что будет послевызова ф-ции 0a int 21h.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.11.2009, 13:19   #3
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

вы подробнее про буфер почитайте у функции
Код:
 mov      ah, 0ah			;функція введеня рядка
 int        21h
http://www.codenet.ru/progr/dos/dos_0018.php
если не разберетесь сами поясним
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 13.11.2009, 15:49   #4
lordus
 
Регистрация: 12.11.2009
Сообщений: 3
По умолчанию

Результата я достиг, теперь я слаживаю два одноразрядных числа. Я понял ,что нужно то что введено с клавиатуры нужно записывать со смещением, начиная с третьего символа.
Я не совсем понял что означает " MAX - максимально допустимая длина ввода (от 1 до 254)"
Цитата:
+---+---+---+---+---+---+- - -
¦max¦ ? ¦ ? ? ? ? ? MAX - максимально допустимая
+---+---+---+---+---+---+ - - длина ввода (от 1 до 254)
при выходе буфер заполнен данными следующим образом:
+---+---+---+---+---+---+- - -
¦max¦len¦ T E X T 0dH LEN - действительная длина данных
+---+---+---+---+---+---+ - - без завершающего CR (здесь - 04H).
это максимальная длина которая объявляется в ".DATA" или это максимальная длина того что я могу ввести в одной строке не зависимо как оно будет сохранятся?

И еще один вопрос как правильно обнулять регистры?
Я воспользовался конструкцией:

Код:
and ax, 0000h
так же пользовался и таким вариантом:

Код:
mov ax, 0000h
но я заметил что используя and изменяются значения флагов в mov я такого не заметил (но мог плохо смотреть).
Существуют ли какие-то специальные функции-команнды обнуления регистров или в каждом конкретном случае нужно знать, что делает та или иная команда с флагами?



Мой код для "нащадків" может поможет кому-то:



Код:
;Программа складає два числа. Числа можуть бути від 1 до 9
.MODEL small
.STACK 100h
.DATA

	zaproshA	db 'vvedit neobhidne chyslo A - $'
	zaproshB	db 'vvedit neobhidne chyslo B - $'
	zaproshR 	db 'suma chysel - $'

	CR_LF  		db 13,10,"$"    ;значення закінчення строки та переведення коретки
	A           db 15 dup("$")
	B			db 15 dup("$")
	Result		db 15 dup("$")	

.CODE
Main:
;занесення всіх даних з .DATA до стеку "ds"
	mov ax, @Data
	mov ds, ax
	
;Друк запрошення
    mov	ah,	09h				;функція виведення на екран
    mov	dx, offset zaproshA
    int 21h
;введення ,ASCII символів 
	mov ah, 0ah	      		;функція введеня рядка
	mov	dx, offset A
    int 21h
;переведення строки - аналог /n	
	mov ah, 09h				;функція виведення на екран
    mov dx, offset CR_LF
    int 21h
	
;Друк запрошення
    mov	ah,	09h				;функція виведення на екран
    mov	dx, offset zaproshB
    int 21h
;введення ,ASCII символів 	
	mov ah, 0ah	      		;функція введеня рядка
	mov	dx, offset B
    int 21h
;переведення строки - аналог /n	
	mov ah, 09h				;функція виведення на екран
    mov dx, offset CR_LF
    int 21h

;додавання двох однорозрядних чисел
	and ax, 0000h			;обнуляєм регістр AX
	mov al, A+2				;записуємо в регістр AL дані з А зі зміщенням 2
	and bx, 0000h			;обнуляєм регістр BX
	mov bl, B+2				;записуємо в регістр bL дані з B зі зміщенням 2
	add al, bl				;додавання двох 16-их чисел
	aaa						;функція яка переводить 16-ий результат до 10-ого
	or  ax, 3030h			;переводимо результат з десяткової системи до ASCII
;записуємо резултат роботи функції "ААА"(який зберігається в AH та AL) в памйять послідовно
;спочатку AH потім AL, недопуская перестановку значень як у випадку з записом з 
;регістра AX до змінної резулт
	mov Result, ah			;записуємо результат з регістра Ah до пам*яті
	mov Result+1, al		;записуємо резултаьт з регістра Al до пам*яті зі зміщенням на один
	
	

;Друк запрошення
    mov	ah,	09h				;функція виведення на екран
    mov	dx, offset zaproshR
    int 21h
; Виведення на єкран результату
	mov ah, 09h				;функція виведення на екран
    mov dx, offset Result
	int 21h
	; переведення строки - аналог /n
    mov ah, 09h				;функція виведення на екран
    mov dx, offset CR_LF
    int 21h
	
;завершеня программи	
	mov	ax, 4c00h
    int	21h
END Main

Последний раз редактировалось lordus; 13.11.2009 в 15:52.
lordus вне форума Ответить с цитированием
Старый 13.11.2009, 16:10   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

MAX - это максимальное количество символов, которое даст ввести функция. Да просто попробуйте задать его сами да посмотрите.
Цитата:
И еще один вопрос как правильно обнулять регистры?
Была где-то темка в которой было около 20-30 способов обнулить eax
Почти всегда достаточно
Код:
xor ax,ax
тем более даже в интел вроде бы так рекомендуют обнулять регистры.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HELLO WORLD!!- непонятно некоторое Dimarik Общие вопросы C/C++ 5 16.10.2009 22:41
Непонятно.... IICuX123 Общие вопросы .NET 2 23.07.2009 10:27
непонятно StasSv Microsoft Office Excel 1 26.02.2009 14:16
принадлежит ли число, введённое с клавиатуры отрезку (а;в). Границы отрезка вводятся с клавиатуры Maria, Russia Помощь студентам 3 17.02.2009 22:01
что то непонятно sergei64_89 Общие вопросы C/C++ 9 25.05.2008 16:58