?? unit1.cpp
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#pragma inline
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char orig[100];
char buff[100];
int orig_len;
int buff_len;
memset(orig,0x00,sizeof(orig));
memset(buff,0x00,sizeof(buff));
orig_len=Edit1->Text.Length();
Label1->Caption=orig_len;
memcpy(orig,Edit1->Text.data(),Edit1->Text.Length());
/* 單函數成功
asm{
pushad
lea esi,orig
lea edi,buff
mov ecx,orig_len
lea edx,buff_len
mov [edx],ecx
mov ecx,0
@again:
cmp [edx],ecx
jz @over_now
mov al,byte ptr[esi+ecx]
mov byte ptr[edi+ecx],al
inc ecx
jmp @again
@over_now:
popad
}
*/
//Sleep(10000);
memcpy(buff,"ABCD",4);
// 注意 1.需要pushad和popad保存原來環境
// 2.由于asm相當于直接加入原有code,所以相當于asm里的代碼會被順序執行
// 為了不執行到不想被執行的代碼,必須自己jmp。例如此例中
// 執行完popad,如果沒有jmp,就會去執行atoA了
// 3.asm最外層不能有ret,否則就打斷原來函數的執行了
asm{
pushad
lea esi,orig
lea edi,buff
mov ecx,orig_len
lea edx,buff_len
call atoA
popad
jmp @endasm
atoA proc
push edx
mov edx,0
@again:
cmp ecx,edx
jz @over_now
mov al,byte ptr[esi+edx]
sub al,20H
mov byte ptr[edi+edx],al
inc edx
jmp @again
@over_now:
pop edx
mov [edx],ecx
ret
endp
@endasm:
}
Edit2->Text=buff;
Label2->Caption=buff_len;
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -