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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2009, 20:38   #1
Bercut48rus
Новичок
Джуниор
 
Регистрация: 10.12.2009
Сообщений: 1
По умолчанию Помогите разобраться с программой

Увы не могу отследить куда девается переменная которую мы переводим в строку и некоторые команды совсем не ясны, если хоть бы кто-нибудь мог разжевать эту прогу...
У меня голова пухнеть просто ...
Пожалуйста. (Для компиляции использую tasm, tlink, td (Компилятор, линковщик и турбодебагер (как раз не могу им растрассировать последовательность действий));
Код:
.model tiny
.stack 256h
.code
.386
jmp @start ;ббл«Є* ** **з*«® Їа®Ја*¬¬л
;®Ўкпў«Ґ*ЁҐ ЇҐаҐ¬Ґ**ле
Request       db '‚ўҐ¤ЁвҐ X = $'
Input         db 8,0, 9 dup (0)
Ten           dd 10.0
Value         dq ?
Result        db 13,10,'ђҐ§г«мв*в Y = '
ResultValue   db 25 dup(0)
AddConst      dd -1.0




StrToFloat proc near ;Їа®жҐ¤га* ЇҐаҐў®¤* бва®ЄЁ ў зЁб«®
;‚室 DS:SI ¬Ґбв® еа**Ґ*Ёп ўўҐ¤Ґ**®© бва®ЄЁ
pusha ;б®еа**Ґ*ЁҐ ўбҐе ॣЁбва®ў ў б⥪
push es ;¤®Ў*ў«Ґ*ЁҐ ў б⥪ es
; ** ўе®¤Ґ DS:SI - *¤аҐб ўе®¤*®© бва®ЄЁ
; ўл室 ў ST(0) - зЁб«®
movzx cx, [si+10] ;ЇЁиҐ¬ б 㢥«ЁзҐ*ЁҐ¬ а*§¬Ґа* ў cx §**зҐ*ЁҐ ўўҐ¤Ґ**®© бва®ЄЁ  
inc cx
add si, 2
mov di, si
mov ax, ds
mov es, ax
cld                  ; ®Ўа*Ў*влў*Ґ¬ бва®Єг	 б **з*«* 
mov bx, cx
mov al, '.' ;ЇҐаҐб«*«Ё в®зЄг 
repnz scasb
sub bx, cx
sub bx, 2
dec di
movzx cx, [si-1]
fld1
sub dh, dh
cmp [si], byte ptr '-' ;Їа®ўҐаЁ«Ё **«ЁзЁҐ §**Є (Ґбвм ¬Ё*гб Ё«Ё *Ґв)
jnz @stf_positive   
mov dh, 1 
dec cx
dec bx
inc si
@stf_positive:
or bx, bx
jz @stf_floatpart
fmul Ten
dec bx
jmp @stf_positive 
@stf_floatpart:
fstp @STF_Multiplier
fldz
@stf_loop:
cmp si, di
jz @stf_point
movzx ax, byte ptr [si]
sub al, 30h
mov @stf_digit, ax ;бЎ®а зЁб«* ў ўҐаиЁ*г б⥪*
fild @stf_digit
fmul @STF_Multiplier
fadd
fld @STF_Multiplier
fdiv Ten
fstp @STF_Multiplier
@stf_point:
inc si
dec cx
jnz @stf_loop
cmp dh, 1
jnz @stf_exit
fchs
@stf_exit:
pop es
popa
ret
@STF_Multiplier dd ? 
@STF_Digit      dw ?
StrToFloat endp


FloatToStr proc near ;Їа®жҐ¤аг* ЇҐаҐў®¤* зЁб«* ў бва®Єг
pushad
movzx bp, dl
add bp, di
fnstcw @fts_cw
fwait
or @fts_cw, 0f00h
fldcw @fts_cw
fldz
fcomp
fstsw ax
test ax, 100h
jnz @fts_positive
fchs
mov [di], byte ptr '-' ;Ґб«Ё зЁб«® ®ваЁж*⥫м*® в® бв*ўЁ¬ ¬Ё*гб
inc di
@fts_positive:
fist @FTS_IntegerPart
mov eax, @FTS_IntegerPart
mov ebx, 10
sub ch, ch
@fts_int1:
sub edx, edx
div ebx
push dx
inc ch
or eax, eax
jnz @fts_int1
@fts_int2:
pop ax
add al, 30h
mov [di], al
inc di
dec ch
jnz @fts_int2
fisub @FTS_IntegerPart
mov [di], byte ptr '.' ;®ЇаҐ¤Ґ«Ґ*ЁҐ ¤а®Ў*®© з*бвЁ
inc di
@fts_loop:
cmp bp, di
jz @fts_exit
fmul Ten
fist word ptr @FTS_IntegerPart
fisub word ptr @FTS_IntegerPart
mov al, byte ptr @FTS_IntegerPart ;ЄЁ¤*Ґ¬ жЁдаг ў al
add al, 30h   ;Ї®«гз*Ґ¬ Ё§ *ҐҐ бЁ¬ў®« зЁб«® + 30
mov [di], al  ;ЇЁиҐ¬ ў бва®Єг
inc di        ;㢥«ЁзЁў*Ґ¬ бЁ¬ў®«м*л© бзҐвзЁЄ
jmp @fts_loop ;ў®§ўа*й*Ґ¬бп ў в® ¦Ґ ¬*бв®
@fts_exit:
mov [di], byte ptr '$'
fstp st(0)
popad
ret
@fts_IntegerPart dd ?
@fts_cw          dw ?
FloatToStr endp



;=================================================
@start: ;Ј«*ў*л© Є®¤ Їа®Ја*¬¬л
push cs ;зЁбвЄ* ¬гб®а*
pop ds
finit ;Ё*ЁжЁ*«Ё§Ёа㥬 б®Їа®жҐбб®а, в*ЄЁ¬ ®Ўа*§®¬ зЁбвЁ¬ Ї*¬пвм
mov ax, 2; гбв**®ўЄ* бв**¤*ав*®Ј® Є®*б®«м*®Ј® ўлў®¤*
int 10h ;®зЁй*Ґ¬ ¤ЁбЇ«Ґ© 
mov ah, 9  ; дг*ЄжЁп ¤®б ўлў®¤* бва®ЄЁ
mov dx, offset Request
int 21h ;ўлў®¤ ** нЄа** §*Їа®б* ўў®¤*
mov ah, 0Ah 
mov dx, offset Input
int 21h ;ўў®¤ бва®ЄЁ ¤«п а*ббзҐв*
mov si, dx 
call StrToFloat ;ЇҐаҐЈ**«Ё бва®Єг ў зЁб«® ** ўҐаиЁ*Ґ б⥪* б®Їа®жҐбб®а*

;=================================================
;y=x+1+sin(x-1)
;=================================================


fld st(0) ;¤гЎ«Ёа㥬 зЁб«® ў б⥪
fld1
fsubr
fsin
fadd
fld1
fadd


mov di, offset ResultValue ;б®ЎЁа*Ґ¬ **¤ЇЁбм ¤«п ўлў®¤*
mov dl, 25
call FloatToStr ;ЇҐаҐЈ®*塞 зЁб«® ў бва®Єг
mov dx, offset Result
mov ah, 9 ;¤®б дг*ЄжЁп ўлў®¤* б®®ЎйҐ*Ёп
int 21h ;ўлў®¤Ё¬ १г«мв*в
mov ah,1     ;Ј®в®ўЁ¬ ЇаҐалў**ЁҐ
int 21H      ;®¦Ё¤*Ґ¬ ўў®¤* Є«*ўЁиЁ
mov ah,4ch   ;дг*ЄжЁп §*ўҐаиҐ*Ёп Їа®Ја*¬¬л
int 21h      ;ўл室
end
Так код плохо читаем, прилагаю архив с исходником и компилятором:
Link
Bercut48rus вне форума Ответить с цитированием
Старый 10.12.2009, 22:46   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Код:
.model tiny
.stack 256h
.code
.386
jmp @start ;ссылка на начало программы
;объявление переменных
Request       db 'Введите X = $'
Input         db 8,0, 9 dup (0)
Ten           dd 10.0
Value         dq ?
Result        db 13,10,'Результат Y = '
ResultValue   db 25 dup(0)
AddConst      dd -1.0




StrToFloat proc near ;процедура перевода строки в число
;Вход DS:SI место хранения введенной строки
pusha ;сохранение всех регистров в стек
push es ;добавление в стек es
; на входе DS:SI - адрес входной строки
; выход в ST(0) - число
movzx cx, [si+10] ;пишем с увеличением размера в cx значение введенной строки  
inc cx
add si, 2
mov di, si
mov ax, ds
mov es, ax
cld                  ; обрабатываем строку	 с начала 
mov bx, cx
mov al, '.' ;переслали точку 
repnz scasb
sub bx, cx
sub bx, 2
dec di
movzx cx, [si-1]
fld1
sub dh, dh
cmp [si], byte ptr '-' ;проверили наличие знак (есть минус или нет)
jnz @stf_positive   
mov dh, 1 
dec cx
dec bx
inc si
@stf_positive:
or bx, bx
jz @stf_floatpart
fmul Ten
dec bx
jmp @stf_positive 
@stf_floatpart:
fstp @STF_Multiplier
fldz
@stf_loop:
cmp si, di
jz @stf_point
movzx ax, byte ptr [si]
sub al, 30h
mov @stf_digit, ax ;сбор числа в вершину стека
fild @stf_digit
fmul @STF_Multiplier
fadd
fld @STF_Multiplier
fdiv Ten
fstp @STF_Multiplier
@stf_point:
inc si
dec cx
jnz @stf_loop
cmp dh, 1
jnz @stf_exit
fchs
@stf_exit:
pop es
popa
ret
@STF_Multiplier dd ? 
@STF_Digit      dw ?
StrToFloat endp


FloatToStr proc near ;процедруа перевода числа в строку
pushad
movzx bp, dl
add bp, di
fnstcw @fts_cw
fwait
or @fts_cw, 0f00h
fldcw @fts_cw
fldz
fcomp
fstsw ax
test ax, 100h
jnz @fts_positive
fchs
mov [di], byte ptr '-' ;если число отрицательно то ставим минус
inc di
@fts_positive:
fist @FTS_IntegerPart
mov eax, @FTS_IntegerPart
mov ebx, 10
sub ch, ch
@fts_int1:
sub edx, edx
div ebx
push dx
inc ch
or eax, eax
jnz @fts_int1
@fts_int2:
pop ax
add al, 30h
mov [di], al
inc di
dec ch
jnz @fts_int2
fisub @FTS_IntegerPart
mov [di], byte ptr '.' ;определение дробной части
inc di
@fts_loop:
cmp bp, di
jz @fts_exit
fmul Ten
fist word ptr @FTS_IntegerPart
fisub word ptr @FTS_IntegerPart
mov al, byte ptr @FTS_IntegerPart ;кидаем цифру в al
add al, 30h   ;получаем из нее символ число + 30
mov [di], al  ;пишем в строку
inc di        ;увеличиваем символьный счетчик
jmp @fts_loop ;возвращаемся в то же масто
@fts_exit:
mov [di], byte ptr '$'
fstp st(0)
popad
ret
@fts_IntegerPart dd ?
@fts_cw          dw ?
FloatToStr endp



;=================================================
@start: ;главный код программы
push cs ;чистка мусора
pop ds
finit ;инициализируем сопроцессор, таким образом чистим память
mov ax, 2; установка стандартного консольного вывода
int 10h ;очищаем дисплей 
mov ah, 9  ; функция дос вывода строки
mov dx, offset Request
int 21h ;вывод на экран запроса ввода
mov ah, 0Ah 
mov dx, offset Input
int 21h ;ввод строки для рассчета
mov si, dx 
call StrToFloat ;перегнали строку в число на вершине стека сопроцессора

;=================================================
;y=x+1+sin(x-1)
;=================================================


fld st(0) ;дублируем число в стек
fld1
fsubr
fsin
fadd
fld1
fadd


mov di, offset ResultValue ;собираем надпись для вывода
mov dl, 25
call FloatToStr ;перегоняем число в строку
mov dx, offset Result
mov ah, 9 ;дос функция вывода сообщения
int 21h ;выводим результат
mov ah,1     ;готовим прерывание
int 21H      ;ожидаем ввода клавиши
mov ah,4ch   ;функция завершения программы
int 21h      ;выход
end
Перевел файлы в нормальную кодировку, может быть у кого то другого будет свободное время посмотреть код.
Вложения
Тип файла: txt laba.asm.txt (3.6 Кб, 116 просмотров)
Тип файла: txt laba_3.asm.txt (2.5 Кб, 114 просмотров)
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 11.12.2009, 02:40   #3
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Посмотрите, как будет выглядеть буфер после ф-ции 0аh.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с программой IrinaPetrova Фриланс 3 01.12.2009 13:03
Помогите разобраться с программой Svetlyachok Общие вопросы C/C++ 7 06.06.2009 17:55
Помогите разобраться с программой First90_19 Паскаль, Turbo Pascal, PascalABC.NET 0 23.12.2008 01:58
ГОРИТ ДИПЛОМ!!!! пожалуйста помогите разобраться с программой alexs2141 Фриланс 6 03.06.2008 20:30