Форум по 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.
Ответить с цитированием
  #8  
Старый 01.02.2014, 18:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Да... читал про ассемблер, прошивка получается по оптимизированней и обрабатывается быстрее (на то он и ассемблер).
Главное - что предельно понятно, где, когда и как что работает. Начинать работать с МК надо однозначно с асмы и забыть вообще про высокоуровневые языки. Иначе будут писаться километровые прошивки без понимания, как оно работает вовсе. Не говоря уже про возможные глюки паскаля при работе с прерываниями и т.д.
Недавно делал крутящуюся фигню на AVR, нашел готовую схему и ужаснулся. Человек, походу, учился писать под МК на высокоуровневых языках, потом перешел на ассемблер. В итоге ему пришлось на простейшее устройство ставить два(!!!!) контроллера и организовывать связь, потому что в отведенные 8кб его километровая асм-прошивка не влезала совершенно. А все потому, что писал на асме, как на ЯВУ.
Я уместился в один камень, и еще половина места свободной осталось, при том, что я делал больше функционала.
Цитата:
Но я по нему 0.001
Ну так найти сборник статей и учить. Асма элементарна до невозможности.
Цитата:
Далее, если число выше то автоматом оно обнуляется и пошел считать от 0 до 65535.(так считает сам контроллер).
Потому что некоторые PIC 16-битные, то есть 2 байта. Значит можно использовать WORD.
Цитата:
В моем случае уже не получается, если мне надо вывести "дробное число" на дисплей с точностью до тысячных.
Ну... можно вывести в HEX-виде. Тогда деление не нужно.
А в целом код деления я привел. Если паскаль поддерживает 16 бит - можно не извращаться и сделать по WORD-ам деление вычитанием.
Кстати иногда можно изначальное число высчитывать отдельно как два числа - целую часть и остаток деления. Если делитель всегда одинаков. Тогда делить не придется.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 01.02.2014 в 18:17.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter