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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2011, 18:29   #11
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Вообще говоря, я не понимаю, как Вы хотите использовать в 16-ти разрядной OS 32-х разрядные регистры.
vadimych вне форума Ответить с цитированием
Старый 28.02.2011, 18:34   #12
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

...........
vadimych вне форума Ответить с цитированием
Старый 01.03.2011, 03:08   #13
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

-Переделал цикл на eax
-переделал процедуру output на 32-х разрядный регистр (опять таки еах)
Остальное без изменений.
Вообще забавно, если директиву .386 поместить перед .model, тогда линковщик ругается "32-bit record encountered in module". А если после, то нормальненько вроде так всё.
В итоге скомпилировалось, вроде даже работает, вроде даже правильно работает. По крайней мере:

Цитата:
C:\main_assembler\DOS_TASM_progi\pr oga60>PROGA60.COM
32765
24
786360
Проверялось всё под XP.
Вложения
Тип файла: rar proga60.rar (2.3 Кб, 8 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 01.03.2011, 03:44   #14
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Ulex
если ставить .386 перед .model тогда линковщику нужно указывать другие ключи, например /3 , в тексте программ я подставляю там, где нужно db 66h или db 67h
Mikl___ вне форума Ответить с цитированием
Старый 01.03.2011, 06:45   #15
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Тупил вчера. Прошу прощения. Убрал из исходного кода лишнее, расширив диапазон вводимых чисел до 65535.
Вложения
Тип файла: rar aa.rar (1.6 Кб, 14 просмотров)

Последний раз редактировалось vadimych; 01.03.2011 в 08:39.
vadimych вне форума Ответить с цитированием
Старый 01.03.2011, 06:49   #16
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
.model tiny
.386
.code
org 100h
main:
;========================================================================
;инициализация данных
;========================================================================
	call input
	mov dword ptr arg1,eax
	
	call input
	mov dword ptr arg2,eax
 	
;========================================================================
;запоминание знака
;========================================================================	
	xor ebx,ebx
	mov eax, dword ptr arg1
	test eax,eax
	jns next_arg	;если положительное переходим на обработку второго
	inc ebx
	neg eax
	mov dword ptr arg1,eax

next_arg:
	mov eax, dword ptr arg2
	test eax,eax
	jns mul_args	;если положительное переходим на выполнение умножения
	inc ebx
	neg eax
	mov dword ptr arg2,eax
;========================================================================
;умножение через сложение
;========================================================================	
mul_args:
	mov dword ptr znak,ebx
	mov ecx,dword ptr arg2
	xor eax,eax
	
cyc:
	add ax,arg1
	loop cyc
;========================================================================
;возврат знака
;========================================================================		
	mov ebx,dword ptr znak
	test ebx,1
	jz out_res
	neg eax
;========================================================================
;вывод результата
;========================================================================					
out_res:
	call output
	ret
 	
;========================================================================
;процедура ввода	
;========================================================================
input proc near
	xor eax,eax
	xor edx,edx
	xor ebx,ebx
	xor edi,edi
	mov ah,0ah
	mov edx,offset buff ; адрес буфера
	int 21h 
	
;перевести строку
	mov edx,0ah
	mov eax,02h
	int 21h 
	
; обрабатываем содержимое буфера
	mov esi,offset buff+2 ;адрес начала строки
	cmp byte ptr [esi],0dh
	je _err 
start:
	cmp byte ptr [esi],"-" ; если первый символ минус
	jnz _poloz	;в противном случае перейти на обработку положительных
	mov edi,1  ; устанавливаем флаг
	inc esi    ; переходим на следующее
_poloz:
	xor eax,eax
	mov ebx,10  ; основание системы счисления
	
	push esi
	mov cl,[esi]
	cmp cl,30h	;если не ноль все будет так как было
	jne loading
	
	cmp edi,1	;фильтр ситуации -0
	je _err
	
	inc esi
	mov cl,[esi]
	cmp cl,0dh
	jne _err
loading:
	pop esi
_perevod:
	mov cl,[esi] ; берем символ из буфера
	cmp cl,0dh  ; проверям равен ли символ переводу строки
	jz _endin	;перейти на конец обработки
	
; если символ не последний, то проверяем его на правильность
	cmp cl,30h  ; если введен неверный символ <0
    	jl _err	
    	cmp cl,39h  ; если введен неверный символ >9
    	ja _err

	sub cl,30h ; делаем из символа число 
	mul ebx     ; умножаем на 10
	jc _err
	add eax,ecx  ; прибавляем к остальным
	jc _err
	inc esi     ; переходим на следующее число

	cmp edi,1
	je srav_32768
	cmp eax,32767
	ja _err
	jmp _perevod	; повторяем
srav_32768:
	cmp eax,32768
	ja _err	
	
	jmp _perevod	; повторяем


; если была ошибка, то выводим сообщение об этом и выходим
_err:
	mov edx, offset error
	mov ah,09
	int 21h
	int 20h

; все символы из буфера обработаны число находится в ax
_endin:
	
	cmp edi,1 ; если установлен флаг, то
	jnz _endp
	neg eax   ; делаем число отрицательным
	
_endp:	
	ret
 endp  input

;========================================================================
;процедура вывода
;========================================================================
output proc near  
;; Проверяем число на знак.
        test    eax, eax
        jns     @oi1

;; Если оно отрицательное, выведем минус и оставим его модуль.
	push	eax
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop 	eax
        neg 	eax
        
;; Количество цифр будем держать в CX.
@oi1:  
        xor     ecx, ecx
        mov     ebx, 10
@oi2:   
       xor edx,edx
       div ebx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    edx
        inc     ecx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
        test    eax, eax
        jnz     @oi2
; Теперь приступим к выводу.
        mov     ah, 02h
@oi3:   pop     edx
; Извлекаем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
        loop    @oi3
	ret
output endp 



error db "Введено не число$"
buff	db 255,255 dup(?)
arg1 dw ?
arg2 dw ?
znak dw ?

end main
Вот только теперь не работает завершается после первого ввода числа
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 01.03.2011, 16:16   #17
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Ну тут-то все просто...
Код:
;перевести строку

	mov edx,0ah

	mov eax,02h

	int 21h
В ah будет 0, а не 2. А это код функции завершения программы.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 01.03.2011, 18:42   #18
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Sparky, я, честно говоря, перестал ваше задание понимать.

Вы целеноправленно пытаетесь использовать расширенные регистры там, где этого не надо делать (прерывания ДОС, процедура input). И вместе с тем не хотите использовать их там, где нужно (сам цикл сложения).

В связи с этим вопросы:
-Что значит переделать из 16ти в 32-х битную? Может на выходе уже пора PE (Win32 + .model flat) получить, а не COM?
-Какой диапазон входных значений, ну и выходных?

Mikl___
Всё равно убей не пойму. Что меняется от перестановки этих двух директив местами. Они вроде бы не взаимоисключающие, или я совсем глупый.

Цитата:
в тексте программ я подставляю там, где нужно db 66h или db 67h
Скажи, пожалуйста, зачем?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


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