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

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 


分享到:
评论

相关推荐

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

    然而,需要注意的是,ZeroMemory只是一个宏,其内部实现通常会调用memset函数,因此在跨平台时,memset通常是更通用的选择。 memset是C运行时库中的一个函数,它可以将内存区域的每个字节设置为任意给定的值,不仅...

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

    本文主要探讨了`ZeroMemory`、`memset`以及结构体初始化中的`=0`三种不同方式来清零内存区域的区别和适用场景。 首先,`ZeroMemory`是微软Windows SDK提供的一种宏,用于将指定内存区域的所有字节置零。它的原型是`...

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

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

    VC 实现多屏显示

    ZeroMemory(&dd, sizeof(dd)); dd.cb = sizeof(dd); do { flag = EnumDisplayDevices(NULL, i, &dd, 0); if (flag) i++; } while (flag); // 通过调试时查看dd.DeviceName中的显示器名称。一般看到的...

    VC++实现点击按钮屏幕变暗特效

    ZeroMemory(&devMode, sizeof(DEVMODE)); devMode.dmSize = sizeof(DEVMODE); EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode); // 将亮度设为较暗的值,例如80%原始亮度 devMode....

    利用CSocket实现UDP广播通信

    在这个场景中,我们将探讨如何利用MFC(Microsoft Foundation Classes)中的`CSocket`类来实现UDP广播通信。 `CSocket`是MFC提供的一种用于处理Winsock(Windows Socket)接口的抽象类,它简化了TCP/IP编程,特别是...

    vc 实现定时打开文件或程序

    在VC++环境中,实现定时打开文件或程序的功能主要涉及到Windows API中的定时器功能以及进程创建。下面我们将详细探讨这些知识点。 首先,Windows API是Microsoft提供的一组函数库,供开发者在Windows操作系统上进行...

    VC++实现CMD命令执行与获得返回信息

    这些任务可以通过调用Windows API中的`CreateProcess`函数来实现,该函数可以启动新的进程并控制它的执行。本文将深入探讨如何使用VC++6.0通过`CreateProcess`执行CMD命令,并利用命名管道(Named Pipe)来获取命令...

    VC任务栏提示区托盘图标的实现

    ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // 应用程序窗口句柄 nid.uID = IDI_ICON1; // 图标资源ID nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; ...

    利用DirectX7.0实现图像全屏幕显示。(10KB)...

    ZeroMemory(&ddscaps, sizeof(ddscaps)); ddscaps.dwCaps = DDSCAPS_BACKBUFFER; lpDD->CreateSurface(&ddscaps, &pBackBuffer, NULL); // 在 pBackBuffer 上绘制图像... pBackBuffer->Blt(NULL, pSurface, NULL, ...

    C++和mfc实现rs232串口通讯

    ZeroMemory(buffer, 100); DWORD bytesRead; serial.Read(buffer, sizeof(buffer), &bytesRead); CString receivedData(buffer, bytesRead); ``` 4. **关闭串口**: 当完成串口通信后,记得关闭串口以释放...

    C++实现进程隐藏

    本篇将详细讲解如何使用C++编程语言来实现Windows平台下的进程隐藏。 首先,我们需要了解Windows API中的几个关键函数,它们是实现进程隐藏的核心: 1. `CreateProcess`:这是创建新进程的主要函数,通过传递一...

    用Directsound实现音频采集(Visual C++)

    ZeroMemory(&bufferDesc, sizeof(DSBUFFERDESC)); bufferDesc.dwSize = sizeof(DSBUFFERDESC); bufferDesc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_GETCURRENTPOSITION2...

    c++实现自我删除

    下面我们将深入探讨如何在C++中实现自我删除,并讨论相关注意事项。 首先,C++本身并不直接支持文件的自我删除功能,因为这涉及到操作系统级别的文件管理。在Windows系统中,可以通过调用WinAPI函数来实现,而在...

    MFC下做的简单进程实现

    本篇文章将深入探讨如何在MFC环境下实现简单的进程创建。 首先,我们需要理解什么是进程。在操作系统中,进程是正在执行的程序实例,它拥有独立的内存空间和系统资源。在MFC中实现进程创建,主要是利用Windows API...

    delphi 实现屏幕旋转代码

    ZeroMemory(@DevMode, SizeOf(DevMode)); DevMode.dmSize := SizeOf(DevMode); EnumDisplaySettings(nil, ENUM_CURRENT_SETTINGS, @DevMode); // 备份当前显示设置 DisplayInfo := DevMode; // 设置旋转角度...

    vc6.0 mfc实现结束程序进程及刷新托盘图标

    ZeroMemory(input, sizeof(INPUT) * 2); input[0].type = INPUT_MOUSE; input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE; input[0].mi.dx = (WORD)(point.x * 65535 / GetSystemMetrics(SM_...

    用VC实现串口的方法

    ZeroMemory(buffer, sizeof(buffer)); m_ctrlComm.GetInput(bytesAvailable, buffer, sizeof(buffer)); buffer[bytesAvailable] = '\0'; m_strRXData = buffer; } } ``` 以上代码片段仅为示例,实际应用中需要...

    C++实现ping命令的功能(Windows),使用WinSock2.h借助Windows API实现ping命令已经域名解析功

    ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; // 允许IPv4和IPv6 hints.ai_socktype = SOCK_RAW; hints.ai_protocol = IPPROTO_ICMP; int error = getaddrinfo(hostName, NULL, &hints, &...

    vc轻松实现播放MP3/wav等音频文件

    ZeroMemory(&mciOpenParams, sizeof(MCI_OPEN_PARMS)); wcscpy_s(mciOpenParams.lpstrDeviceType, L"waveaudio"); wcscpy_s(mciOpenParams.lpstrFileName, L"path_to_your_wav_file.wav"); result = ...

Global site tag (gtag.js) - Google Analytics