Консультация № 194098
05.12.2018, 10:59
0.00 руб.
11.12.2018, 13:18
0 8 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Это простой арифмометр для положительных, целых и дробных чисел (компилятор masm32v11)

[code lang=asm h=200];арифметика под coпроцессор
.686
.model flat, stdcall
include сonst.inc
.data
include data.inc
.code
main:
push 0
call GetModuleHandleA@4
mov [hInst],eax
winmain proc
mov [wc.CLSSTYLE],STYLE
mov [wc.CLWNDPROC],offset winproc
mov [wc.CLSCBCLSEX],0
mov [wc.CLSCBWNDEX],0
mov eax,[hInst]
mov [wc.CLSHINST],eax
push IDI_APPLICATION
push 0
call LoadIconA@8
mov [wc.CLSHICON],eax
push IDC_ARROW
push 0
call LoadCursorA@8
mov [wc.CLSHCURSOR],eax
mov [wc.CLBKGROUND],18
mov DWORD ptr [wc.CLMENNAME],0
mov DWORD ptr [wc.CLNAME],offset CLASSNAME
push offset wc
call RegisterClassA@4
;окно арифмометра:
push 0
push [hInst]
push 0
push 0
push 225 ;y-высота окна
push 215 ;x-ширина окна
push 200
push 200
push WS_OVERLAPPEDWINDOW
push offset titleName
push offset className
push 0
call CreateWindowExA@48
cmp eax,0
jz _err
mov [hWnd],eax
push SW_SHOWNORMAL
push [hWnd]
call ShowWindow@8
push [hWnd]
call UpdateWindow@4
msg_loop:
push 0
push 0
push 0
push offset msg
call GetMessageA@16
cmp eax,0
je end_loop
push offset msg
call TranslateMessage@4
push offset msg
call DispatchMessageA@4
jmp msg_loop
end_loop:
push [msg.MSWPARAM]
call ExitProcess@4
_err:
jmp end_loop
winmain endp ;создали окно арифмометра
winproc proc ;процедура окна
push ebp
mov ebp,esp
push ebx
push esi
push edi
cmp dword ptr [ebp+0Ch],WM_CREATE
je wmcreate
cmp dword ptr [ebp+0Ch],WM_COMMAND
je wmcommand
cmp dword ptr [ebp+0Ch],WM_DESTROY
je wmdestroy
jmp defwndproc
wmcreate: ;начинаем обработку WM_CREATE
;-------------------------- C (y=)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 150 ;высота
push 30 ;ширина
push 40 ;y-сверху
push 10 ;x-слева
push STYLBUT
push offset butC
push offset clsBut
push 0
call CreateWindowExA@48
mov hbutC,eax
;-------------------------- 1 (y=40)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 40
push 50
push STYLBUT
push offset but1
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut1,eax
;-------------------------- 2 (y=40)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 40
push 90
push STYLBUT
push offset but2
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut2,eax
;-------------------------- 3 (y=40)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 40
push 130
push STYLBUT
push offset but3
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut3,eax
;-------------------------- 4 (y=80)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 80
push 50
push STYLBUT
push offset but4
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut4,eax
;----------------------------------5(y=80)------------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 80
push 90
push STYLBUT
push offset but5
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut5,eax
;-------------------------- 6 (y=)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 80
push 130
push STYLBUT
push offset but6
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut6,eax
;------------------------------------7(y=50)-----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 120
push 50
push STYLBUT
push offset but7
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut7,eax
;-------------------------- 8 (y=80)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 120
push 90
push STYLBUT
push offset but8
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut8,eax
;-------------------------- 9 (y=120)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 120
push 130
push STYLBUT
push offset but9
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut9,eax
;-------------------------- . (y=120)----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 160
push 90
push STYLBUT
push offset butP
push offset clsBut
push 0
call CreateWindowExA@48
mov hbutP,eax
;------------------------------------0(y=50)-----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 160
push 50
push STYLBUT
push offset but0
push offset clsBut
push 0
call CreateWindowExA@48
mov hbut0,eax
;------------------------------------+(y=40)-----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 40
push 170
push STYLBUT
push offset butS
push offset clsBut
push 0
call CreateWindowExA@48
mov hbutS,eax
;----------------------------------- - (y=80)-----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 80
push 170
push STYLBUT
push offset butM
push offset clsBut
push 0
call CreateWindowExA@48
mov hbutM,eax
;----------------------------------- * (y=120)-----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 120
push 170
push STYLBUT
push offset butU
push offset clsBut
push 0
call CreateWindowExA@48
mov hbutU,eax
;----------------------------------- : (y=160)-----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 160
push 170
push STYLBUT
push offset butD
push offset clsBut
push 0
call CreateWindowExA@48
mov hbutD,eax
;------------------------------------=(y=160)-----------------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 30
push 30
push 160
push 130
push STYLBUT
push offset butI
push offset clsBut
push 0
call CreateWindowExA@48
mov hbutI,eax
;----------------------окно редактирования----------------------------
push 0
push [hInst]
push 0
push [ebp+08h]
push 20
push 190
push 10
push 10
push STYLEDT
push offset Edt
push offset clsEdt
push 0
call CreateWindowExA@48
mov hedt,eax
jmp exit ;закончили обработку WM_CREATE - это была графика
wmcommand: ;начинаем обработку WM_COMMAND
mov eax,[hbut1]
cmp [ebp+14h],eax ;нажали "1"?
je nabor ;переходим сюда
mov eax,[hbut2]
cmp [ebp+14h],eax
je nabor
mov eax,[hbut3]
cmp [ebp+14h],eax
je nabor
mov eax,[hbut4]
cmp [ebp+14h],eax
je nabor
mov eax,[hbut5]
cmp [ebp+14h],eax
je nabor
mov eax,[hbut6]
cmp [ebp+14h],eax
je nabor
mov eax,hbut7
cmp [ebp+14h],eax
je nabor
mov eax,[hbut8]
cmp [ebp+14h],eax
je nabor
mov eax,[hbut9]
cmp [ebp+14h],eax
je nabor
je nabor
mov eax,[hbut0]
cmp [ebp+14h],eax
je nabor
mov eax,[hbutP]
cmp [ebp+14h],eax
je nabor
mov eax,hbutS
cmp [ebp+14h],eax
je plus
mov eax,[hbutM]
cmp [ebp+14h],eax
je minus
mov eax,[hbutU]
cmp [ebp+14h],eax
je umno
mov eax,hbutD
cmp [ebp+14h],eax
je deli
mov eax,[hbutC]
cmp [ebp+14h],eax
je clear
mov eax,[hbutI]
cmp [ebp+14h],eax
je itog
jmp defwndproc ;возвращаемся в процедуру
;всё, что ниже, обрабатывается только после непосредственного обращения
nabor: ;набираем число
push 16 ;ёмкость буфера stroka
push offset stroka
push [hedt] ;куда добавляем
call GetWindowTextA@12
add eax,offset stroka
push 16
push eax
push [EBP+14h] ;кнопкa
call GetWindowTextA@12
call settext
jmp exit
plus: ;жмём "+"...одна из 4-х кнопок операций, начало цикла
call plu
jmp exit
minus:
call min
jmp exit
umno:
call umn
jmp exit
deli:
call del
jmp exit
clear: ;кнопка полного цикла
call clproc
jmp exit
itog: ;набрали 2-е число, нажимаем "="
mov edi,char
cmp edi,hbutS
je plus_ex
cmp edi,hbutM
je minus_ex
cmp edi,hbutU
je umno_ex
cmp edi,hbutD
je deli_ex
plus_ex:
call pluex
jmp exit
minus_ex:
call minex
jmp exit
umno_ex:
call umnex
jmp exit
deli_ex:
call delex
jmp exit
exit: ;заканчиваем работу программы
xor eax,eax
xor ebx,ebx
jmp finish
wmdestroy: ;обрабатываем WM_DESTROY, если...
push 0
call PostQuitMessage@4
defwndproc: ;обрабатываем msg-и
push [ebp+14h] ;lParam
push [ebp+10h] ;wParam
push [ebp+0Ch] ;Msg
push [ebp+ 8h] ;hWnd
call DefWindowProcA@16
finish:
pop edi
pop esi
pop ebx
pop ebp
ret 16
winproc endp
clproc proc ;процедура очистки дисплея
push offset Edt
push [hedt]
call SetWindowTextA@8
ret
clproc endp
settext proc ;роцедура вывода результата на дисплей
push offset stroka
push [hedt]
call SetWindowTextA@8
ret
settext endp
;------------------------- арифметика -----------------------------------------
;операция сложения:
plu proc ;набрали 1-е число и нажали "+"
pushad
mov ebx,hbutS ;запоминаем
mov char,ebx ;тип операции (аналог->select = "+")
call slen ;длина целой и дробной части 1-го числа
mov edx,point ;дробность
mov point1,edx ;1-го числа
call asc2float ;преобразуем 1-ю строку в дв.код
mov esi,float
mov float1,esi ;float1=1-й дв.код
call clproc ;очищаем дисплей
popad
ret
plu endp
pluex proc ;набрали 2-е число и нажали "="
call clproc ;очищаем дисплей
call slen ;длина целой и дробной части 2-го числа
call asc2float ;преобразуем 2-е число в дв.код=>float
call add_32
call float2asc ;преобразуем итог в строку
call settext ;добавляем итог на дисплей
ret
pluex endp
add_32 proc
finit
cmp point1,1 ;1-е число дробное?
je a1 ;да->a1
fild float1 ;нет
jmp a2
a1:
fld float1
a2:
cmp point,1 ;2-е число дробное?
je a3 ;да->a3
fild float ;нет
jmp a4
a3:
fld float
a4:
fadd
fstp res
ret
add_32 endp
;операция вычитания:
min proc
pushad
mov ebx,hbutM ;запоминаем
mov char,ebx ;тип операции (аналог->select = "-")
call slen ;длина целой и дробной части
mov edx,point ;дробность
mov point1,edx ;1-го числа
call asc2float ;преобразуем 1-ю строку в дв.код
mov esi,float
mov float1,esi
call clproc ;очищаем дисплей
popad
ret
min endp
minex proc
call clproc ;очищаем дисплей
call slen
call asc2float ;преобразуем 2-е число в дв.код=>float
call sub_32
call float2asc ;преобразуем итог в строку
call settext ;добавляем итог на дисплей
ret
minex endp
sub_32 proc
finit
cmp point,1 ;2-е число дробное?
je s1 ;да->s1
fild float ;нет
jmp s2
s1:
fld float
s2:
cmp point1,1 ;1-е число дробное?
je s3 ;да->s3
fild float1 ;нет
jmp s4
s3:
fld float1
s4:
fsub
fstp res
ret
sub_32 endp
;операция умножения:
umn proc
pushad
mov ebx,hbutU ;запоминаем
mov char,ebx ;тип операции (аналог->select = "*")
call slen ;длина целой и дробной части
mov edx,point ;дробность
mov point1,edx ;1-го числа
call asc2float ;преобразуем 1-ю строку в дв.код
mov esi,float
mov float1,esi ;float1=1-й дв.код
call clproc ;очищаем дисплей
popad
ret
umn endp
umnex proc
call clproc ;очищаем дисплей
call slen
call asc2float ;преобразуем 2-е число в дв.код
call mul_32
call float2asc ;преобразуем итог в строку
call settext ;добавляем итог на дисплей
ret
umnex endp
mul_32 proc
finit
cmp point1,1 ;1-е число дробное?
je u1 ;да->u1
fild float1 ;нет
jmp u2
u1:
fld float1
u2:
cmp point,1 ;2-е число дробное?
je u3 ;да->u3
fild float ;нет
jmp u4
u3:
fld float
u4:
fmul
fstp res
ret
mul_32 endp
;операция деления:
del proc
pushad
mov ebx,hbutD ;запоминаем
mov char,ebx ;тип операции (аналог->select = "/")
call slen ;длина целой и дробной части
mov edx,point ;дробность
mov point1,edx ;1-го числа
call asc2float ;преобразуем 1-ю строку в дв.код
mov esi,float
mov float1,esi ;float1=1-й дв.код
call clproc ;очищаем дисплей
popad
ret
del endp
delex proc
call clproc ;очищаем дисплей
call slen
call asc2float
call div_32
call float2asc ;преобразуем итог в строку
call settext ;добавляем итог на дисплей
ret
delex endp
div_32 proc
finit
cmp point,1 ;2-е число дробное?
je d1 ;да->d1
fild float ;нет
jmp d2
d1:
fld float
d2:
cmp point1,1 ;1-е число дробное?
je d3 ;да->d3
fild float1 ;нет
jmp d4
d3:
fld float1
d4:
fdiv
fstp res
ret
div_32 endp
;--------------------- конвертация -----------------------------------------------
;к-во символов целой и дробной части введённого числа:
slen proc
pushad
xor eax,eax
xor edx,edx
lea eax,stroka ;адрес начала stroka db 16 dup (0)
mov point,0 ;инициируем... (point dd ?)
mov cel,0 ;целая часть числа (cel dd ?)
mov dro,0 ;дробная часть числа (drob dd ?)
s1:
mov bl,[eax] ;берём ASCII-символ
or bl,bl ;есть символ?
jz s4 ;нет->s4
cmp point,0 ;была точка?
jne s3 ;да->s3
cmp bl,"." ;это точка?
je s2 ;да->s2
inc edx ;фиксируем символ целой части
inc eax ;смещаемся вправо, к следующему символу
jmp s1 ;повторяем
s2:
mov cel,edx ;сохраняем к-во символов целой части stroka
xor edx,edx ;EDX=0
inc eax ;пропускаем точку
mov point,1 ;фиксируем её наличие
jmp s1
s3:
inc edx ;фиксируем символ дробной части
inc eax ;смещаемся вправо, к следующему символу
jmp s1
mov dro,edx ;сохраняем к-во символов дробной части stroka
s4:
popad
ret
slen endp
;преобразуем символы в двоичный код:
asc2float proc
pushad
xor eax,eax ;EAX=0
xor ebx,ebx ;EBX=0
mov bcel,0 ;инициируем (bcel dd ?)
mov ecx,cel ;счётчик = к-во символов целой части
mov edx,ten ;EDX=(ten dd 10.0)
lea esi,stroka ;адрес левого ASCII-символа целой части
cel_cycl: ;((((0*10)+1)*10+2)*10+3)*10+4 = 1234
mov bl,[esi] ;добавим в EBX ASCII-символ
or bl,bl ;есть символ?
jz fin ;нет->fin
cmp bl,"0" ;это "0"?
je d1 ;да->d1 (без целой части)
and bl,0Fh ;убираем 3-ку
mul edx ;учитываем множитель
add eax,ebx ;формируем дв.код целой части
jc err ;если переполнение
inc esi ;смещаемся вправо
loop cel_cycl ;повторяем
mov bcel,eax ;сохраняем целую часть
xor eax,eax ;EАX=0
d1:
mov ecx,dro ;счётчик=к-во символов дробной части
mov edx,aten ;EDX=(aten dd 1/10)
xor ebx,ebx ;EBX=0
lea esi,stroka ;адрес правого ASCII-символа
add esi,cel ;дробной
add esi,dro ;части
dro_cycl: ;((((4)*0.1+3)*0.1+2)*0.1+1)*0.1+0 = 0.1234
mov bl,[esi] ;добавим в EBX ASCII-символ
or bl,bl ;есть символ?
jz d2 ;нет->d2
and bl,0Fh ;есть->убираем 3-ку
mul edx ;учитываем множитель
add eax,ebx ;формируем дв.код дробной части
dec esi ;смещаемся влево
loop dro_cycl ;повторяем
mul edx ;коррекция дробной части
d2:
add eax,bcel ;ЕАХ=дробная+целая части
mov float,eax
jc err ;если переполнение
err:
fin:
popad
ret
asc2float endp
;преобразуем двоичный код в символы:
float2asc proc
pushad
xor eax,eax
xor esi,esi
lea esi,stroka
lea eax,res
mov edx,5 ;5 цифр в дробной части
finit
fld dword ptr [eax] ;st = res
fldz ;st=0, st(1)=res
fcomip st,st(1) ;st = res
jz zero ;if res = 0 -> zero
jb n1 ;if res < 0 -> n1
xor ebx,ebx ;EBX=0
dec ebx ;EBX=(-1)
push ebx ;вершина стека -> ESP
fild dword ptr [esp] ;st = [esp], st(1) = res
pop ebx
fxch ;st<->st(1) --> st = res, st(1) = [esp]
fmul st,st(1) ;st = st * st(1) --> res * [esp]
mov byte ptr [esi],"-" ;добавляем в stroka минус
inc esi ;смещаемся
n1:
fld1 ;st=1, st(1)=res
fcomip st,st(1) ;st=res
jz one ;st-st(1) = 0 -> one
jb norm ;st-st(1) < 0 -> norm
jmp trans
norm:
xor ecx,ecx
mov eax,1 ;EAX=1
push eax
fld1 ;st=1, st(1)=res
fxch ;st=res, st(1)=1
rep1:
fmul dword ptr [esp] ;st=st*[esp]=st*1
inc ecx ;счётчик целой части
fcomi st,st(1)
jb n2
jmp rep1
n2:
pop eax
trans:
xchg edx,ecx ;ECX = число после точки, EDX = до
add ecx,edx ;ECX = число цифр до + после точки
mov eax,10 ;EAX=10
push eax ;[esp]->10
fild dword ptr [esp] ;st = 10
fxch ;st = res, st(1) = 10
rep2:
fmul st,st(1) ;st = res * 10
fld1 ;st = 1, st(1) = res * 10
fcmovne st,st(1) ;копируем, если не равно
fistp dword ptr [esp] ;округляем st и выталкиваем в [ESP]
mov al,byte ptr [esp]
fild dword ptr [esp] ;st = текущее значение
fsubp st(1),st
add al,30h ;AL: BCD->ASCII
mov byte ptr [esi],al ;добавляем в stroka
inc esi ;смещаемся
dec edx ;EDX-1
cmp edx,0 ;закончилась дробная часть?
jnz n3 ;нет -> n3
mov byte ptr [esi],"." ;если EDX = 0 -> добавляем в stroka точку
inc esi
n3:
loop rep2
pop eax
jmp fin
zero:
mov byte ptr [esi],"0"
jmp fin
one:
mov byte ptr [esi],"1"
jmp fin
error:
fin:
popad
ret
float2asc endp
end main[/code]
Результатом любой арифметической операции является второе введённое число, которое предваряет "0".
Подскажите - что не так?

Обсуждение

давно
Старший Модератор
31795
6196
10.12.2018, 15:03
общий
Адресаты:
Откуда Вы взяли:
Цитата: cupoma58
Результатом любой арифметической операции является второе введённое число, которое предваряет "0".


Если в коде имя сonst.inc, первая буква записана кириллицей:


Файл data.inc Вы не выложили, а со старым из вопроса 193474, выдается куча ошибок:
Цитата: результат компиляции
data.inc(10) : error A2008: syntax error : in structure
data.inc(11) : error A2008: syntax error : in structure
data.inc(33) : error A2044: invalid character in file
data.inc(34) : error A2044: invalid character in file
181210a.asm(13) : error A2006: undefined symbol : wc
181210a.asm(14) : error A2006: undefined symbol : wc
181210a.asm(15) : error A2006: undefined symbol : wc
181210a.asm(16) : error A2006: undefined symbol : wc
181210a.asm(18) : error A2006: undefined symbol : wc
181210a.asm(22) : error A2006: undefined symbol : wc
181210a.asm(26) : error A2006: undefined symbol : wc
181210a.asm(27) : error A2006: undefined symbol : wc
181210a.asm(28) : error A2006: undefined symbol : wc
181210a.asm(29) : error A2006: undefined symbol : wc
181210a.asm(30) : error A2006: undefined symbol : wc
181210a.asm(58) : error A2006: undefined symbol : msg
181210a.asm(62) : error A2006: undefined symbol : msg
181210a.asm(64) : error A2006: undefined symbol : msg
181210a.asm(68) : error A2006: undefined symbol : msg
181210a.asm(247) : error A2006: undefined symbol : butP
181210a.asm(251) : error A2006: undefined symbol : hbutP
181210a.asm(390) : error A2006: undefined symbol : hbutP
181210a.asm(415) : error A2006: undefined symbol : stroka
181210a.asm(418) : error A2006: undefined symbol : stroka
181210a.asm(441) : error A2006: undefined symbol : char
181210a.asm(489) : error A2006: undefined symbol : stroka
181210a.asm(499) : error A2006: undefined symbol : char
181210a.asm(501) : error A2006: undefined symbol : point
181210a.asm(502) : error A2006: undefined symbol : point1
181210a.asm(504) : error A2006: undefined symbol : float
181210a.asm(505) : error A2006: undefined symbol : float1
181210a.asm(521) : error A2006: undefined symbol : point1
181210a.asm(523) : error A2006: undefined symbol : float1
181210a.asm(526) : error A2006: undefined symbol : float1
181210a.asm(528) : error A2006: undefined symbol : point
181210a.asm(530) : error A2006: undefined symbol : float
181210a.asm(533) : error A2006: undefined symbol : float
181210a.asm(543) : error A2006: undefined symbol : char
181210a.asm(545) : error A2006: undefined symbol : point
181210a.asm(546) : error A2006: undefined symbol : point1
181210a.asm(548) : error A2006: undefined symbol : float
181210a.asm(549) : error A2006: undefined symbol : float1
181210a.asm(565) : error A2006: undefined symbol : point
181210a.asm(567) : error A2006: undefined symbol : float
181210a.asm(570) : error A2006: undefined symbol : float
181210a.asm(572) : error A2006: undefined symbol : point1
181210a.asm(574) : error A2006: undefined symbol : float1
181210a.asm(577) : error A2006: undefined symbol : float1
181210a.asm(587) : error A2006: undefined symbol : char
181210a.asm(589) : error A2006: undefined symbol : point
181210a.asm(590) : error A2006: undefined symbol : point1
181210a.asm(592) : error A2006: undefined symbol : float
181210a.asm(593) : error A2006: undefined symbol : float1
181210a.asm(609) : error A2006: undefined symbol : point1
181210a.asm(611) : error A2006: undefined symbol : float1
181210a.asm(614) : error A2006: undefined symbol : float1
181210a.asm(616) : error A2006: undefined symbol : point
181210a.asm(618) : error A2006: undefined symbol : float
181210a.asm(621) : error A2006: undefined symbol : float
181210a.asm(631) : error A2006: undefined symbol : char
181210a.asm(633) : error A2006: undefined symbol : point
181210a.asm(634) : error A2006: undefined symbol : point1
181210a.asm(636) : error A2006: undefined symbol : float
181210a.asm(637) : error A2006: undefined symbol : float1
181210a.asm(653) : error A2006: undefined symbol : point
181210a.asm(655) : error A2006: undefined symbol : float
181210a.asm(658) : error A2006: undefined symbol : float
181210a.asm(660) : error A2006: undefined symbol : point1
181210a.asm(662) : error A2006: undefined symbol : float1
181210a.asm(665) : error A2006: undefined symbol : float1
181210a.asm(677) : error A2006: undefined symbol : stroka
181210a.asm(678) : error A2006: undefined symbol : point
181210a.asm(679) : error A2006: undefined symbol : cel
181210a.asm(680) : error A2006: undefined symbol : dro
181210a.asm(685) : error A2006: undefined symbol : point
181210a.asm(693) : error A2006: undefined symbol : cel
181210a.asm(696) : error A2006: undefined symbol : point
181210a.asm(702) : error A2006: undefined symbol : dro
181210a.asm(712) : error A2006: undefined symbol : bcel
181210a.asm(713) : error A2006: undefined symbol : cel
181210a.asm(715) : error A2006: undefined symbol : stroka
181210a.asm(728) : error A2006: undefined symbol : bcel
181210a.asm(731) : error A2006: undefined symbol : dro
181210a.asm(732) : error A2006: undefined symbol : aten
181210a.asm(734) : error A2006: undefined symbol : stroka
181210a.asm(735) : error A2006: undefined symbol : cel
181210a.asm(736) : error A2006: undefined symbol : dro
181210a.asm(748) : error A2006: undefined symbol : bcel
181210a.asm(749) : error A2006: undefined symbol : float
181210a.asm(761) : error A2006: undefined symbol : stroka
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
11.12.2018, 14:06
общий
Адресаты:
У Вас неправильно работают, наверное, все функции преобразования и вычисления.
1) В буфере лежит числовая строка, начинающаяся с пробела. Это не учитывается.
2) slen возвращает длину целой части (для строки-числа, например, "2") равной 0
3) В asc2float, как минимум, неправильная работа с вещественными числами 10.0 и 0.1
Надо использовать СОПРОЦЕССОР, а не использовать команду MUL
Дальше не вникал... Но, боюсь, еще будет, что исправлять. Начните пока с указанного...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
25.12.2018, 15:51
общий
Адресаты:
Хорошо, на досуге гляну. Пока занят
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
04.01.2019, 13:39
общий
Я бы сделал так:
[code lang=asm] asc2float proc
pushad
lea edi,float ;EDI->первый байт float
lea esi,stroka ;ESI->первый символ stroka
finit
fldz ;st=0
mov ecx,-1 ; признак отсутствия дробной части
cycl: ;цикл обработки строки:
lodsb ;берём байт
or al,al
jz fin ;ничего нет, на выход
cmp al,"." ;это точка?
jne cycl_digit

test ecx,ecx
jge fin ;конроль повторной точки
xor ecx,ecx ;счетчик цифр дробной части
jmp cycl

cycl_digit:
cmp al,'0'
jb fin
cmp al,'9'
ja fin

fmul ten ;st=st*10...
and eax,0Fh ;ASCII->BCD
mov [esp],eax ;[ESP]<-EAX
fiadd dword ptr [esp] ;st=st*10+EAX...<-накапливаем дв.код
test ecx,ecx
jl cycl ;только целая часть
inc ecx ;считаем цифры дробной части
jmp cycl

fin:
test ecx,ecx
jle save_float ;есть ли цифры дробной части
fdiv ten
dec ecx
jmp fin

save_float:
fstp dword ptr [edi] ;сохраняем итог во float
popad
ret
asc2float endp
[/code]
При условии, что
[code lang=asm]ten dd 10.0[/code]
Кстати, почему при вводе числа нет проверки на недопустимые символы:
вводятся как буквы, так и несколько точек.
Кстати, как насчет отрицательных чисел? На будущее?

В данной подпрограмме добавил проверку на повтор точки и цифры

Что касается этого:
В этом преобразовании в стек идёт временная ячейка с цифрой, а из стека, для преобразования в ASCII-символ, достаётся регистр ЕАХ
Так это обычное преобразование числа в строку символов. Причем в обратном порядке, в стек заносится, начиная с младшего разряда, а выводить надо, начиная со старшего. Поэтому и используется стек. Извлекается в EAX, чтобы сделать символ и записать на свое место.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401688
22
09.01.2019, 10:40
общий
Адресаты:
Благодарю за подсказку, буду пробовать. Что касается проверок - Вы слишком строги к пенсионеру. Хотя...
давно
Посетитель
401688
22
18.01.2019, 10:21
общий
Адресаты:
Здравствуйте. Я изменил один из вариантов и арифмометр заработал, но...возникли проблемы с
точностью результата:
Код:

7 : 2 = 3.5 * 2 = 6.5999 30.5 * 2 = 60 35.5 * 2 = 71
9 : 2 = 4.5 * 2 = 8.8000 50.5 * 2 = 100 55.5 * 2 = 111
11 : 2 = 5.5 * 2 = 11 и т.д.
13 : 2 = 6.5 * 2 = 13.1999
15 : 2 = 7.5 * 2 = 15.3999

Погрешность появляется вместе с дробной частью. Я подумал, что это связано с округлением и
попробовал изменить настройку слова управления сопроцессора - ничего не изменилось.
И на числа меньше единицы арифмометр реагирует как на ноль.
Подскажите - в чём дело?
давно
Посетитель
7438
7205
18.01.2019, 11:30
общий
Адресаты:
Выложите весь код. Посмотрим.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401688
22
02.04.2020, 13:30
общий
04.04.2020, 23:00
Адресаты:
Здравствуйте.
Это окончательный вариант: [url=cupoma58.ru/ziper/fenix.zip]арифмометр[/url]


Форма ответа