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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2018, 12:45   #1
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 44
По умолчанию конвертация типов

Привет. Сделал арифмометр для целых, положительных чисел (http://cupoma58.ru/assembler.html).
Решил добавить кнопку "точка". Весь код остался тот-же. Изменилась арифметика
Код:
fld  dig1
fld  dig2
;тип арифметики
fstp res
и преобразование введённых чисел. На дисплее арифмометра набирается число (положительное, целое
или дробное), которое сохраняется в буфере stroka db 16 dup (0). Определяется к-во символов целой
и дробной части
Код:
slen  proc             ;к-во символов целой и дробной части введённого числа
  pushad
  xor  eax,eax
  xor  edx,edx
  lea  eax,stroka      ;адрес начала stroka db 16 dup (0)
  mov  point,0         ;инициируем...  (point db ?)
  mov  cel,0           ;целая часть числа (cel dd ?)
  mov  drob,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
  inc  eax             ;пропускаем точку
  mov  point,1         ;фиксируем её наличие
  jmp  s1
s3:                
  inc  edx             ;фиксируем символ дробной части
  inc  eax             ;смещаемся вправо, к следующему символу
  cmp  eax,0           ;закончились символы?
  jne  s1
  mov  drob,edx        ;сохраняем к-во символов дробной части stroka
s4:
  popad
  ret    
slen  endp
На основании этого введённое число преобразуется в двоичный код
Код:
asc2float proc
  pushad
  call slen
  xor  eax,eax         ;очищаем EAX
  xor  ebx,ebx         ;очищаем EBX
  mov  buf,0           ;инициируем (buf dd ?) - дв.число
  mov  bcel,0          ;инициируем (bcel dd ?) - дв.целая часть числа
  mov  ecx,cel         ;счётчик = к-во символов целой части  
  mov  edx,ten         ;EDX=(ten dd 10.0)
  lea  esi,stroka      ;адрес левого ASCII-символа целой части  
cel_cycl:              ;(((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   fin             ;если переполнение
  inc  esi             ;смещаемся вправо
  loop cel_cycl        ;повторяем
  mov  bcel,eax        ;сохраняем целую часть
  xor  eax,eax         ;очищаем EАX   
d1:                    
  mov  ecx,drob        ;счётчик=к-во символов дробной части
  mov  edx,aten        ;EDX=(aten dd 1/10)
  xor  ebx,ebx         ;очищаем EBX
  lea  esi,stroka      ;адрес правого ASCII-символа   
  add  esi,cel         ;дробной 
  add  esi,drob        ;части
drob_cycl:             ;((((4)*0.1+3)*0.1+2)*0.1+1)*0.1 = 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 drob_cycl       ;повторяем
  mul  edx             ;коррекция дробной части  
d2:
  xchg buf,eax         ;buf=дробная часть, ЕАХ=0
  mov  eax,bcel        ;извлекаем целую часть
  add  buf,eax         ;buf=дробная+целая
fin:
  popad
  ret
asc2float endp
Уже на этом этапе код не работает. Подскажите - что не так?
cupoma58 вне форума Ответить с цитированием
Старый 15.11.2018, 13:55   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от cupoma58 Посмотреть сообщение
На основании этого введённое число преобразуется в двоичный код
а зачем это делать в ручную? есть-же printf/scanf
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 16.11.2018, 10:09   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Тогда это уже будет не ассемблер - использование Сишных библиотек
digitalis вне форума Ответить с цитированием
Старый 05.12.2018, 11:05   #4
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 44
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Тогда это уже будет не ассемблер - использование Сишных библиотек
Стесняюсь спросить - советы по коду будут? Я, вообще, туда
попал?
cupoma58 вне форума Ответить с цитированием
Старый 05.12.2018, 16:38   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Стесняюсь спросить, Вы для чего всё это делаете?
Если для удовольствия, давно бы уже посмотрели в отладчике, что именно не так.
Это же ассемблер, всё сразу видно, что в каком регистре после каждой команды..

Если же Вы хотите, чтобы кто-то разобрался в этом за Вас, то прежде всего надо чётко сформулировать, что именно не так. "Не работает" - это ни о чём.

И желательно сразу какой-то минимально воспроизводимый фрагмент, чтобы не медитировать в монитор, а запустить и посмотреть. Лично я предпочёл бы вообще увидеть исполняемый код, но это не всякий любит
Black Fregat вне форума Ответить с цитированием
Старый 05.12.2018, 19:56   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от cupoma58 Посмотреть сообщение
советы по коду будут?
ну вот например так можно вычислить кол-во символов справа, и слева точки (если она есть). ошибки ввода обрабатывать лень:
Код:
format   PE console
include  'win32ax.inc'
.data
;stroka   db  16 dup(0)
stroka   db  '123.456',0
cel      dd  0
drob     dd  0
;-------------
.code
start:
; считаем длинну всего ввода
        mov   edi,stroka
        push  edi
        mov   ecx,-1
        xor   al,al         ; искать маркер-нуль
        repne scasb
        not   ecx
        dec   ecx           ; ecx = длинна
        mov   [cel],ecx     ; сохраняем её как целое..
; ищем точку и её позицию
        pop   edi
        mov   ebx,ecx
        mov   al,'.'
        repne scasb
        jcxz  @00           ; нет точки
        sub   ebx,ecx       ; разница 
        dec   ebx
        mov   [cel],ebx     ; кол-во символов в целой части
        mov   [drob],ecx    ;  ..и в дробной
@00:
; здесь проверяешь переменную 'drob' и если в ней нуль,
; значит число целое (без точки) и его длина лежит в 'cel'.
;....
        invoke  ExitProcess,0
.end start
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 11.12.2018, 12:40   #7
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
И желательно сразу какой-то минимально воспроизводимый фрагмент, чтобы не медитировать в монитор, а запустить и посмотреть. Лично я предпочёл бы вообще увидеть исполняемый код, но это не всякий любит
Весь код "не влазит" (> 8000 символов), это код без "графики", на примере операции сложения:
Код:
 ... 
;------------------------- арифметика -----------------------------------------
;операция сложения:
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
 ...
;--------------------- конвертация -----------------------------------------------
;к-во символов целой и дробной части введённого числа:
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
Результатом ЛЮБОЙ арифметической операции является ВТОРОЕ набранное число. Помогите разобратся.
Этот арифмометр - доработка рабочего арифмометра для целых положительных чисел.
cupoma58 вне форума Ответить с цитированием
Старый 18.01.2019, 10:44   #8
cupoma58
Пользователь
 
Аватар для cupoma58
 
Регистрация: 12.08.2014
Сообщений: 44
По умолчанию

Цитата:
Сообщение от cupoma58 Посмотреть сообщение
Весь код "не влазит" (> 8000 символов), это код без "графики", на примере операции сложения:
Код:
 ... 
;------------------------- арифметика -----------------------------------------
;операция сложения:
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
 ...
;--------------------- конвертация -----------------------------------------------
;к-во символов целой и дробной части введённого числа:
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
Результатом ЛЮБОЙ арифметической операции является ВТОРОЕ набранное число. Помогите разобратся.
Этот арифмометр - доработка рабочего арифмометра для целых положительных чисел.
Тема закрыта: http://cupoma58.ru/assembler.html
cupoma58 вне форума Ответить с цитированием
Старый 18.01.2019, 23:08   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

если юзаешь сопр, то бери после единицы.. есть-же описание в сети..
а так - закрыл тему и всё - мол сами разбирайтесь...
зачем вообще открывал???
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
конвертация типов cupoma58 Помощь студентам 0 02.08.2018 12:31
[Assembler] конвертация типов cupoma58 Помощь студентам 2 18.05.2018 12:10
Конвертация типов LD-One Visual C++ 1 22.06.2017 11:22
Конвертация типов DigitalAngel C# (си шарп) 4 15.02.2012 17:16
Конвертация типов в дельфи Vikenty Помощь студентам 2 22.05.2010 18:03