x 포인터가 가리키는 4 바이트의 순서를 뒤바꾸다

6216 단어 포인터
예를 들어 x가 가리키는 메모리 주소는 바이트의 내용이 낮은 것부터 높은 것까지 각각 c1, c2, c3, c4(Delphi가 인덱스를 읽을 때 결과는 c4c3c2c1, 그 배열 규칙은'높고 낮음')이다. 그러면 결과는 c4, c3, c2, c1(Delphi가 인덱스를 읽을 때 결과는 c1c2c3c4)이다.
delphi에서 작성한 프로그램으로 x 포인터가 가리키는 4바이트의 순서를 뒤바꿉니다.
function toulong(x: pchar): longword;
begin
result := (longword(x^) shl 24) or
(longword((x + 1)^) shl 16) or
(longword((x + 2)^) shl 8) or
(longword((x + 3)^));
end;

 
다음은delphi의 삽입식 어셈블러를 사용합니다.
function toulong(x: pchar): longword;
asm
mov esi,eax //   x    (          ) esi(esi      ,        )。 esi=x
mov ax,[esi] //                   ax 。 ax=c2c1(  ,intel   )
xchg ah,al //  ax           。 ax=c1c2
shl eax,16 //         eax  2   。 eax=c1c200
mov ax,[esi+2] //  esi    2          ax , ax=c4c3(  ,intel   )
xchg ah,al //  ax           。 ax=c3c4。        eax 2   ,     eax=c1c2c3c4,        ,            c4c3c2c1, Delphi   ,      integer    c1c2c3c4)
end;

설명: 기본적으로delphi는'register'방식을 사용합니다. 만약에 파라미터가 3개가 이미 있으면 각각 eax,edx,ecx를 사용하고 3개가 넘는 부분은 창고를 사용합니다.반환 매개 변수의 저장 길이는 8비트는al로 반환하고 16비트는ax, 32비트는eax, 64비트는32비트 레지스터edx:eax로 반환하며 그중 eax는 저비트이다.
효율: 본 예는 asm가델파이나 c보다 약 50% 빠르다.
======================================================
Delphi 프로그램 유효성 검사를 수행했습니다.
procedure TForm1.Button3Click(Sender: TObject);
var
i: integer;
p: PInteger;
x: PChar;
begin
i:=$04030201; //   ,    ,             01020304
p:=@i;
ShowMessage(IntToStr(Integer(p^)));
x:=pchar(p);
ShowMessage(IntToStr(toulong(x)));
end;

Hex 01020304 = Dec 16909060Hex 04030201 = Dec 67305985
주의해라, 이 어셈블리 코드를 관찰하면 매우 재미있다.
======================================================
다시 VC로 한 번 쓰면 어셈블리 코드의 주체는 필요없다. 바로 매개 변수 전달에 관한 약속 부분을 바꾸었다
#include "stdafx.h"

int toulong(char* p)
{
    int fff;
    __asm {
        mov eax, p // EAX           ,      
        mov esi,eax 
        mov ax,[esi] 
        xchg ah,al 
        shl eax,16 
        mov ax,[esi+2] 
        xchg ah,al 
        mov fff, eax // EAX          ,      
    }
    return fff;
}

int main(int argc, char* argv[])
{
    int i=0x04030201;
    printf("after: %d !
", i); int* p=&i; int j=toulong((char*)p); printf("after: %d !
", j); return 0; }

===========================================
대상의 메모리 배열이 어떻게 거꾸로 되는지 잘 모르겠다.나중에 다시 연구하자.

좋은 웹페이지 즐겨찾기