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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 17:12   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Код:
title sum_float
      .MODEL LARGE 
      .286C ;разрешены непривилегированные команды 80286
      .stack 100h      ; размер стека 256 байт
.data
     InputFirst db "Input the First number: $"
     InputSecond db "Input the Second number: $" 
.code
START:
	call ClearScreen
	
	mov ax, @data
	mov ds, ax
				
	mov AH, 9h
	lea DX, InputFirst
	int 21h
	mov ax, 4c00h
	int 21h
      
      
        ClearScreen proc near ;процедура очистки экрана
		mov ax, 03h
		int 10h
	ClearScreen endp
	
	NewString proc near ;переход на новую строку
		mov     ah, 02h
        	mov     dl, 0Dh
        	int     21h
        	mov     dl, 0Ah
        	int     21h
	NewString endp
END START
END
Если убрать вызов функции ClearScreen то все прекрасно работает...

По дебаггеру он сразу после ClearScreen лезет в NewString...но почему???
З.Ы надо было написать ret в конце процедуры...
З.Ы.Ы но все равно после прохода программы он опять лезет в clearscreen...

Пытаюсь добавить ввод числа...
Код:
TITLE sum_float
      .Model TINY 
      .286C ;разрешены непривилегированные команды 80286
      .Stack 100h      ; размер стека 256 байт
.data
     InputFirst db "Input the First number: $"
     InputSecond db "Input the Second number: $"
     
     first	db 12 dup(0) ;первое число
     second	db 12 dup(0) ;второе число
     result db 12 dup(0) ;результат 
.code
START
	CALL ClearScreen

	MOV AX, @data
	MOV DS, AX
				
	MOV AH, 9h
	LEA DX, InputFirst
	INT 21h
	MOV AH, 0AH
	LEA DX, first
	INT 21h     

      ClearScreen Proc Near ;процедура очистки экрана
		MOV AX, 03h
		INT 10h
		RET
	ClearScreen EndP
	
	NewString Proc Near ;переход на новую строку
		MOV     AH, 02h
        	MOV     DL, 0DH
        	INT     21h
        	MOV     DL, 0AH
        	INT     21h
        	RET
	NewString EndP
END START
END
Мало того что он лезет в клирскрин так еще и с ошибкой вылетает, не записывая число в first...

Изменение 1: помещаем перед int 21h в конце mov ax, 4c00h и оно не вылетает... Но ввод числа не работает

Блин, что я должен сделать чтобы поместить в first результат ввода?

Последний раз редактировалось Stilet; 10.04.2011 в 19:08.
[MI_nor] вне форума Ответить с цитированием
Старый 10.04.2011, 19:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ClearScreen proc near ;процедура очистки экрана
mov ax, 03h
int 10h
ClearScreen endp
А что инструкцию ret уже отменили?
Ты же из процедуры не выходишь как надо:
Код:
        ClearScreen proc near ;процедура очистки экрана
		mov ax, 03h
		int 10h
                ret
	ClearScreen endp
И на остальных тоже самое.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2011, 19:14   #3
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Ну каюсь, но это я уже исправил как вы видели
[MI_nor] вне форума Ответить с цитированием
Старый 10.04.2011, 19:40   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как вы видели
Хы... Добавил говоришь?
Цитата:
LEA DX, first
INT 21h
А тут? Почему тут не добавил?
ClearScreen Proc Near ;процедура очистки экрана
MOV AX, 03h
INT 10h
RET
ClearScreen EndP
Это ответ на вопрос "он опять лезет в clearscreen"
Правильно лезет - никто его не останавливает.
Насчет ввода числа - ты то его вводишь как строку, если не опшибаюсь его еще и преобразовывать придется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2011, 20:07   #5
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Эм, там я перед int 21h добавил mov ax, 4c00h и он благополучно выходил из программы...не знаю правильно это или нет. А на счет ввода, мне необходимо ввести 10иразрядное десятичное число, нашел вот такую процедуру...
Код:
infloat proc near ;ввод числа
      	push  ax
      	push  dx
      	push  si
		
		; Формируем кадр стэка, чтобы хранить десятку и ещё какую-нибудь цифру.
        	push  bp
        	mov   bp, sp
        	push  10
        	push  0
		
		; В SI признак знака.
        	xor   si, si
		xor 	cx,	cx
		
		; Начнём накапливать число. Сначала это ноль.
        	fldz
		
		; Вводим первый символ. Это может быть минус.
        	mov   ah, 01h
        	int   21h
        	cmp   al, '-'
        	jne   @if1
			; Если это действительно минус, запоминаем это
			; и вводим следующую цифру.
        		inc     si
			inc len
		@if0: 
			mov  ah, 01h
        		int 21h
			inc cx
		@if1:   
			;проверим, что ввели цифру
			; (в противном случае закончим ввод),
		
        		cmp al, 39h
        		ja  @if5
        		sub al, 30h
        		jb  @if5
			; сохраним её во временной ячейке и допишем
			; к текущему результату справа,
        		mov [bp - 4], al
			; то есть умножим уже имеющееся число на десять
        		fimul   word ptr [bp - 2]
			; и прибавим только что обретённую цифру.
        		fiadd   word ptr [bp - 4]
			; И так, пока не надоест.
			cmp cl,len
			ja	@if5
        		jmp     @if0

        		;jb      @if4

			;@if4:   fstp    st(0)
			; Итак, на вершине стэка получено введённое число.
			; Осталось разве только перейти на новую строку
		@if5:   
			call NewString
			; и вспомнить про знак.
			cmp si,0
			ja metka  
			rezum:  test    si, si
        		jz      @if6
        		fchs
		@if6:   
			leave
        		pop     si
        		pop     dx
        		pop     ax
        	ret
		metka:  
			dec len		
      		jmp rezum
	infloat endp
Но не знаю как полученный результат поместить в переменную first...
[MI_nor] вне форума Ответить с цитированием
Старый 10.04.2011, 20:13   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если не ошибаюсь команда
fstp first выгрузит из сопроцессора это вещественное число.
Вот только не скажу куда ее лепить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2011, 20:46   #7
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Хотя в принципе это ненужно...Результат ведь будет храниться в ST(0).
Но результат находится в виде ЧФТ, мне-же нужно ЧПТ. Есть ли команды для перевода?
[MI_nor] вне форума Ответить с цитированием
Старый 10.04.2011, 21:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
мне-же нужно ЧПТ
что это за звэрь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2011, 21:30   #9
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
что это за звэрь?
Число с плавающей точкой
[MI_nor] вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA не пойму почему не скрипт читает второе сообщение Drek Помощь студентам 0 20.07.2010 01:06
Не выводится изображение risc HTML и CSS 9 11.05.2010 15:16
Сообщение из условия не выводится kta87 Помощь студентам 2 01.03.2010 22:28
сообщение не выводится(echo) ERASERROR PHP 26 27.01.2008 02:13