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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2011, 09:44   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию из 16 разрядной в 32

Необходимо переписать программу, которая умножает 2 числа не используя команду mul из 16 разрядной в 32, пробовала просто увеличить разрядность регистров, не получается. Как правильно это сделать? Вот код 16 разрядной:
Код:
.model tiny
.code
org 100h
main:
;========================================================================
;инициализация данных
;========================================================================
	call input
	mov arg1,ax
	
	call input
	mov arg2,ax
 	
;========================================================================
;запоминание знака
;========================================================================	
	xor bx,bx
	mov ax,arg1
	test ax,ax
	jns next_arg	;если положительное переходим на обработку второго
	inc bx
	neg ax
	mov arg1,ax

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

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

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


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

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

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

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



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

end main
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 28.02.2011, 10:01   #2
VadikV
Форумчанин
 
Аватар для VadikV
 
Регистрация: 08.01.2011
Сообщений: 226
По умолчанию

Код:
cyc:
	add ax,arg1
	loop cyc
вместо AX используй EAX. Ну и в остальных местах при работе с 32-х разрядными числами аналогично замени имена регистров.
icq 223-630-454
e-mail vysotskiy@list.ru
сайт http://www.big-library.net/
VadikV вне форума Ответить с цитированием
Старый 28.02.2011, 10:30   #3
Ant1971on
Пользователь
 
Регистрация: 20.07.2010
Сообщений: 52
По умолчанию

Поставить директиву .386 в начале программы, тогда можно будет использовать расширенные регистры.
Ant1971on вне форума Ответить с цитированием
Старый 28.02.2011, 10:39   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

да делала я это, кроме того в определенных местах нужно еще и использовать dword ptr, но выдает ошибку 32-bit record encountered in module
Вот кусок:
Код:
.model tiny
.code
.386
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 dx,0ah
	mov ax,02h
	int 21h
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 28.02.2011 в 10:44.
Sparky вне форума Ответить с цитированием
Старый 28.02.2011, 14:35   #5
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Sparky, напишите вместо
Код:
endp input
endp output

input endp
output endp
, и измените регистры на 32-разрядные там, где используете
Код:
offset
. Ну и .386 не забудьте.
vadimych вне форума Ответить с цитированием
Старый 28.02.2011, 16:33   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

может кто-нибудь уже даст дельный совет?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 28.02.2011, 17:01   #7
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

С указанными мной выше поправками Ваша, Sparky, программа у меня скомпилировалась без ошибок. Вот архив.
Вложения
Тип файла: rar 12.rar (2.1 Кб, 9 просмотров)

Последний раз редактировалось vadimych; 28.02.2011 в 17:05.
vadimych вне форума Ответить с цитированием
Старый 28.02.2011, 18:07   #8
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

странно у меня не компилится, параметры tlink у Вас какие?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 28.02.2011, 18:23   #9
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Я masm компилировал.
vadimych вне форума Ответить с цитированием
Старый 28.02.2011, 18:25   #10
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

хм программа поидее под TASM
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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