Текущий архив: 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.48 MB
Время: 0.036 c