2 回答
TA贡献1829条经验 获得超7个赞
push eax ;入栈
push edi ;入栈
push ecx ;入栈,这里的三句是为了保护寄存器的数据
mov al, byte ptr[esp + 0x8 + 0xC] ;取一个字节的数据到AL
mov edi, dword ptr[esp + 0x4 + 0xC] ;取一个BUFFER的地址
mov ecx, dword ptr[esp + 0xC + 0xC] ;取这个BUFFER的大小
rep stosb ;循环给BUFFER赋值,将AL赋给整个BUFFER,循环次数为BUFFER大小.
pop ecx ;出栈
pop edi ;出栈
pop eax ;出栈,这里三句是为了恢复寄存器的数据
ret 0xC ;ret是从子程序返回,后面的值是要平衡栈,即ESP+0XC
--------------------------------------------------------------------------------
你这段代码既然是C里面嵌的,我猜想你外部的C代码大概结构如下
//我猜想C方法结构大概如下,实现的功能就是将BUFFER内存块全部实始化成指定的CHAR
void memsetChar(char *buffer,char c,int bufLen)
{
__asm{
这里是你求解释的汇编语言
}
}
下面再给个调用的例子:
char buffer[1024];
memsetChar(buffer,'A',1024); //将数组全部初始化成字符A
最后补充一句,那段汇编的功能等同于C函数 memset函数
TA贡献1805条经验 获得超10个赞
push eax ;入栈
push edi ;入栈
push ecx ;入栈,这三次其实是想将参数利用栈来传递
mov al, byte ptr[esp + 0x8 + 0xC];你前面缺少了子程序调用call部分,这部分是在子程序中想取出参数eax原值中的低八位,送入al中。为什么要加8,是前有call,又加12是对应第一次入栈的eax
mov edi, dword ptr[esp + 0x4 + 0xC]
mov ecx, dword ptr[esp + 0xC + 0xC]
rep stosb
pop ecx
pop edi
pop eax
ret 0xC
- 2 回答
- 0 关注
- 87 浏览
添加回答
举报