Как вывести дробное число. Delphi+Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Как вывести дробное число с фиксированной точкой в Delphi FloatToStr, если это слово в регистре eax, в старшем слове целая часть, в младшем дробная. Приведите пример пожалуйста. Как это делается в сопроцессоре и мантису с показателем степени знаю. Заранее благодарю.

Решение задачи: «Как вывести дробное число. Delphi+Assembler»

textual
Листинг программы
.586
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib masm32.lib
includelib kernel32.lib
 
.data
buf db 32 dup (0)
.code
_start:
    mov eax,-123*65536+8000h    ;123.5
    lea edi,buf
    push eax
    sar eax,16
    mov esi,eax ;запоминаем число
    mov ebx,10  ;основание системы
    xor ecx,ecx ;в сх будет количество цифр в десятичном числе
    test eax,eax    ;если число положительное
    jns @@m1a   ;то пропускаем
    neg eax     ;если отрицательное, то меняем знак
@@m1a:  xor edx,edx
    div ebx     ;делим число на степени 10
    push edx        ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
    inc ecx     ;увеличиваем количество десятичных цифр числа
    test eax,eax    ;после деления остался 0?
    jnz @@m1a   ;если нет, продолжаем
    test esi,esi    ;число отрицательное?
    jns @@m2a   ;если нет, пропустить
    push -3     ;иначе дописать перех числом минус
    inc ecx     ;увеличить количество цифр числа
@@m2a:  pop eax     ;взять из стека цифру цисла
    add al,'0'  ;преобразовываем цифру в ASCII символ
    stosb       ;записываем в строку
    loop @@m2a  ;все цифры
    mov al,'.'
    stosb       ;выводим точку
    pop eax
    and eax,0ffffh;берем дробную часть
;ДЛЯ ИЗМЕНИЯ КОЛ_ВА ЗНАКОВ ПОСЛЕ ЗАТОЙ ИЗМЕНЯТЬ ЗДЕСЬ 
    mov ecx,10000
    mul ecx     ;умножаем на 10000, чтобы было 4 знака после запятой
    mov ecx,65536
    div ecx     ;делим на 65536
;вывод дробной части
    mov ebx,10  ;основание системы
    xor ecx,ecx ;в сх будет количество цифр в десятичном числе
@m1a:   xor edx,edx ;очистить старшую часть делимого
    div ebx     ;делим число на степени 10
    push edx        ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
    inc ecx     ;увеличиваем количество десятичных цифр числа
    test eax,eax    ;после деления остался 0?
    jnz @m1a    ;если нет, продолжаем
;И ЗДЕСЬ!!!!
    cmp ecx,4
    jb @m1a     ;не менее 4 знаков запихиваем в стек
@m2a:   pop eax     ;взять из стека цифру цисла
    add al,'0'  ;преобразовываем цифру в ASCII символ
    stosb
    loop @m2a   ;все цифры
    mov al,0
    stosb
    invoke ExitProcess,0    ;выход
end _start
end

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5