Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];

Вниз

записать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.042 c
3-1192787895
ocean
2007-10-19 13:58
2008.03.09
Подскажите конструкцию SQL


2-1202755883
1иван
2008-02-11 21:51
2008.03.09
TMemoryStream + dll


11-1184837920
=BuckLr=
2007-07-19 13:38
2008.03.09
FastMM vs HeapMM


2-1202756973
Jimmy
2008-02-11 22:09
2008.03.09
Событие при перемещении формы


15-1202038145
Галинка
2008-02-03 14:29
2008.03.09
Вопрос к преподавателям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский