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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2016, 12:08   #11
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

vadimych,
допустим требуется точность 2 знака после запятой -- тут два пути
  1. или домножить результат на 100 а потом делить на 20 30*100/20=150 и поставить запятую куда требуется
  2. выполняем целочисленное деление, выводим результат, ставим запятую, остаток домножаем на 100, снова делим на 20 и выводим частное на экран
Mikl___ вне форума Ответить с цитированием
Старый 12.10.2016, 12:13   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Mikl___, в точку!
что-то меня вчера на FPU заклинило, совсем затупил...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2016, 13:11   #13
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от vadimych Посмотреть сообщение
PS проверочка из hex2asc исчезла, мда...
..от этой проверочки не холодно, не жарко. Хочешь сократить код - убери, хочешь универсальный вывод - оставь. А с дробями да..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.10.2016, 14:45   #14
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Об какой универсальности идёт речь, когда mov bx,10? Если бы основание системы счисления передавалось функции как аргумент, тогда да. Скажем, нужно вывести число в одной программе в разных сс.

Код:
push 10;(2,8,16 и т.д)
call hex2asc

...

hex2asc:                 ; Функция переводит числа в символы
   pusha                 ; Вход:  АХ = число, BX = система счисления
   mov bp,sp
   mov   bx,[bp+18]         ;

@@:
   xor   cx,cx           ; Выход: на экране
isDiv:                   ;
   xor   dx,dx           ;
   div   bx              ;
   push  dx              ;
   inc   cx              ;
   or    ax,ax           ;
   jnz   isDiv           ;
isOut:                   ;
   pop   ax              ;
   aam          ;
   or ax,30h
   aad 11h
   int   29h             ;
   loop  isOut           ;
   popa                  ;
ret 2
vadimych вне форума Ответить с цитированием
Старый 12.10.2016, 15:20   #15
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..локальная метка здесь явно лишняя.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.10.2016, 15:26   #16
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Точно, забыл убрать. Но она не используется...
vadimych вне форума Ответить с цитированием
Старый 12.10.2016, 21:40   #17
iluminator
 
Регистрация: 11.10.2016
Сообщений: 5
По умолчанию

Сделал по вашей схеме, и в результате выводит " Result: 0,0 ", хотя число совсем не то вышло. Пользуюсь масмом
Цитата:
Сообщение от R71MT Посмотреть сообщение
Можно просто вывести оба регистра на экран. Тогда и FPU не нужен:
Код:
; fasm code...
;f=(8x+z)/(2(x^2)+2)
;x=3 y=5 z=6
;------------------------
org 100h
jmp start

mes  db   'f=(8x+z)/(2(x^2)+2)',13,10
     db   '-------------------',13,10
     db   'Result: $'
x    dw   3
y    dw   5
z    dw   6
f0   dw   0
f1   dw   0

start:
     mov   ah,9
     mov   dx,mes
     int   21h

     mov   ax,[x]
     shl   ax,3
     add   ax,[z]       ; AX = (8x+z)
     push  ax           ; запомним..

     mov   ax,[x]
     mul   ax
     shl   ax,1
     add   ax,2
     xchg  ax,bx        ; BX = (2(x^2)+2)

     pop   ax
     xor   dx,dx
     div   bx           ; AX = целое
     push  dx           ; DX = остаток (запомним)

     mov   [f0],ax      ; сохраняем и выводим целое на экран
     call  hex2asc
     mov   al,','       ; точка-разделитель
     int   29h

     pop   ax
     mov   [f1],ax      ; сохраняем и выводим остаток на экран
     call  hex2asc

exit:
     xor   ax,ax          ; ждём любую клавишу..
     int   16h
     int   20h            ; выход в DOS!!!

;eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
hex2asc:                 ; Функция переводит числа в символы
   pusha                 ; Вход:  АХ = число, BX = система счисления
   mov   bx,10           ;
   xor   cx,cx           ; Выход: на экране
isDiv:                   ;
   xor   dx,dx           ;
   div   bx              ;
   push  dx              ;
   inc   cx              ;
   or    ax,ax           ;
   jnz   isDiv           ;
isOut:                   ;
   pop   ax              ;
   add   al,30h          ;
   int   29h             ;
   loop  isOut           ;
   popa                  ;
ret                      ;
iluminator вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, арифметические выражения вида A x B. Вычислить значение выражения Un1q Паскаль, Turbo Pascal, PascalABC.NET 4 09.12.2013 14:47
составить программу вычисления функции - арифметического выражения Татьяна1234567 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 05.10.2013 15:41
Используя рекурсию, вычислить результат арифметического выражения??? Nataly026 Паскаль, Turbo Pascal, PascalABC.NET 4 09.03.2012 21:36
Найти значение арифметического выражения (напишите листинг программы на ассемблере) POMOGIteMNE Помощь студентам 2 02.12.2011 17:37
Как вычслить на Ассемблере значение арифметического выражения Ветас Помощь студентам 5 18.10.2010 18:06