![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
записать 6 байтное число [D2005, XP]
Fanbio © (2008-02-12 16:31:00)Подскажите пожалуйста, как можно в буфер (память) записать 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;
что то никак не могу простенько сделать, какой-то код на пол страницы выходит)
помогите плиз.
Dib@zol (2008-02-12 21:16:00) [1]- передаются в процедуру два параметра.
я так понимаю первый параметр, адрес буфера находится у
нас в 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 закончилась. Поэтому если у вас не заполнение конкретной строки, а лишь добавление в уже существующую, то ессно последняя строчка не нужна.
Fanbio (2008-02-12 21:01:00) [2]не могли бы пояснить некоторые моменты:
- передаются в процедуру два параметра.
я так понимаю первый параметр, адрес буфера находится у нас в EAX.
правильно? если да, то в стеке тогда его уже не будет?
- как располагаются в стеке передаваемые переменные?
имеется ввиду слева-направо или наоборот?
например мне нужно ещё учитывать смещение с какого писать число:
procedure Set6Byte(Buf:PChar; off: DWord; I:Int64);
что бы использовать затем как MOV WORD PTR [EAX+off], DX; правильно?
не понятна последняя строчка MOV BYTE PTR [EAX+6], 00h;
ведь у нас 6 байт пишется а это получается 7-й и затрет следующий байт.
Fanbio (2008-02-12 20:34:00) [3]А ведь да, Dib@zol © огромное спасибо!!!
понял, что сам бы не додумался)
Dib@zol (2008-02-12 20:25:00) [4]Изиняюсь, в последней строчке должно быть не +7, а +6.
Dib@zol (2008-02-12 20:14:00) [5]
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 байт) должна быть зарезервирована заранее.
ketmar (2008-02-12 18:55:00) [6]>[8] Fanbio (2008-02-12 18:42:00)
что, не получается разобрать заклинание и расширить до случая n байтов? показывай код, который не работает.
---
Understanding is not required. Only obedience.
Fanbio (2008-02-12 18:42:00) [7]да поискал, но мне нужно 6-ти байтное. с dword я хоть как-то криво разобрался..)
ketmar (2008-02-12 18:38:00) [8]ну и? BigEndian to LittleEndian conversion. google. и ты уже про записи с вариантными частями прочитал? никакого асма не надо.
да и без них не надо.
---
Understanding is not required. Only obedience.
palva (2008-02-12 18:34:00) [9]> как представляется число $123456 так и записать db $00, $12, $34, $56
Тогда так и запишите:
db $56, $34, $12, $00
Fanbio (2008-02-12 18:15:00) [10]palva ©
возможно вы и правы, но мне нужно что бы как представляется число $123456 так и записать db $00, $12, $34, $56
palva (2008-02-12 18:06:00) [11]> побайтно если в хексе смотреть - $1234
Это не побайтно, а по двухбайтно. Побайтно будет $34, $12
Fanbio (2008-02-12 17:41:00) [12]нагуглить то нагуглил, тока не вдуплюсь пока как сделать.
bswap работает с 32-х битным регистром.
я вот никак не вьеду, вот например бубет так:
Procedure SetQWord(var Buff: PChar; Offset: Integer; Data: Int64);
Data - 6-ти байтное.
не нужно как-то так:
mov esi, data
mov edit, data + 4
?
Сергей М.
да нет, пишет в память как даю, например $1234 в памяти так и будет побайтно если в хексе смотреть - $1234
Сергей М. (2008-02-12 17:09:00) [13]
> не перевернутое вообщем
Как раз таки и перевернутое, судя по твоему примеру.
ketmar (2008-02-12 16:33:00) [14]ну ты и зверюга…
хинт: записи с вариантами (избавиться от некрасивого асма), команда bswap (красивый асм). нагуглишь?
---
Understanding is not required. Only obedience.