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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2010, 16:50   #1
Alex1991
Форумчанин
 
Аватар для Alex1991
 
Регистрация: 18.10.2008
Сообщений: 166
Вопрос Ввод отрицательных чисел в Ассемблере

Нужно к примеру ввести число -7
Если использовать функцию ниже то получиться ввести только одну клавишу .
Как правельнее сделать?
Ну вот я например хочу ввести число нажать Enter и тд. а так получаеться считать одну клавишу
Код:
	mov ah, 1	; ah <- 1 (первая функция DOS - считывания символа с клавиатуры)
		        ; ASCII-код нажатой клавиши записывается в al
	int 21h		; Сделать вызов данной функции
	mov [mas], al ;запись в массив [0]
Alex1991 вне форума Ответить с цитированием
Старый 30.10.2010, 17:44   #2
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

А если цифру вычитать из нуля?
Sasha_Smirnov вне форума Ответить с цитированием
Старый 30.10.2010, 18:15   #3
Alex1991
Форумчанин
 
Аватар для Alex1991
 
Регистрация: 18.10.2008
Сообщений: 166
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
А если цифру вычитать из нуля?
да мне просто подскажите, как ввести с клавиатуры отрицательное число.
просто эта функция принимает одно нажатие клавиши и записивает в регистр AL тоисть я могу только кнопку минус " - " а после минуса цифру уже не введу

Последний раз редактировалось Alex1991; 30.10.2010 в 18:18.
Alex1991 вне форума Ответить с цитированием
Старый 30.10.2010, 18:45   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

ну введите 2 символа. если первый будет минус, то сделайте второй отрицательным числом.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 30.10.2010, 19:09   #5
Alex1991
Форумчанин
 
Аватар для Alex1991
 
Регистрация: 18.10.2008
Сообщений: 166
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
ну введите 2 символа. если первый будет минус, то сделайте второй отрицательным числом.
а если число будет типа -12, то получиться что я считаю -1
Alex1991 вне форума Ответить с цитированием
Старый 30.10.2010, 19:16   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

ну дак встретили минус, запомнили его например присвоили di единицу, считаете число как положительное, а затем проверяете если di = 1 выполняете neg
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 30.10.2010, 19:26   #7
Alex1991
Форумчанин
 
Аватар для Alex1991
 
Регистрация: 18.10.2008
Сообщений: 166
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
ну дак встретили минус, запомнили его например присвоили di единицу, считаете число как положительное, а затем проверяете если di = 1 выполняете neg
Не могли бы вы показать как на коде реализовать ? Вообщем нужно заполнить одномерный массив елемантами, елементы могут также быть отрицательные.
А разве нет такой функции которая запишет елемент после нажатия Enter, ну например ввел -25 нажал ентер и так дальше с другими елементами массива ?
Alex1991 вне форума Ответить с цитированием
Старый 30.10.2010, 19:36   #8
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

нужно кодить это самостоятельно...
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 30.10.2010, 19:36   #9
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
.model small
.data
str1	db 13,10,'введите первое число: $'
str2	db 13,10'введите второе число: $'
n1	dw 0
n2	dw 0
buf1	db 13,10,10 dup('$')
.stack 256
.code
start:
	mov ax,@data	;настраиваем сегментные регистры
	mov ds,ax
	mov es,ax
	mov dx, offset str1
	call InputNumber
	mov n1,ax
	mov dx, offset str2
	call InputNumber
	mov n2,ax
	add ax,n1
	lea di,buf1+2
	call printdec
	lea dx,buf1+2
	mov ah,9
	int 21h
	
ex:	mov ax,4c00h	;выход из программы
	int 21h


str2dw	proc
			;Преобразование строки в число
			;на входе ds:si ссылается на ASCIIZ строку, которую нужно преобразовать
			; на выходе в ax - число.
	push bx
	push dx
	push si
	xor bx,bx
	xor dx,dx	;сумма
@lp1:	xor ax,ax
	lodsb		;берем чимвол
	test al,al	;если это нулей байт, то заканчиваем
	jz @ex
	cmp al,'-'	;если минус, то устанавливаем признак минуса
	jnz @m1
	mov bx,1
	jmp @lp1
@m1:	cmp al,'9'	;Если это не цифра, то пропускаем
	jnbe @lp1
	cmp al,'0'      ;Если это не цифра, то пропускаем
	jb @lp1
	sub ax,'0'	;получаем цифровое значение
	shl dx,1	;умножаем сумму на 10
	add ax, dx
	shl dx, 2
	add dx, ax	;прибавляем текущее значение
	jmp @lp1
@ex:	test bx,bx	;если установлен признак отрицательного числа
	jz @ex1
	neg dx		;то меняем знак
@ex1:	mov ax,dx
	pop si
	pop dx
	pop bx
	ret
str2dw	endp

InputNumber	proc	; функция выводит на экран сообщение и ожидает ввода числа
			; ds:dx - сообщение, которое следует вывести
			; возвращает:
			; ax - введенное число
	push dx		; сохраняем регистры
	push si
	push di
	mov ah,9
	
	int 21h
	mov ah,0ah	
	mov dx,offset buf
	int 21h		;пользователь вводит в текстовом виде в buf значение элемента массива
	mov di,offset buf+1
	mov al,[di]	;берем длину введенной строки
	mov ah,0	;ах=длине
	inc di	;начало введенной строки в памяти
	mov si,di		;сохраняем это значение
	add di,ax               ;конец введенной строки в памяти                 
	mov [di],byte ptr 0     ;ставим нулевой байт за последним символом строки
	call str2dw		;преобразовываем строку в значение
	pop di		;восстанавливаем регистры
	pop si
	pop dx
	ret
buf 	db 8, 10 dup(0)	;принимает строку, введенную с клавиатуры
InputNumber	endp



printdec proc	;преобразование числа из ах в десятичную строку по адресу es:di
		;ax - число
		;es:di - адрес буфера приемника
	push cx	;сохраняем регистры
	push dx
	push bx
	mov bx,10	;основание системы
	XOR CX,CX	;в сх будет количество цифр в десятичном числе
@@m1:	XOR dx,dx
	DIV bx		;делим число на степени 10
	PUSH DX		;и сохраняем остаток от деления(коэффициенты при степенях) в стек
	INC CX
	TEST AX,AX
	JNZ @@m1
@@m2:	POP AX
	ADD AL,'0'	;преобразовываем число в ASCII символ
	STOSb		;сохраняем в буфер
	LOOP @@m2		;все цифры
	pop bx		;восстанавливаем регистры
	POP dx
	POP cx
	RET
printdec endp


end start 



end
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание с файла отрицательных чисел trinki Общие вопросы C/C++ 2 01.10.2010 01:39
Пщдсчет отрицательных чисел в массиве Ehha1234 Паскаль, Turbo Pascal, PascalABC.NET 2 04.06.2010 12:41
Замена отрицательных чисел нулями DasV Помощь студентам 0 30.04.2010 00:42
Перевод отрицательных чисел в двоичную систему ioda1986 Помощь студентам 1 24.02.2010 00:55
Паскаль.Файлы.удаление отрицательных чисел NEMO1991 Помощь студентам 3 06.06.2009 00:38