当前位置: 首页 > news >正文

做网站开创和中企动力哪家强凡客旗下商城

做网站开创和中企动力哪家强,凡客旗下商城,无锡那家网络公司做网站好,学习吧网站1. C/C调用汇编 C/C想调用汇编代码必须要注意名称修饰的问题 名称修饰(name decoration): 一种标准的C/C编译技术, 通过添加字符来修改函数名, 添加的字符指明了每个函数参数的确切类型。主要是为了支持函数重载, 但对于汇编来说其问题在于, C/C编译器让链接器去找被修饰过的名…1. C/C调用汇编 C/C想调用汇编代码必须要注意名称修饰的问题 名称修饰(name decoration): 一种标准的C/C编译技术, 通过添加字符来修改函数名, 添加的字符指明了每个函数参数的确切类型。主要是为了支持函数重载, 但对于汇编来说其问题在于, C/C编译器让链接器去找被修饰过的名称而非原始名称 名称修饰说白了就是C/C源代码经过编译器编译后, 函数和变量名称发生了变化, 链接器会去找变化后的名字而非源码中定义的名字。 影响名称修饰的主要因素如下: 编程语言, 比如C和C名称修饰就不同调用约定, 比如C和STDCALL的名称修饰不同 举个例子, C和C之间的名称修饰就是不同 a. C语言中的名称修饰格式以及C与汇编混合编程 源码如下: 看一下其生成obj文件: 发现经过VS的C编译器编译后main和Add名称前多了下划线。由于C语言默认的函数调用约定是C调用约定。所以这就是C语言使用C调用约定下的名称修饰。 _name 接下去将Add的调用约定改成STDCALL 再来查看一下生成的obj文件, 发现其名称修饰方式发生了改变: 所以C语言STDCALL调用约定下的名称修饰方式是: _namen 这里的n代表压入栈帧参数的大小, 由于Add参数参别是2个int类型, 在x86下也就是8字节大小, 所以经过C编译器名称修饰后就变成了 _Add8 总结一下, C编译器编译C源码时, 默认情况下函数使用C调用约定, 除非强制指定其他调用约定, 其编译后生成的obj文件中, 名称修饰的方法如下: C stdcall: _namen C cdecl: _name 接下来看一下汇编语言, 首先使用C调用约定, 经过汇编生成obj文件。 查看winhex发现: 不出乎意料, FindMax和main函数都使用了C调用方式的名称修饰, 但是ExitProcess却使用了STDCALL的名称修饰规则, 这很正常, 因为微软的API都使用STDCALL。 由于C语言和汇编生成的obj目标文件中的名称修饰都是相同的, 所以可以得出结论: C可以直接调用使用C调用约定下的汇编代码, 无需任何改变 下面实验一下: 这是汇编源码: 将汇编生成的obj文件包含到项目内, 测试发现C语言调用C调用约定下的汇编没有问题: 如果说汇编使用STDCALL调用约定汇编生成对应的obj文件, 然后让C来进行调用, 结果就会发现这个熟悉的链接错误: 这个原因已经很明显了, 因为C语言默认使用C调用约定, 编译后生成的是_name格式的函数名, 当汇编使用STDCALL调用约定时, 生成的是_namen格式的函数名, 当链接时自然就无法找到名称了。 所以可以得出结论: C可以直接调用使用STDCALL调用约定下的汇编代码, 会出现无法解析外部符号的链接错误 b. C中的名称修饰格式以及C与汇编混合编程 使用C编写一个程序, C默认也使用C调用约定: 查看其生成的obj目标文件 可以发现经过C编译器编译后, C调用约定下Add函数生成了一种非常奇怪的形式, 这主要是为了实现重载而做的。而main函数永远是C调用约定不会被C编译器改变。 这也就意味着C和C其实也使不可以互相调用的 因为如果你要用C调用C代码。假设都使用C调用约定, C代码经C编译器生成了obj文件, 里面的名称修饰是: _name 而C编译器编译代码生成的obj里面使用的名称修饰是: ?AddYAHHHZ 当链接时, C去找**?AddYAHHHZ**结果只有_Add, 这是肯定不可能找到的。 下面把Add函数变成STDCALL函数调用约定试试看: 可以发现其名称修饰变成了如下: ?AddYGHHHZ // stdcall ?AddYAHHHZ // C 得出结论: C下C和STDCALL调用约定有区别, 但是区别不大, 把A变成了G 如果想要在C下调用汇编代码, 只要把C的名称修饰转换成C的就可以了。 所以只要C能调用C, 也就意味着C可以调用汇编, 事实上也确实如此, 在C源文件中, 函数添加extern C即可让C函数使用C的名称修饰方法 C源码生成obj, 放入winhex内便可发现, C使用了C的名称修饰方式, 不管是什么调用约定, extern C都会让C使用C的调用约定。 使用同样的方法就可以实现C调用汇编代码了。 2. C/C调用汇编的另一种方式: 内联汇编 这种方式只能在x86下进行, 并没有什么特别的地方: 这里给一个例子, 是一个对称xor加密的小例子: #include iostream #include windows.h #include tchar.h#define FILEBLK (0x1000)using namespace std;VOID CryptoBlock(PBYTE pbBuf, DWORD dwBufSize, UCHAR bKey) {__asm{mov esi, pbBufmov ecx, dwBufSize mov bl, bKeyL0:xor BYTE PTR [esi], blinc esi loop L0}return; }BOOLEAN SymFileCrypto(LPCSTR pcszFilePathName, UCHAR bKey) {HANDLE hFile INVALID_HANDLE_VALUE;HANDLE hNewFile INVALID_HANDLE_VALUE;BOOLEAN fOk FALSE;LARGE_INTEGER liFileSize { 0 };int iTotalBlk 0;BYTE bBuf[FILEBLK] { 0 };char szTmpFileName[] TmpFile;DWORD dwReaded 0;DWORD dwWritten 0;__asm{// 参数检测mov esi, pcszFilePathNametest esi, esijz Ending// 打开文件push NULLpush FILE_ATTRIBUTE_NORMALpush OPEN_EXISTINGpush NULLpush 0push FILE_ALL_ACCESSpush esicall CreateFile// 文件句柄检查cmp eax, -1jne Next1 jmp Ending Next1:// 保存文件句柄mov hFile, eax// 获取文件大小lea eax, liFileSizepush eaxpush hFilecall GetFileSizeEx// 计算总块数mov eax, liFileSize.LowPartmov edx, liFileSize.HighPartmov ebx, FILEBLKdiv ebxtest edx, edx jz Next2inc eax Next2:mov iTotalBlk, eax// 创建新文件push NULLpush FILE_ATTRIBUTE_NORMALpush CREATE_ALWAYSpush NULLpush 0push FILE_ALL_ACCESSlea eax, szTmpFileNamepush eaxcall CreateFile// 文件句柄检查cmp eax, -1jne Next3jmp EndingNext3:mov hNewFile, eax Crypto:// 读取文件内容push NULL lea eax, dwReadedpush eax mov eax, FILEBLKpush eax lea eax, bBuf push eaxpush hFile call ReadFile test eax, eax jz Ending // 加解密xor eax, eax mov al, bKey push eax push dwReaded lea eax, bBufpush eaxcall CryptoBlock// 写入文件内容push NULLlea eax, dwWritten push eax push dwReaded lea eax, bBuf push eaxpush hNewFile call WriteFiletest eax, eax jz Ending mov ecx, iTotalBlkdec ecx mov iTotalBlk, ecxtest ecx, ecx jnz Cryptomov fOk, TRUE}Ending:__asm{cmp hNewFile, -1jz Next4 push hNewFile call CloseHandle mov hNewFile, NULLNext4:cmp hFile, -1jz Next5push hFile call CloseHandle mov hFile, NULLNext5:xor eax, eax mov al, fOktest eax, eax jz Next6// 删除源文件mov eax, pcszFilePathNamepush eaxcall DeleteFile // 改名mov eax, pcszFilePathNamepush eax lea eax, szTmpFileNamepush eax call MoveFile Next6:mov esp, ebppop ebp ret } }int main(int argc, char **argv) {if (argc ! 3){printf(usage: %s file key\r\n, argv[0]);return(-1);}if (SymFileCrypto(argv[1], argv[2][0])){printf(成功\r\n);}else{printf(失败\r\n);}return(0); }(完)
http://wiki.neutronadmin.com/news/349949/

相关文章:

  • 国家新闻大事网站如何做seo规划
  • 网站建设里怎么写文章米拓网站建设
  • 做网站如何屏蔽中国的ipwap网站和internet网站
  • 网站信息备案查询系统阿里巴巴对外贸易平台
  • 海北公司网站建设完全可定制的软件
  • 网站页面权重在阿里云做网站教程
  • 做网站需要的大图网络推广大概需要多少钱
  • 网站建设和推广电话销售话术网站建设好后能直接打开吗
  • 安徽网站开发与维护专业CDN 网站是否需要重新备案
  • 女性门户网站模板哔哩哔哩网页版打开
  • 网站建设 软件开发什么网站专做宠物物品
  • 西宁网站建设报价ew君博贴心2015网站备案没下来
  • 直播平台网站建设触屏手机网站设计
  • 比较好的高端网站制作公司呼和浩特免费制作网站
  • 网站建设和系统集成wordpress手机编辑器插件
  • 医疗 企业 网站制作泰安房产网
  • 网站建设公司怎么做的中铁三局招聘事件
  • 如何做彩票网站信息奉化市住房和城乡建设局网站
  • 钓鱼网站在线下载网站服务器出错了怎么办
  • 上海专业做网站较好的公司有哪些wordpress商品列表
  • 衣服定制的app有哪些seo外包杭州
  • 深圳旅游公司网站wordpress主题安装不
  • 手表网站建设规划书东道设计公司待遇如何
  • 网站发布 图片看不到开发公司解除前期物业服务合同
  • 做个人网站要多少钱如何把图片做网站背景
  • 哈尔滨做网站搭建的腾讯云服务器搭建网站
  • wordpress程序网站深圳网站建设的客户在哪里
  • 方特网站是谁做的flask网站开发源码
  • 大公司做网站网站logo上传
  • 营销策划推广公司seo优化排名平台