![]() |
|
|
#1
|
||||
|
||||
|
Всем привет! Интересует такая задача. Есть 2 байта памяти. Мне нужно в этих двух байтах сохранить число (к примеру 30000), потом это число разделить или умножить (кому как удобнее) тоже к примеру на 65, главное не пребегать к целочисленному типу word, cardinal и т.п только byte. Подскажите пожалуйста как это можно реализовать?
Последний раз редактировалось Klyaksa, 31.01.2014 в 16:40. |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
||||
|
||||
|
Код:
var p: PWORD; begin p:=GetMemory(2); PWORD(p)^:=30000; PWORD(p)^:=PWORD(p)^ div 65; FreeMemory(p); end; |
|
#4
|
||||
|
||||
|
Цитата:
Код:
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 |
|
#5
|
||||
|
||||
|
Ну тут дело такое. Пишу прошивку под контроллеры там поддерживается язык pascal. Разрядность у контроллера маленькая и он не воспренимает числа больше байта. Вот и приходится извращатся для более точного вычисления.
|
|
#6
|
||||
|
||||
|
Восьмибиные контроллеры - лучше писать на асме. Избегать деления и умножения. В большинстве применений МК оно не нужно.
Что за марка мк хоть? ЗЫЖ нормальный компилятор должен ворды сам скомпилить как положено. Например, Си на AVR при использовании флоатов нагенерил 1.5 килобайта кода, но все-таки перемножил два числа. Последний раз редактировалось Bargest, 31.01.2014 в 23:04. |
|
#7
|
||||
|
||||
|
Цитата:
. Цитата:
Цитата:
Цитата:
Последний раз редактировалось Klyaksa, 01.02.2014 в 11:23. |
|
#8
|
||||
|
||||
|
Цитата:
Недавно делал крутящуюся фигню на AVR, нашел готовую схему и ужаснулся. Человек, походу, учился писать под МК на высокоуровневых языках, потом перешел на ассемблер. В итоге ему пришлось на простейшее устройство ставить два(!!!!) контроллера и организовывать связь, потому что в отведенные 8кб его километровая асм-прошивка не влезала совершенно. А все потому, что писал на асме, как на ЯВУ. Я уместился в один камень, и еще половина места свободной осталось, при том, что я делал больше функционала. Цитата:
Цитата:
Цитата:
![]() А в целом код деления я привел. Если паскаль поддерживает 16 бит - можно не извращаться и сделать по WORD-ам деление вычитанием. Кстати иногда можно изначальное число высчитывать отдельно как два числа - целую часть и остаток деления. Если делитель всегда одинаков. Тогда делить не придется. Последний раз редактировалось Bargest, 01.02.2014 в 18:17. |