亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這段匯編代碼什么意思啊?有了解的嗎

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 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

了解更多

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號