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 關注
- 117 瀏覽