|
#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 jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
||||
|
||||
Ну тут дело такое. Пишу прошивку под контроллеры там поддерживается язык pascal. Разрядность у контроллера маленькая и он не воспренимает числа больше байта. Вот и приходится извращатся для более точного вычисления.
|
#6
|
||||
|
||||
Восьмибиные контроллеры - лучше писать на асме. Избегать деления и умножения. В большинстве применений МК оно не нужно.
Что за марка мк хоть? ЗЫЖ нормальный компилятор должен ворды сам скомпилить как положено. Например, Си на AVR при использовании флоатов нагенерил 1.5 килобайта кода, но все-таки перемножил два числа. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 31.01.2014 в 23:04. |
#7
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Цитата:
Последний раз редактировалось Klyaksa, 01.02.2014 в 11:23. |
#8
|
||||
|
||||
Цитата:
Недавно делал крутящуюся фигню на AVR, нашел готовую схему и ужаснулся. Человек, походу, учился писать под МК на высокоуровневых языках, потом перешел на ассемблер. В итоге ему пришлось на простейшее устройство ставить два(!!!!) контроллера и организовывать связь, потому что в отведенные 8кб его километровая асм-прошивка не влезала совершенно. А все потому, что писал на асме, как на ЯВУ. Я уместился в один камень, и еще половина места свободной осталось, при том, что я делал больше функционала. Цитата:
Цитата:
Цитата:
А в целом код деления я привел. Если паскаль поддерживает 16 бит - можно не извращаться и сделать по WORD-ам деление вычитанием. Кстати иногда можно изначальное число высчитывать отдельно как два числа - целую часть и остаток деления. Если делитель всегда одинаков. Тогда делить не придется. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 01.02.2014 в 18:17. |