Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

Ответ
 
Опции темы
Старый 29.05.2018, 22:39   #1
Capitoska
 
Регистрация: 27.05.2018
Сообщений: 4
Репутация: 10
По умолчанию Деление целых чисел до десятичных значений

Всем привет. Помогите пожалуйста составить и отладить программу на ассемблере для нахождения результата деления двух целых(word) чисел, представленных в десятичном формате с помощью сопроцессора. Числа вводятся с клавиатуры. Результат вывести на дисплей по формату:
Z = XXX . XXX
целая | дробная
часть | часть

Помогите пожалуйста. Пока ассемблер тяжело поддаётся, а сдавать лабы надо.
Capitoska вне форума   Ответить с цитированием
Старый 29.05.2018, 22:53   #2
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,230
Репутация: 1048
По умолчанию

копай в сторону scanf/printf со-спецификатором %F
__________________
Нашедшего выход - затаптывают первым..
R71MT на форуме   Ответить с цитированием
Старый 30.05.2018, 00:46   #3
Capitoska
 
Регистрация: 27.05.2018
Сообщений: 4
Репутация: 10
По умолчанию

Дело в том, что мы ещё scanf/printf не проходили. Может есть какой-то другой ход решения?
Capitoska вне форума   Ответить с цитированием
Старый 30.05.2018, 00:59   #4
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Адрес: Самара
Сообщений: 289
Репутация: 147
По умолчанию

В одном из этих файлов по любому есть ответ

Ну а если прога под Windows на MASM32, то см. файлы fptoa.asm и fptoa2.asm в папке m32lib (но там нет обрубания до нужного числа знаков, так что придётся умножить на 1000, округлить и разделить на 1000).
Вложения
Тип файла: zip InOutFloat.zip (9.9 Кб, 2 просмотров)
__________________
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума   Ответить с цитированием
Старый 30.05.2018, 09:40   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 392
Репутация: 236
По умолчанию

Я так понимаю, что нужно просто деление целых в столбик.

Для masm32 и двойных слов делал так.
Там смысл - сначала разделить и вывести целую часть обычным способом. В edx получается остаток от деления и именно из него и будет вычисляться дробная часть.

Потом взять абсолютные значения от остатка, делителя и в цикле ровно N раз повторить:
1. остаток умножить на 10 (добавить справа 0)
2. разделить это произведение на делитель. Частное преобразовать в символ и добавить к строке.
Код:

.486
.model flat, stdcall
option casemap :none

        include \masm32\include\windows.inc

        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\Shlwapi.inc
        include \masm32\include\masm32.inc

        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\Shlwapi.lib
        includelib \masm32\lib\masm32.lib
.data
        aszCrLf         db      0Dh, 0Ah, 0
        aszMsgResult    db      'Result: ', 0
        aszPressLeftAlt db      0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        BufLen          dd      ?
        Buffer          db      1024 dup(?)

.code

;edx:eax  - делимое
;ebx      - делитель
;lpString - указатель на ASCIIZ строку
;Digits   - количество символов десятичной дроби
iDivToStr       proc    lpString:DWORD, Digits:DWORD
        pushad

        ;выделение целой части
        mov     edi,    [lpString]
        push    eax
        push    edx
        push    ecx
        idiv    ebx
        invoke  dwtoa,  eax, edi
        invoke  StrLen, edi
        add     edi,    eax
        pop     ecx
        pop     edx
        pop     eax
        ;возьмём абсолютные значения числителя и знаменателя
        or      edx,    edx
        jns     @@Positive1
        not     eax
        not     edx
        add     eax,    1
        adc     edx,    0
@@Positive1:
        or      ebx,    ebx
        jns     @@Positive2
        neg     ebx
@@Positive2:
        ;получим остаток от деления
        div     ebx
        ;если деление без остатка - завершить
        or      edx,    edx
        jz      @@Exit
        ;выделение десятичной дроби
        mov     [edi],  byte ptr '.'
        inc     edi

        mov     eax,    edx
        mov     esi,    10

        mov     ecx,    [Digits]
@@Digits:
        mul     esi             ;добавляем справа ноль (умножаем на 10)
        div     ebx             ;делим новое число на делитель
        add     al,     '0'     ;преобразуем частное в символ
        stosb                   ;сохраняем символ в строке
        mov     eax,    edx     ;переносим остаток в регистр eax
        or      eax,    eax
        loopnz  @@Digits
@@Exit:
        mov     [edi],  byte ptr 0
        popad
        ret
iDivToStr       endp

start   proc

        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
        ;очистка экрана
        invoke  ClearScreen

        mov     eax,    -37
        cdq
        mov     ebx,    7
        invoke  iDivToStr,      ADDR Buffer, 9

        ;вывод результата
@@ShowResult:
        ; - вывод
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL

        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL

        ;ожидание нажатия Left Alt
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\
                LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
        ;завершение программы
        invoke  ExitProcess, 0
start   endp

end start

Для слов тоже делал, но найти не смогу.
FPaul вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
деление упакованных двоично-десятичных чисел DIGOREC Assembler 0 21.06.2011 18:54
Ввод с клавиатуры целых десятичных чисел Илья555 Assembler 0 26.04.2011 09:12
Сложение двух десятичных положительных чисел. целых чисел))) PEro_man Assembler 6 01.12.2010 13:40
ПАСКАЛЬ-цифры двух десятичных целых чисел Анна Попова Помощь студентам 6 22.11.2009 10:50
Вывод целых и десятичных чисел Maycal Общие вопросы C/C++ 2 24.10.2007 12:34


09:15.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru