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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 01:33   #21
Аделинкка
Пользователь
 
Аватар для Аделинкка
 
Регистрация: 24.03.2012
Сообщений: 68
По умолчанию

По-моему,так первый вариант проще реализовать))
На яблоках почти все понятно,спасибо большое.
Нет,не блондинка!!
Аделинкка вне форума Ответить с цитированием
Старый 05.05.2012, 01:54   #22
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
По-моему,так первый вариант проще реализовать))
Нет, не проще. Это я на яблоках всё упростил. А если бы у вас и в знаменателе могло получаться дробное число? А если у вас вообще все входные числа типа флоат, как тогда. Тогда всё несколько усложнилось бы.
А сложность с сопроцессором заключается только в выводе данных. Тут вам уже предлагали использовать fpu.lib из состава масм32. Можно ещё использовать msvcrt - библиотеку, но она должна быть в системе.

P.S.
Кстати, вы обратили внимание, что у вас формула в заголовке вообще не соответствует тому, что вычисляется.
((a+b)*c-24)/ac-1 это не то же самое, что ((a+b)*c-24)/(ac-1)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось Ulex; 05.05.2012 в 01:57.
Ulex вне форума Ответить с цитированием
Старый 05.05.2012, 02:14   #23
Аделинкка
Пользователь
 
Аватар для Аделинкка
 
Регистрация: 24.03.2012
Сообщений: 68
По умолчанию

Могу ответить только по поводу заголовка,опечаталась,исправила на ((a+b)*c-24)/(ac-1).
А сопроцессор не много не разобралась..надо подключить библиотеку, и опять чуток помучиться с выводом результата?
Нет,не блондинка!!
Аделинкка вне форума Ответить с цитированием
Старый 05.05.2012, 02:35   #24
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
А сопроцессор не много не разобралась..надо подключить библиотеку, и опять чуток помучиться с выводом результата?
Надо как обычно, подключить библиотеку, взять книжку, прочитать про архитектуру сопроцессора, понять что такое стек сопроцессора и зачем, почитать справочник по командам сопроцессора, понять с какими типами данных он может работать....ну и написать программу, вобщем всё как всегда.

Код:
.386
.model flat,stdcall
option casemap:none
include C:\masm32\INCLUDE\WINDOWS.INC
include C:\masm32\INCLUDE\KERNEL32.INC 
include C:\masm32\INCLUDE\USER32.INC
include C:\masm32\INCLUDE\fpu.inc

includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib 
includelib C:\masm32\lib\fpu.lib 

.DATA
title_1 DB "((a+b)*c-24)/(ac-1)",0	;((20+30)*40-24)/(20*40-1)=2.378
R db 12 dup (0)
Avar	dd 20
Bvar	dd 30
Cvar	dd 40
Const1	dd 24
Const2	dd 1
Result	dt 0

.CODE
START: 
finit
fild	dword ptr [Avar]
fiadd	dword ptr [Bvar]
fimul	dword ptr [Cvar]
fisub	dword ptr [Const1]
fild	dword ptr [Avar]
fimul	dword ptr [Cvar]
fisub	dword ptr [Const2]
fdiv
fstp	[Result]
invoke	FpuFLtoA, addr [Result], 8, addr [R], SRC1_REAL or SRC2_DIMM or STR_REG
invoke MessageBox, 0, addr R, addr title_1,MB_OK 
invoke ExitProcess, 0
END START
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 05.05.2012, 02:49   #25
Аделинкка
Пользователь
 
Аватар для Аделинкка
 
Регистрация: 24.03.2012
Сообщений: 68
По умолчанию

Хорошо.
Спасибо,Ulex.)

Я так понимаю,что все операторы (функции) начинаются почти такие же ,но все на чинается с fi.
Нет,не блондинка!!

Последний раз редактировалось Stilet; 05.05.2012 в 11:55.
Аделинкка вне форума Ответить с цитированием
Старый 05.05.2012, 09:52   #26
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Я так понимаю,что все операторы (функции) начинаются почти такие же ,но все на чинается с fi.
Немного не так) C f начинаются все команды сопроцессора, а вот i обычно указывает на то, что операнды целочисленные (хотя есть исключения вроде finit)
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 05.05.2012 в 09:56.
DiemonStar вне форума Ответить с цитированием
Старый 05.05.2012, 13:17   #27
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Аделинкка, давайте разделим яблоки, используя сопроцессор. Итак, у нас 11 яблок. Их нужно разделить между нами поровну.

Отступление. Функции сопроцессора работают со стеком сопроцессора. То есть входные данные должны быть на своих местах в стеке. Мы должны эти входные данные подготовить, загрузив туда (в стек сопроцессора). Результат работы функций сохраняется в том же стеке.

Исходные данные:
Количество людей: 2 штуки
Количество яблок: 11 штук

Порядок действий:
- загружаем количество яблок на вершину стека, с помощью функции fild
- загружаем количество людей на вершину стека (число яблок при этом сдвигается от вершины на одну позицию, см. рисунок 1)

Рисунок 1:


Продолжаем порядок действий:
- итак, в стеке у нас: на нулевой позиции - количество людей, а на первой позиции количество яблок
- вызываем функцию fdiv, которая делит число на первой позиции в стеке сопроцессора на число в нулевой позиции в стеке сопроцессора.
- результат своей работы функция сохранила на вершине стека сопроцессора (см. рисунок 2).
- сохраним результат в переменной, которая объявлена с директивой dt (80-битная переменная), с помощью команды fstp
- сделаем преобразование содержимого 80-битной переменной result в последовательность ASCII символов (это для будущего вывода на экран), с помощью функции FpuFLtoA

Рисунок 2:


Код:
.386
.model flat, stdcall
option casemap:none

include c:\masm32\include\kernel32.inc
include c:\masm32\include\fpu.inc

includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\fpu.lib

BSIZE    equ    20

.data
napples    dd    11
nmen       dd    2
result     dt    ?
buf        db    BSIZE dup(?)

.code
start:
    fild napples ; загружаем количество яблок на вершину стека
    fild nmen    ; загружаем количество людей на вершину стека
    fdiv         ; делим количество людей на количество яблок
    fstp result  ; сохраняем результат (вершину стека сопроцессора). Переменная result объявлена c
                 ; директивой dt (80 бит)

    invoke  FpuFLtoA, ADDR result, 10, \ ; перегоняем из 80-битной переменой result в буфер buf
                      ADDR buf, SRC1_REAL or SRC2_DIMM

    invoke ExitProcess, 0 ; завершаем процесс
end start
P.S. Функция FpuFLtoA используется для сохранения результата в буфере, чтобы потом вывести на экран содержимое этого буфера.

P.S.S. Вы видели, что данные мы загружали в стек сопроцессора с помощью fild. Здесь сокращение слов:
f - FPU (Floating Point Unit) - устройство для выполнения операций с плавающей точкой
i - integer - целое число
ld - load - загрузка
Таким образом, fild - это команда для загрузки целого числа в устройство, которое выполняет операции с плавающей точкой.

Последний раз редактировалось 8Observer8; 05.05.2012 в 13:24.
8Observer8 вне форума Ответить с цитированием
Старый 07.05.2012, 01:26   #28
Аделинкка
Пользователь
 
Аватар для Аделинкка
 
Регистрация: 24.03.2012
Сообщений: 68
По умолчанию

Спасибо,вам всем)
У меня еще вопросик.А при работе с переменными надо писать [dword ptr]&(как в предыдущем коде?
Нет,не блондинка!!
Аделинкка вне форума Ответить с цитированием
Старый 07.05.2012, 14:05   #29
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

обычно, явное указание на размерность переменной необходимо когда размерности переменной и регистра не совпадают.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.05.2012, 08:12   #30
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Аделинкка, вы ещё не все виды вывода результата на экран попробовали!

Обязательно попробуйте вывести результат работы вашей программы:
1. В консоль (функция WriteConsole)
2. В файл (функция WriteFile)
3. На элемент пользовательского интерфейса (например, в Edit)
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод результата Илья- Общие вопросы C/C++ 0 16.11.2011 17:29
Вывод результата блоками nervniy Паскаль, Turbo Pascal, PascalABC.NET 1 28.05.2011 20:26
Вывод результата Delphi Nikita++ Помощь студентам 5 20.12.2010 15:48
Ассемблер вывод результата. SickUSP Помощь студентам 0 28.01.2010 18:13