Delphi 어셈블리

4643 단어
1. Delphi의 비트 작업
  *        :

Delphi의 AND,OR,NOT는 논리 표현식만 작용하는 것이 아니라 숫자를 조작할 수 있다.
AND: 1AND 2와 같이 비트별 및 의 결과는 0입니다.
OR: 1OR 2와 같은 비트 또는 의 결과는 3입니다.
Not: 비트별 반향: Not 1의 결과는 기호 수가 있는 경우 - 2, 기호 수가 없는 경우 65534
또한 비트레이트 또는 XOR: 예: 1 XOR 2 결과 3

Delphi는 SHL 및 SHR의 위치 이동을 위한 왼쪽 및 오른쪽 이동을 제공합니다.
예를 들어, 2 SHR1은 2가 한 자리 오른쪽으로 이동하면 결과가 1임을 나타냅니다.
  * Delphi   

기왕 비트의 조작은 반드시 수와 관련된 유형이다. 기호수(첫 번째 비트는 0과 1로 양과 음을 표시한다)가 있느냐, 아니면 기호수가 없느냐.
Delphi에서 Shortint(8비트), Smallint(16비트), Longint(32비트), Integer(32비트), Int64(64비트)는 기호수가 있다.반면 바이텍(8비트), 워드(16비트), 롱워드(32비트)는 기호 수가 없다.그것들 사이는 C처럼 강제로 전환할 수 있다.예를 들어 Smallint 유형의-1Word 유형으로 변환하면 65535입니다.변환 방법은 Word(-1)입니다.
2. Delphi의 삽입식 어셈블리
Delphi에서 거의 모든 상용 어셈블리 명령을 지원합니다: MOV, JE, JMP, CMP, SHL, SHR, SAL, SAR, POP, PUSH, HLT... 직접 찾아보세요.INT도 식별할 수 있지만 불법 조작이나 다운되면 나를 찾지 마라(최초의 윈도 95에서 델피3로 정확하게 운행이 중단될 것 같지만 윈도 95 OEM, 윈도 98은 틀렸다. 16개 모듈의 문제라서 아직 잘 모르겠다).
ü 내장형 어셈블리의 형식
Delphi는 ASM...END를 사용하여 어셈블리 문을 나타냅니다.
예: ASM
mov al,1
mov bl,al
END;
★조작 가능한 레지스터
Delphi는 다음 레지스터를 어셈블리로 관리할 수 있습니다.
32비트 레지스터 EAX EBX ECX EDX ESP EBP ESI EDI
16비트 레지스터 AX BX CX DX SP BP SI DI
8비트 레지스터 AL BL CL DL AH BH CH DH
16비트 세그먼트 레지스터 CS DS SS ES
및 협동 프로세서 레지스터 스택 ST
● 어셈블리 전 작업 사용
어셈블리를 가르치는 선생님은 어셈블리를 사용하면 레지스터 현장을 저장해야 한다고 거듭 강조하셨다. (사용하기 전의 레지스터 상태를 저장하고, Push로 창고를 압축하고, Pop으로 창고에서 팝을 꺼낸다.) 그러나 이 모든 것은 델피의 삽입식 어셈블리에 필요하지 않다. (자신이 Push와 Pop을 사용하지 않으면) 델피가 도와주었기 때문에 데이터를 잃어버릴 염려가 없다.
ü Delphi 내장형 어셈블리의 사용 방식
1. 일반 함수 과정 중 어셈블리 사용
어셈블러 세그먼트는 다음 절차에 중첩될 수 있습니다. 예:
 procedure TForm1.Button1Click(Sender: TObject);

  var i:smallint;

  begin

   i:=1;

   asm

   mov ax,i

   sal ax,1

   mov &i,ax

   end;

   showmessage(inttostr(i));

  end;

이 프로그램 세그먼트는 16개의 변수 I를 왼쪽으로 이동한 다음 결과를 Mov & I,ax 문장으로 I 변수가 있는 주소에 넣고 값을 되돌려줍니다.마지막으로 I의 값은 2입니다.
2. 독립된 어셈블러 세그먼트
어셈블리 프로그램 세그먼트도 함수나 과정으로 단독으로 쓸 수 있다.이것은 매개 변수의 전달과 결과의 반환에 관련된다.
먼저 Delphi는 함수의 반환에 대해 다음과 같은 규칙을 가지고 있습니다.
즉, 정형 데이터: 8자리는 AL로, 16자리는 AX로, 32자리는 EAX로 돌아간다.
       : ST(0)  

       : EAX  

         : EAX       

        :  @Result  

예를 들어 어셈블리의 구화 함수
  function _Sum(X, Y: Integer): Integer;

   asm

  MOV EAX,X // 32     EAX

  ADD EAX,Y //      

  MOV @Result,EAX //  X+Y

   end;

문자를 대문자로 바꾸는 함수 예
  function _UpCase( ch : Char ) : Char;

  asm

   CMP AL,'a'

   JB @@exit

   CMP AL,'z'

   JA @@exit

   SUB AL,'a' -'A'

  @@exit:

  end;

주의해야 할 것은 두 번째 예에서 첫 번째처럼 매개 변수의 문장을 레지스터에 넣지 않았다는 것이다. 이것은 Delphi에서 기본적으로 Byte (Char) 유형을 AL에 넣기 때문에 Mov 문장을 사용할 필요가 없지만, 이런 함수는 클래스의 구성원이 될 수 없고, 그렇지 않으면 결과가 잘못될 수 있기 때문이다.
3. 어셈블리에서 다른 과정 호출
어셈블리 문의 Call 문은 다른 어셈블리 프로그램 세그먼트 또는 Delphi의 표준 프로세스를 호출하는 데 사용할 수 있습니다.
예를 들어 새 창을 만들고 그 위에 단추를 누르면 클릭 이벤트에 다음 코드를 기록합니다
 procedure TForm1.Button1Click(Sender: TObject);

  begin

   showmessage(`ok');

  end;

과정 하나 더X
  function TForm1._x(var i:smallint):integer;

  asm

   call button1click

  end;

실행x의 결과는 메시지 상자를 표시할 수 있습니다.
● 어셈블리 디버깅
프로그램이 만들어졌어요. 맞아요. 괜찮아요. 틀리면 디버깅 도구를 사용해야 합니다. 변수 추적, 인터럽트, 창고 보기... 어셈블리는 View 메뉴의 Debug Windows CPU 창으로 추적할 수 있습니다.
첨부 코드:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a,b,c,d:Word;
  BYTE1:Byte;
  word1:Word;
  int1:Integer;

(*------------------------------------------------------------------------*)

function add2value(x1:Integer;x2:Integer):Integer ; (*       *)
asm
  mov eax,x1;
  add eax,x2;
  mov @result,eax;    (*      @result *)
end;

(*------------------------------------------------------------------------*)

begin

  try
    { TODO -oUser -cConsole Main : Insert code here }
    asm
      mov a,'A';
      mov b,'B';
      mov c,'C';
      mov d,'D';

    end;
      Writeln(chr(a) + chr(b) + chr(c) + chr(d));

      BYTE1 := $FF;
      Writeln(BYTE1 and $0F);
      BYTE1 := $0F;
      Writeln(BYTE1 or $F0);

      word1 := 1;
      asm
        mov ax,word1
        sal ax,1     (*  1 *)
        mov &word1,ax
      end;

      Writeln(' i = ' + IntToStr(word1));

      int1 := add2value(12,32);
      Writeln(int1);

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  readln;
end.

전재 대상:https://www.cnblogs.com/findumars/p/5034714.html

좋은 웹페이지 즐겨찾기