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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2010, 16:31   #1
PEro_man
 
Регистрация: 30.11.2010
Сообщений: 4
По умолчанию Сложение двух десятичных положительных чисел. целых чисел)))

Люди помогите плз)
не могу понять некоторые куски кода что делают я тут закоментил, что понял) можете закоментить что выделил?? и если что ещё можно удалить скажите плз)
вообще это был калькулятор. я из него вырезал, всё что посчитал лишним)
ну на самом деле вырезал лишнего: программа перестала работать, когда второе число длиннее первого) но это надеюсь не заметит препод) главное закоментите пожалуйста)
Код:
assume cs:code,ds:data
code segment 'code'
 myproc1 proc
	stdout=1 
	stdin=0
	inp_max_len=19
	priv1len=23
	priv2len=25
	privlen=22
	rezlen=18
	[U][B]cr equ 13
	lf equ 10  как понял это для стека?

        mov ax,data
        mov ds,ax инициализация сегмента дата. а почему нельзя просто сразу в mov ds, data ? 

	mov ah,40h		;vivod 'vvedite pervoe' 
	mov bx,stdout
	mov cx,priv1len
	mov dx,offset priv1
	int 21h

	mov si,offset dig1	;v si adres 1-ogo chisla
 	mov bx,0		;vvod pervogo chisla

	call input_digit
	mov dig1len,bx		;zapominaem dlinu vtorogo vvedennogo
	
	
	mov ah,40h		    ;vivod 'vvedite vtoroe chislo'
	mov bx,stdout
	mov cx,priv2len
	mov dx,offset priv2
	int 21h

	mov bx,0		
	mov si,offset dig2	;v si adres 2-ogo chisla
	call input_digit	;na vvod
	mov dig2len,bx		;zapominaem dlinu chisla
	
	mov di,offset dig2
	mov si,offset dig1
	call prov
	call prog_exit
 myproc1 endp

 input_digit proc

inp_dig1:
	mov ah,07h		;posimvol'nii vvod(bez eha)
	int 21h			;v al vvedennii simvol
	cmp al,0Dh		;esli najat "Enter" to zakanchivaem vvod
	je dig1_end
	mov tmp,al		   ;zapominaem v tmp vvedennii simvol
	call dig_nodig_len ;proveryaem vvedennii simvol na prinadlejnost' cifre
	js inp_dig1		   ;esli ne cifra to vvodim zanovo
	call pr_simb	   ;esli cifra to otobrajaem na ekran
	mov al,tmp
	mov [si][bx],al
	inc bx			;uvelichivaem index
	jmp inp_dig1		;na vvod sleduyuschego

dig1_end:
		ret
 input_digit endp

 prog_exit proc
	mov ax,4c00h
	int 21h
 prog_exit endp

 dig_nodig_len proc		;funkciya proverki vvedennogo simvola na cifru
	mov al,inp_max_len	;zaodno proveryaem ne previshaem li dlinna
	sub ah,ah		;vvedennogo chisla maximal'no vozmojnuyu
	sub ax,bx
	js nodig		;esli da to ne vivodim simvol
	mov al,tmp		;proveryaem popadaet li ascii kod vvedennogo simvola
	sub al,30h		;v diapazon ot 30h('0') do 39h('9')
	js nodig
	mov al,39h
	sub al,tmp

nodig:	ret
 dig_nodig_len endp


 prov proc
	call pmaxlen
	jz summa
	call prepare_op
summa:	
	mov al,[si][bx-1] ;
	sub al,30h		   ;preobrazuem soderjimoe registrov iz 3nh v 0nh
	mov ah,[di][bx-1]
	sub ah,30h
	add al,ah		;summiruem
	xor ah,ah
	mov dl,10		;razdelyaem ax na: v ah mladshii razryad summi, ...
	div dl			;v al starshii(0 ili 1)
	add ah,30h		;preobrazuem v ascii kod
	add ah,dh		;uchitivaem perenos edinici v starshii razryad
	mov dh,al		;zapomenaem v dl bil perenos(dl=1h) ili net(dl=0)
	cmp ah,':'		;dlya sluchaya esli perenos starshego razryada summi ...
	jnz prop1		;proishodit neskol'ko raz podryad
	sub ah,9h		;preobrazovanie v nujnoe nam chislo
	dec ah
	mov dh,1h		;ukazivaem chto est' perenos '1' v starshii razryad
prop1:	mov rez[bx-1],ah	;zapisivaem rezul'tat
	dec bx
	loop summa
	call pr_rez
	ret

 prov endp

 pr_rez proc

	mov ah,40h		; vivod "rezultat"
	mov bx,stdout
	mov cx,rezlen
	mov dx,offset res
	int 21h

	mov ah,40h		;vivod rezul'tata
	mov bx,stdout
	mov cx,maxlen
	mov dx,offset rez
	int 21h
	ret
 pr_rez endp

 pr_simb proc
	mov dx,offset tmp	
	mov ah,09		;funciya vivodit vse podryad poka ne vstretit simvol '$'
	int 21h
	ret
 pr_simb endp

 prepare_op proc
	mov cx,maxlen аще не понял для чего(
	mov bx,cx
	mov dx,0
	mov ax,0
	ret
 prepare_op endp

 pmaxlen proc
	mov ax,dig1len		;opredelyaem maximalnuu dlinu
	sub ax,dig2len
	js msecmax
	cmp ax,0
	jz end_maxlen
	mov ax,dig1len		;esli 1 dlinee
	mov maxlen,ax
	push maxlen
	mov cx,dig2len
preobr1:			;perenosim chislo v konec stroki
	mov bx,cx
	mov al,[di][bx-1]
	mov bx,maxlen
	mov [di][bx-1],al
	dec maxlen
	loop preobr1
	pop ax
	mov maxlen,ax
	sub ax,dig2len
	mov cx,ax
	sub bx,bx
	mov al,'0'
pr1:	mov [di][bx],al		;do chisla vse nuli а зачем это?) 
	inc bx
	loop pr1

	ret

end_maxlen:
	mov ax,dig1len
	mov maxlen,ax

	ret

msecmax:
	mov ax,dig2len		;elsi vtoroe dlinee
	mov maxlen,ax
	push maxlen
	mov cx,dig1len
	ret
 pmaxlen endp ну как я понял эта часть и вообще pmaxlen proc  просто преобразовывает, а проверки на то какая строка длиннее. тут нет. ) они вообще нужны.

code ends

data segment 
priv1 db 'vvedite pervoe chislo',cr,lf
priv2 db cr,lf,'vvedite vtoroe chislo',cr,lf
res db cr,lf,'rezultat raven',cr,lf
dig1 db 21 dup(?)
dig2 db 21 dup(?)
rez db 20 dup('0')
dig1len dw 0
dig2len dw 0
maxlen dw ?
tmp db 00,'$'
data ends

stk segment stack
        db 256 dup(?)
stk ends
end
заранее спасибо)

Последний раз редактировалось PEro_man; 30.11.2010 в 23:14.
PEro_man вне форума Ответить с цитированием
Старый 30.11.2010, 17:23   #2
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Почитай для понимания:
http://asmworld.ru/uchebnyj-kurs/009...-i-vychitanie/
oleg.v вне форума Ответить с цитированием
Старый 30.11.2010, 20:28   #3
PEro_man
 
Регистрация: 30.11.2010
Сообщений: 4
По умолчанию

ок, спасибо) я конечно постараюсь разобраться) но если кто то может помочь с этим напишите. вот)
просто время очень ограниченно, надо на этой неделе сдать.
PEro_man вне форума Ответить с цитированием
Старый 30.11.2010, 20:40   #4
PEro_man
 
Регистрация: 30.11.2010
Сообщений: 4
По умолчанию

эмм... учебный курс на который ссылка предполаает использование FASM-a а мне нужен TASM или MASM... есть что нить подобное для этого?
PEro_man вне форума Ответить с цитированием
Старый 01.12.2010, 11:38   #5
PEro_man
 
Регистрация: 30.11.2010
Сообщений: 4
По умолчанию

С ПРОГРАММОЙ РАЗОБРАЛСЯ!
Остался только один вопрос! про mov ds, data почему так нельзя сделать?
PEro_man вне форума Ответить с цитированием
Старый 01.12.2010, 12:34   #6
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Нет такой команды(двоичного кода операции) в наборе команд X86.
Я где-то читал, что такая команда была недокументированной в ранних 8086, но потом ее убрали.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 01.12.2010, 12:40   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

alexcoder не выдумывайте -- такого даже в i8080 не было
PEro_man в сегментный регистр (ds, es, ss, fs, gs) можно передать данные
1) или через регистр (ax, bx, cx, dx, si, di, bp) (mov ax,100 / mov ds,ax)
2) или через стек (push 100 / pop ds)
3) или командой LDS/LES/LFS/LGS/LSS (Load pointer into ds/es/fs/gs/ss segment register) -- Загрузка сегментного регистра ds/es/fs/gs/ss указателем из памяти

Последний раз редактировалось Mikl___; 01.12.2010 в 12:43.
Mikl___ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jпределить число соседств двух положительных чисел FinKeRosiN Помощь студентам 1 07.10.2010 22:06
Ввести ФАЙЛ целых положительных чисел F1 looloo Помощь студентам 7 06.04.2010 10:08
ПАСКАЛЬ-цифры двух десятичных целых чисел Анна Попова Помощь студентам 6 22.11.2009 09:50
сложение двух чисел pif Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 18 15.02.2009 12:51
Вывод целых и десятичных чисел Maycal Общие вопросы C/C++ 2 24.10.2007 12:34