Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.09;
Скачать: CL | DM;

Вниз

записать 6 байтное число   Найти похожие ветки 

 
Fanbio   (2008-02-12 16:31) [0]

Подскажите пожалуйста, как можно в буфер (память) записать 6 байтное число, забыл как называется, не перевернутое вообщем.
Допустим если есть число $112233445566  то что бы  так и записать в буфер buff = pchar = #$11,  #$22, #$33, #$44, #$55, #$66

4-х байтный DWord я так пишу:

 Procedure SetDWord(var Buff: PChar; Offset: Integer; Data: DWord);
 var
   x1, x2, x3, x4: byte;
 begin

   asm
     mov ax, word ptr Data
     mov x3, ah
     mov x4, al
     mov ax, word ptr Data+2
     mov x1, ah
     mov x2, al
   end;

   Buff[Offset]:=Chr(x1);  Buff[Offset+1]:=Chr(x2);      
   Buff[Offset+2]:=Chr(x3);  Buff[Offset+3]:=Chr(x4);

 end;

что  то никак не могу простенько сделать, какой-то код на пол страницы выходит)
помогите плиз.


 
ketmar ©   (2008-02-12 16:33) [1]

ну ты и зверюга…

хинт: записи с вариантами (избавиться от некрасивого асма), команда bswap (красивый асм). нагуглишь?

---
Understanding is not required. Only obedience.


 
Сергей М. ©   (2008-02-12 17:09) [2]


> не перевернутое вообщем


Как раз таки и перевернутое, судя по твоему примеру.


 
Fanbio   (2008-02-12 17:41) [3]

нагуглить то нагуглил, тока не вдуплюсь пока как сделать.
bswap работает с 32-х битным регистром.
я вот никак не вьеду, вот например бубет так:

Procedure SetQWord(var Buff: PChar; Offset: Integer; Data: Int64);

Data - 6-ти байтное.

не нужно как-то так:
mov esi, data
mov edit, data + 4
?

Сергей М.

да нет, пишет в память как даю, например $1234  в памяти так и будет побайтно если в хексе смотреть - $1234


 
palva ©   (2008-02-12 18:06) [4]

> побайтно если в хексе смотреть - $1234
Это не побайтно, а по двухбайтно. Побайтно будет $34, $12


 
Fanbio   (2008-02-12 18:15) [5]

palva ©
возможно вы и правы, но мне нужно что бы как представляется число $123456 так и записать db $00, $12, $34, $56


 
palva ©   (2008-02-12 18:34) [6]

> как представляется число $123456 так и записать db $00, $12, $34, $56
Тогда так и запишите:
db $56, $34, $12, $00


 
ketmar ©   (2008-02-12 18:38) [7]

ну и? BigEndian to LittleEndian conversion. google. и ты уже про записи с вариантными частями прочитал? никакого асма не надо.

да и без них не надо.

---
Understanding is not required. Only obedience.


 
Fanbio   (2008-02-12 18:42) [8]

да поискал, но мне нужно 6-ти байтное. с dword я хоть как-то криво разобрался..)


 
ketmar ©   (2008-02-12 18:55) [9]

>[8] Fanbio (2008-02-12 18:42:00)
что, не получается разобрать заклинание и расширить до случая n байтов? показывай код, который не работает.

---
Understanding is not required. Only obedience.


 
Dib@zol ©   (2008-02-12 20:14) [10]

program S6B;

uses
 Windows;

procedure Set6Byte(Buf:PChar; I:Int64);
asm
 MOV EDX, DWORD PTR [ESP+10];
 BSWAP EDX;
 MOV WORD PTR [EAX], DX;
 MOV EDX, DWORD PTR [ESP+8];
 BSWAP EDX;
 MOV DWORD PTR [EAX+2], EDX;
 MOV BYTE PTR [EAX+7], 00h;
end;

var B:PChar;
begin
 GetMem(B, 7);
 Set6Byte(B, $0000F0F1F2F3F4F5);
 MessageBox(0, B, "", 0);
 FreeMem(B);
end.


Вот что получилось у меня. "Верхнее" слово можно не заполнять - функция всё равно его обрежет. Для наглядности задано число, которое, будучи разбито побайтно, формирует кусок русского алфАвита :) Память под передаваемый функции буфер (всегда 7 байт) должна быть зарезервирована заранее.


 
Dib@zol ©   (2008-02-12 20:25) [11]

Изиняюсь, в последней строчке должно быть не +7, а +6.


 
Fanbio   (2008-02-12 20:34) [12]

А ведь да,  Dib@zol ©  огромное спасибо!!!
понял, что сам бы не додумался)


 
Fanbio   (2008-02-12 21:01) [13]

не могли бы пояснить некоторые моменты:

- передаются в процедуру два параметра.
я так понимаю первый параметр, адрес буфера находится у нас в EAX.
правильно? если да, то в стеке тогда его уже не будет?
- как располагаются в стеке передаваемые переменные?
имеется ввиду слева-направо или наоборот?
например мне нужно ещё учитывать смещение с какого писать число:
procedure Set6Byte(Buf:PChar; off: DWord; I:Int64);
что бы использовать затем как MOV WORD PTR [EAX+off], DX; правильно?
не понятна последняя строчка MOV BYTE PTR [EAX+6], 00h;
ведь у нас 6 байт пишется а это получается 7-й и затрет следующий байт.


 
Dib@zol ©   (2008-02-12 21:16) [14]

- передаются в процедуру два параметра.
я так понимаю первый параметр, адрес буфера находится у
нас в EAX.
правильно? если да, то в стеке тогда его уже не будет?
Да. Согласно директиве __fastcall.

- как располагаются в стеке передаваемые переменные?
А через стек тут передаётся только Int64 (опять же из-за __fastcall). Как он в нём лежит, можно понять из кода.

- что бы использовать затем как MOV WORD PTR [EAX+off], DX; правильно?
ну если не важна скорость, то да. Если же важна, то можно учесть что (снова из-за __fastcall :D) второй параметр передаётся через EDX. Надо заменить в моей функции EDX на ECX, и тогда вместо [EAX+off] писать [EAX+EDX].

не понятна последняя строчка MOV BYTE PTR [EAX+6], 00h;
ведь у нас 6 байт пишется а это получается 7-й и затрет следующий байт.

Это так называемый терминирующий символ. Он указывает, что строка PChar закончилась. Поэтому если у вас не заполнение конкретной строки, а лишь добавление в уже существующую, то ессно последняя строчка не нужна.



Страницы: 1 вся ветка

Текущий архив: 2008.03.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
3-1192621905
gentos
2007-10-17 15:51
2008.03.09
как прикрепить файл к письму ?


3-1192715486
Evgeny
2007-10-18 17:51
2008.03.09
Как сделать SQL запрос на выборку всех записей таблицы на этой не


10-1143627195
alk
2006-03-29 14:13
2008.03.09
Обмен параметрами между клиентом и сервером


2-1202674227
aids
2008-02-10 23:10
2008.03.09
поиск файлов


15-1201875396
Riply
2008-02-01 17:16
2008.03.09
Экономия памяти при работе.