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

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

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

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

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

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

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

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

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

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

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

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

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

Для 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 вне форума Ответить с цитированием
Ответ


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

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

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


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