📄 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 + -