Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.01.2014, 16:25
Аватар для Klyaksa
Klyaksa Klyaksa вне форума
Новичок
 
Регистрация: 07.01.2012
Сообщения: 90
Репутация: 10
По умолчанию Минимизация

Всем привет! Интересует такая задача. Есть 2 байта памяти. Мне нужно в этих двух байтах сохранить число (к примеру 30000), потом это число разделить или умножить (кому как удобнее) тоже к примеру на 65, главное не пребегать к целочисленному типу word, cardinal и т.п только byte. Подскажите пожалуйста как это можно реализовать?

Последний раз редактировалось Klyaksa, 31.01.2014 в 16:40.
Ответить с цитированием
  #2  
Старый 31.01.2014, 16:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Klyaksa
Всем привет! Интересует такая задача. Есть 2 байта памяти. Мне нужно в этих двух байтах сохранить число (к примеру 30000), потом это число разделить или умножить (кому как удобнее) тоже к примеру на 65, главное не пребегать к целочисленному типу word, cardinal и т.п только byte. Подскажите пожалуйста как это можно реализовать?
Сначала объясни смысл запрета на типы word, cardinal и т.п.
Ответить с цитированием
  #3  
Старый 31.01.2014, 16:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

Код:
var
  p: PWORD;
begin
  p:=GetMemory(2);
  PWORD(p)^:=30000;
  PWORD(p)^:=PWORD(p)^ div 65;
  FreeMemory(p);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 31.01.2014, 21:53
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Подскажите пожалуйста как это можно реализовать?
Код:
var a: array[0..1] of byte;
     b: array[0..1] of byte;
...
a[0] := 3000;
a[1] := 3000 shr 8;
while (a[1] != 0) and (a[0] >= 65) do begin
   if a[0] < 65 then
      a[1] := a[1] - 1;
   a[0] := a[0] - 65;
   if b[0] = 255 then
      b[1] := b[1] + 1;
   b[0] := b[0] + 1;
end;
// b - результат

Код:
mov ax, [a]
xor  dx, dx
mov bx, 65
div bx
mov [b], ax
А теперь объясни, зафига этот бред.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 31.01.2014, 22:52
Аватар для Klyaksa
Klyaksa Klyaksa вне форума
Новичок
 
Регистрация: 07.01.2012
Сообщения: 90
Репутация: 10
По умолчанию

Ну тут дело такое. Пишу прошивку под контроллеры там поддерживается язык pascal. Разрядность у контроллера маленькая и он не воспренимает числа больше байта. Вот и приходится извращатся для более точного вычисления.
Ответить с цитированием
  #6  
Старый 31.01.2014, 23:02
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Восьмибиные контроллеры - лучше писать на асме. Избегать деления и умножения. В большинстве применений МК оно не нужно.
Что за марка мк хоть?

ЗЫЖ нормальный компилятор должен ворды сам скомпилить как положено. Например, Си на AVR при использовании флоатов нагенерил 1.5 килобайта кода, но все-таки перемножил два числа.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 31.01.2014 в 23:04.
Ответить с цитированием
  #7  
Старый 01.02.2014, 11:17
Аватар для Klyaksa
Klyaksa Klyaksa вне форума
Новичок
 
Регистрация: 07.01.2012
Сообщения: 90
Репутация: 10
По умолчанию

Цитата:
Восьмибиные контроллеры - лучше писать на асме
Да... читал про ассемблер, прошивка получается по оптимизированней и обрабатывается быстрее (на то он и ассемблер). Но я по нему 0.001 .
Цитата:
Избегать деления и умножения.
В моем случае уже не получается, если мне надо вывести "дробное число" на дисплей с точностью до тысячных.
Цитата:
Что за марка мк хоть?
PIC.
Цитата:
нормальный компилятор должен ворды сам скомпилить как положено.
Возможно компиль херовый, хотя он поддерживает числа больше этого значения. Далее, если число выше то автоматом оно обнуляется и пошел считать от 0 до 65535.(так считает сам контроллер).Тут уже может быть не увязочка так как вопрос стоял о байте.

Последний раз редактировалось Klyaksa, 01.02.2014 в 11:23.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025