.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函数,因此在跨平台时,memset通常是更通用的选择。 memset是C运行时库中的一个函数,它可以将内存区域的每个字节设置为任意给定的值,不仅...
本文主要探讨了`ZeroMemory`、`memset`以及结构体初始化中的`=0`三种不同方式来清零内存区域的区别和适用场景。 首先,`ZeroMemory`是微软Windows SDK提供的一种宏,用于将指定内存区域的所有字节置零。它的原型是`...
使用C/C++编程时,常使用ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人解决一个导致宕机的bug,查了几小时,才发现是由...
ZeroMemory(&dd, sizeof(dd)); dd.cb = sizeof(dd); do { flag = EnumDisplayDevices(NULL, i, &dd, 0); if (flag) i++; } while (flag); // 通过调试时查看dd.DeviceName中的显示器名称。一般看到的...
ZeroMemory(&devMode, sizeof(DEVMODE)); devMode.dmSize = sizeof(DEVMODE); EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode); // 将亮度设为较暗的值,例如80%原始亮度 devMode....
在这个场景中,我们将探讨如何利用MFC(Microsoft Foundation Classes)中的`CSocket`类来实现UDP广播通信。 `CSocket`是MFC提供的一种用于处理Winsock(Windows Socket)接口的抽象类,它简化了TCP/IP编程,特别是...
在VC++环境中,实现定时打开文件或程序的功能主要涉及到Windows API中的定时器功能以及进程创建。下面我们将详细探讨这些知识点。 首先,Windows API是Microsoft提供的一组函数库,供开发者在Windows操作系统上进行...
ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; // 应用程序窗口句柄 nid.uID = IDI_ICON1; // 图标资源ID nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; ...
ZeroMemory(&ddscaps, sizeof(ddscaps)); ddscaps.dwCaps = DDSCAPS_BACKBUFFER; lpDD->CreateSurface(&ddscaps, &pBackBuffer, NULL); // 在 pBackBuffer 上绘制图像... pBackBuffer->Blt(NULL, pSurface, NULL, ...
ZeroMemory(buffer, 100); DWORD bytesRead; serial.Read(buffer, sizeof(buffer), &bytesRead); CString receivedData(buffer, bytesRead); ``` 4. **关闭串口**: 当完成串口通信后,记得关闭串口以释放...
这些任务可以通过调用Windows API中的`CreateProcess`函数来实现,该函数可以启动新的进程并控制它的执行。本文将深入探讨如何使用VC++6.0通过`CreateProcess`执行CMD命令,并利用命名管道(Named Pipe)来获取命令...
ZeroMemory(&mciOpenParams, sizeof(MCI_OPEN_PARMS)); wcscpy_s(mciOpenParams.lpstrDeviceType, L"waveaudio"); wcscpy_s(mciOpenParams.lpstrFileName, L"path_to_your_wav_file.wav"); result = ...
本篇将详细讲解如何使用C++编程语言来实现Windows平台下的进程隐藏。 首先,我们需要了解Windows API中的几个关键函数,它们是实现进程隐藏的核心: 1. `CreateProcess`:这是创建新进程的主要函数,通过传递一...
ZeroMemory(&bufferDesc, sizeof(DSBUFFERDESC)); bufferDesc.dwSize = sizeof(DSBUFFERDESC); bufferDesc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_GETCURRENTPOSITION2...
下面我们将深入探讨如何在C++中实现自我删除,并讨论相关注意事项。 首先,C++本身并不直接支持文件的自我删除功能,因为这涉及到操作系统级别的文件管理。在Windows系统中,可以通过调用WinAPI函数来实现,而在...
本篇文章将深入探讨如何在MFC环境下实现简单的进程创建。 首先,我们需要理解什么是进程。在操作系统中,进程是正在执行的程序实例,它拥有独立的内存空间和系统资源。在MFC中实现进程创建,主要是利用Windows API...
ZeroMemory(@DevMode, SizeOf(DevMode)); DevMode.dmSize := SizeOf(DevMode); EnumDisplaySettings(nil, ENUM_CURRENT_SETTINGS, @DevMode); // 备份当前显示设置 DisplayInfo := DevMode; // 设置旋转角度...
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_...
ZeroMemory(buffer, sizeof(buffer)); m_ctrlComm.GetInput(bytesAvailable, buffer, sizeof(buffer)); buffer[bytesAvailable] = '\0'; m_strRXData = buffer; } } ``` 以上代码片段仅为示例,实际应用中需要...
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, &...