`
黑色杰克史密斯
  • 浏览: 15348 次
社区版块
存档分类
最新评论

ZeroMemory SSE 实现

 
阅读更多
      .686                      ; create 32 bit code
	  .mmx
	  .xmm                     
      .model flat, stdcall      ; 32 bit memory model
      option casemap :none      ; case sensitive

    .code

; ml -c /omf ad.asm
; Microsoft (R) Macro Assembler Version 10.00.30319.01
; Copyright (C) Microsoft Corporation.  All rights reserved.

_align16_zero_memory proc C  _byte_num, _source
		option prologue:none, epilogue:none	
		
		mov eax, [esp+4] ; - U load _byte_num
		push edi         ; - V save old frame 
		mov edi, [esp+12] ; - U load _source 
		push ecx         ; - V save old frame 
		mov ecx, eax     ; - U save old frame 
		nop              ; - V spare 
		shr eax, 7       ; - U get round 
		je _remain_byte_deal ; - V/N deal remain frame 
		pxor xmm0, xmm0  ; get zero 
		align 16 
	main_loop:  

		movdqa [edi], xmm0 
		movdqa [edi+010h], xmm0
		movdqa [edi+020h], xmm0 
		movdqa [edi+030h], xmm0
		
		movdqa [edi+040h], xmm0 
		movdqa [edi+050h], xmm0
		movdqa [edi+060h], xmm0 
		movdqa [edi+070h], xmm0
		
		add edi, 128 
		nop 
		dec eax 
		jnz main_loop ; jnz opr ... maybe unsafe ... 
		mov eax, ecx  ; - U save old frame 
		and ecx, 112  ; - V/N 0x0111 0000
		shr ecx, 3    ; - U 0x0000 1110 0/2/4/6/
		align 16      ; - V/N maybe jmp opcode/nop opcode 
		_remain_byte_deal:
				pxor xmm0, xmm0               ; get zero
				lea edi, [edi-070h+ecx*8]     ; - N 
				jmp [RemainDQwordTable+ecx*4] ; - N
		align 16 
		SB0E:
		SB0F:
			movdqa [edi], xmm0 
		SB0C:
		SB0D:
			movdqa [edi+010h], xmm0
		SB0A:
		SB0B:
			movdqa [edi+020h], xmm0 
		SB08:
		SB09:
			movdqa [edi+030h], xmm0
		SB06:
		SB07:
			movdqa [edi+040h], xmm0 
		SB04:
		SB05:
			movdqa [edi+050h], xmm0
		SB02:
		SB03:
			movdqa [edi+060h], xmm0 	
		SB00:
		SB01:
			neg ecx 
			and eax, 15 
			lea edi, [edi+070h+ecx*8]
			mov ecx, eax 
			xor eax, eax 
			cld 
			rep stosb 
			pop ecx
			pop edi
			ret 
		RemainDQwordTable dd   SB00, SB01, SB02, SB03, SB04, SB05, SB06, SB07
						  dd   SB08, SB09, SB0A, SB0B, SB0C, SB0D, SB0E, SB0F
_align16_zero_memory endp

SetUpZeroMem proc C  _byte_num, _source
			 option prologue:none, epilogue:none	
			 
			 mov eax, [esp+8] ; - U load source  
			 push edi ; - V save old frame 
			 mov edi, eax     ; - U
			 push ecx ; - V save old frame 
			 mov ecx, [esp+12] ; - U load num 
			 nop      ; - V spare 
			 cmp ecx, 16 
			 jb __miniature_copy 
			 and eax, 15       ; - U 
			 jmp [eax*4+_ByteTable]
			 align 16 
			 OP00:
				  push edi 
				  push ecx 
				  call _align16_zero_memory
				  add esp, 8
				  pop ecx 
				  pop edi 
				  ret 
			 OP01: ; 0000 0001 
				  mov byte ptr [edi], 0
				  mov word ptr [edi+1], 0
				  mov dword ptr [edi+3], 0
				  mov dword ptr [edi+7], 0
				  mov dword ptr [edi+11], 0
				  add edi, 15
				  sub ecx, 15 
				  jmp OP00
			 OP02: ; 0000 0002 
				  mov word ptr [edi], 0
				  mov dword ptr [edi+2], 0
				  mov dword ptr [edi+6], 0
				  mov dword ptr [edi+10], 0
				  add edi, 14
				  sub ecx, 14 
				  jmp OP00
			 OP03: ; 0000 0003 
				  mov byte ptr [edi], 0
				  mov dword ptr [edi+1], 0
				  mov dword ptr [edi+5], 0
				  mov dword ptr [edi+9], 0
				  add edi, 13
				  sub ecx, 13
				  jmp OP00
			 OP04: ; 0000 0004 
				  mov dword ptr [edi], 0
				  mov dword ptr [edi+4], 0
				  mov dword ptr [edi+8], 0
				  add edi, 12
				  sub ecx, 12
				  jmp OP00
			 OP05: ; 0000 0005 
				  mov byte ptr [edi], 0
				  mov word ptr [edi+1], 0
				  mov dword ptr [edi+3], 0
				  mov dword ptr [edi+7], 0
				  add edi, 11
				  sub ecx, 11
				  jmp OP00
		     OP06: ; 0000 0006 
				  mov word ptr [edi], 0
				  mov dword ptr [edi+2], 0
				  mov dword ptr [edi+6], 0
				  add edi, 10
				  sub ecx, 10
				  jmp OP00
			 OP07: ; 0000 0007 
				  mov byte ptr [edi], 0
				  mov dword ptr [edi+1], 0
				  mov dword ptr [edi+5], 0
				  add edi, 9
				  sub ecx, 9
				  jmp OP00
			 OP08: 
				  mov dword ptr [edi], 0
				  mov dword ptr [edi+8], 0				  
				  sub ecx, 8
				  add edi, 8
				  jmp OP00
			 OP09: 
				  mov byte ptr [edi], 0
				  mov word ptr [edi+1], 0
				  mov dword ptr [edi+3], 0				  
				  sub ecx, 7
				  add edi, 7
				  jmp OP00	  
			 OP0A: 
				  mov word ptr [edi], 0
				  mov dword ptr [edi+2], 0				  
				  sub ecx, 6
				  add edi, 6
				  jmp OP00
			 OP0B: 
				  mov byte ptr [edi], 0
				  mov dword ptr [edi+1], 0				  
				  sub ecx, 5
				  add edi, 5
				  jmp OP00
			 OP0C: 
				  mov dword ptr [edi], 0			  
				  sub ecx, 4
				  add edi, 4
				  jmp OP00
			 OP0D: 
				  mov byte ptr [edi], 0
				  mov word ptr [edi+2], 0			 	  
				  sub ecx, 3
				  add edi, 3
				  jmp OP00	  
			 OP0E: 
				  mov word ptr [edi], 0			  
				  sub ecx, 2
				  add edi, 2
				  jmp OP00
			 OP0F: 
				  mov byte ptr [edi], 0			  
				  dec ecx 
				  inc edi 
				  jmp OP00
		__miniature_copy:	 
			 cld 
			 xor eax, eax 
			 rep stosb ; rep maybe rubbish 
			 pop ecx 
			 pop edi 
			 ret 			 
			 _ByteTable    dd   OP00, OP01, OP02, OP03, OP04, OP05, OP06, OP07
						   dd   OP08, OP09, OP0A, OP0B, OP0C, OP0D, OP0E, OP0F
SetUpZeroMem endp
		end 


分享到:
评论

相关推荐

    C++中ZeroMemory、memset危险需慎用

    使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人解决一个导致宕机的bug,查了几小时,才发现是由...

    ZeroMemory、memset和 “=0” 的区别.pdf

    。。。

    ZeroMemory、memset和 “=0” 的区别.docx

    。。。

    C++实现调用系统时间简单示例

    本文简述了基于VC++实现的调用系统时间的简单示例,这里只列出主要部分代码,供大家参考一下,具体如下: 首先要注意添加头文件: #include 然后就简单了,这里只粘出主要用法如下: #ifdef _SECURITY ...

    操作系统实验题目

    操作系统的实验题目

    MFC打开文件和文件夹

    // ZeroMemory(&ofn,sizeof(ofn)); // ofn.lStructSize = sizeof(ofn); // ofn.lpstrFile = szFile; // ofn.lpstrFile[0] = TEXT('/0'); // ofn.nMaxFile = sizeof(szFile); // ofn.lpstrFilter = TEXT("all/0*...

    一个串口通信的小程序

    ZeroMemory ( &ComState ,sizeof(ComState) ); ZeroMemory ( &OvLap ,sizeof(OvLap) ); OvLap.Offset = 0; OvLap.OffsetHigh = 0; OvLap.hEvent = CreateEvent (NULL,TRUE,FALSE,NULL); //Clear All ...

    Monitor Audio Volume Levels 监视音量

    ZeroMemory(&mxc, sizeof(mxc)); mxc.cbStruct = sizeof(mxc); rc = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (MMSYSERR_NOERROR != rc) { // Couldn‘t get the ...

    可以仿造ip

    所以在Windows 9x/NT里是无法通过Winsock函数库来实现IP头自定义的,当然可以通过编写虚拟设备驱动程序来实现,不过比较复杂,但Windows 2000的出现打破了这种局面,Windows2000的Winsock2.2函数库里全面支持...

    易语言插件感染

    易语言插件感染源码,插件感染,GetDword,SetDword,SetWord,GetbyteAddress,GetTextAddress,CopyMemory,ZeroMemory

    IDirectDraw7的使用

    LPDIRECTDRAW7 lpDD;...ZeroMemory( &ddsd, sizeof( ddsd ) ); ZeroMemory( &ddscaps, sizeof( ddscaps ) ); 这两个语句使ddsd和ddscaps中的变量都为零,如果不这样做下面的CreateSurface会不成功。

    windows编程资料大全

    查询了有关资料文档以后,发现Windows 9x和Windows NT4.0 没有提供API或系统调用来实现这样的功能。但是,在Windows 2000中提供了一个新的函数:GetLastInputInfo(),这个函数使用结构 LASTINPUTINFO 作为参数: ...

    MFC通过ado类连接SQL、MYSQL、ACCESS多种数据库

    1.支持连接SQL,MYSQL、ACCESS ... ::ZeroMemory(this,sizeof(DBPARA)); nDriverType = driverSQLServer; nTimeOut = 60000;} }DbPara; 3.可调用增删查改,存储过程 4.调用存储过程可返回结果

    微信机器人

    注入dll到微信 0x0 首先要打开微信进程 wchar_t wxPath[] = LC:\\Program Files (x86)\\Tencent\\WeChat\\...ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); si.dwFlags = STARTF_U

    MD5 加密 源代码

    MD5 加密 源代码 procedure MD5Final(var Context: MD5Context; var Digest: MD5Digest); var Bits: MD5CBits; Index: longword; PadLen: longword;... ZeroMemory(@Context, SizeOf(MD5Context)); end;

    Delphi简体转繁体—繁体转简体

    function GBCht2Chs(GBStr: ...ZeroMemory(pGBCHSChar, Len * 2 + 1); //GB CHS -> GB CHT LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len * 2); result := string(pGBCHSChar);

    Kernel Detective v1.3.1

    [+]Added New Features For DLLs (ZeroMemory/UnmapMemory) [+]Added Unicode/Ascii String Reference In Disassembler Window [+]Added Physical Memory Dumper [+]Added Thread Stack Trace [+]Added "Copy" and ...

    VC6 CListCtrl继承类例子

    ::ZeroMemory(&lvcprev, sizeof(lvcprev)); lvc.mask = LVCF_WIDTH | LVCF_FMT; lvcprev.mask = LVCF_WIDTH | LVCF_FMT; CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rtClient; ...

    socket编写windows和linux通讯程序-源码

    利用socket编写windows和linux通讯程序(源代码实现) <br> socket编程大家都很熟悉,我在这里就不再罗嗦了。直接切入正题。该程序分两部分,server端和client端(谁都知道)。其中server端采用windows平台,那...

    add custem pages to control panel applets

    ZeroMemory ( &psp, sizeof(PROPSHEETPAGE) ); psp.dwSize = sizeof(PROPSHEETPAGE); psp.dwFlags = PSP_USEREFPARENT | PSP_DEFAULT | PSP_USECALLBACK; psp.hInstance = _Module.GetResourceInstance(); psp...

Global site tag (gtag.js) - Google Analytics