为了账号安全,请及时绑定邮箱和手机立即绑定

这段汇编代码什么意思啊?有了解的吗

这段汇编代码什么意思啊?有了解的吗

拉莫斯之舞 2023-02-11 22:18:44
push eaxpush edipush ecxmov al, byte ptr[esp + 0x8 + 0xC]mov edi, dword ptr[esp + 0x4 + 0xC]mov ecx, dword ptr[esp + 0xC + 0xC]rep stosbpop ecxpop edipop eaxret 0xC
查看完整描述

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函数

 


查看完整回答
反对 回复 2023-02-15
?
holdtom

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


查看完整回答
反对 回复 2023-02-15
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信