![]() |
|
|
|
|
#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. |