模板建站和定制建站,网站如何做视频的软件,网站开发 验收周期,wordpress博客主题中文最近在搞C和汇编混合编程#xff0c;对栈平衡有点小理解#xff0c;记录一下
当我们调用一个API或者子程序时时#xff0c;API和子程序可以理解为函数#xff0c;我们不必在返回的时候平衡栈里面的函数参数#xff0c;但C语言库函数要我们自己平衡栈数据#xff0c; 比如…最近在搞C和汇编混合编程对栈平衡有点小理解记录一下
当我们调用一个API或者子程序时时API和子程序可以理解为函数我们不必在返回的时候平衡栈里面的函数参数但C语言库函数要我们自己平衡栈数据 比如下面的程序
#include stdio.h
#include windows.hint main(int argc, char* argv[])
{printf(begin\n);HINSTANCE libHandle;char *dlluser32.dll;libHandleLoadLibrary(dll);__asm{xor ebx,ebxpush ebxpush 0x61626364push 0x65666768mov eax,esppush ebxpush eaxpush eaxpush ebx mov eax,dword ptr[MessageBox]call eax//mov esp,0x450add esp,12}return 0;
}这段程序的功能是弹出MessageBox我们最后平衡栈数据用到add esp12为什么是12呢一共push了7次应该是28啊因为在stacall标准中我们是不用考虑MessageBox参数的MessageBox一共4个参数 push ebxpush eaxpush eaxpush ebx 这4个push是不用我们管得所以是12。但有一个我们要注意就是wsprintf这个需要我们自己去平衡栈里面的参数数据 下面是调试的结果 在运行到push 0x65666768esp的值是 当运行完call eaxesp的值 两个值是相同的
调用C语言库函数时 #include stdio.h
int main(){char *strhello\n;__asm{push strcall printf}return 0;
}进入asm和出asm时esp的值要相同。比如说我们程序进入__asm后esp的值是0那么在出asm时一定要让esp的值变成0。 上面的程序假设执行 xor ebx,ebx前esp0当我们出asm时esp的值一定要为0不然会报错上面的add esp12就是这个目的如果我们把这个去掉在运行就会报下面的错误 在举个例子 int main(){__asm{push 0;}return 0;
}这段程序也会报上面的错误
写在最后 这些是和同学讨论出来的如果有什么不对的地方希望指出来
自己很菜在学了点汇编后自己摸索C和汇编混合编程的很多东西还不懂会继续努力的。
以后会继续补充