Как вывести дробное число. 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д