大连市企帮网络技术有限公司
首页 | 联系方式 | 加入收藏 | 设为首页 | 手机站

产品目录

联系方式

联系人:业务部
电话: 00138-232091
邮箱:service@rueige.com

当前位置:首页 >> 新闻中心 >> 正文

X64 平台 C/C++调用汇编代码

字号:
摘要:X64 平台 C/C++调用汇编代码
汇编好久没用了,差不多忘干净了,说句实话,本菜也不会写,临时找了个例子。
建个文本文档,命名为swap.cpp (记得改下扩展名),内容如下;
int swap(int* a, int* b)
{
 int t;
 t = *a;
 *a = *b;
 *b = t;
 return 1;
}

资源管理器打开 D:\Microsoft Visual Studio 10.0\VC\bin\x86_amd64(这里对照着打开你自己的编译器路径)按住shift键同时单击右键—>在此处打开命令窗口(W),把swap.cpp 拷贝到该目录下,
命令行输入 cl /c /Fa swap.cpp


目录下将产生
swap.asm、 swap.obj(可以直接用,不过既然要汇编就不用它了)
打开swap.asm内容如下:
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 
include listing.inc
INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES
PUBLIC ?swap@@YAHPEAH0@Z ; swap
pdata SEGMENT
$pdata$?swap@@YAHPEAH0@Z DD imagerel $LN3
 DD imagerel $LN3+58
 DD imagerel $unwind$?swap@@YAHPEAH0@Z
pdata ENDS
xdata SEGMENT
$unwind$?swap@@YAHPEAH0@Z DD 010e01H
 DD 0220eH
; Function compile flags: /Odtp
xdata ENDS
_TEXT SEGMENT
t$ = 0
a$ = 32
b$ = 40
?swap@@YAHPEAH0@Z PROC ; swap
; File d:\microsoft visual studio 10.0\vc\bin\x86_amd64\swap.cpp
; Line 2
$LN3:
 mov QWORD PTR [rsp+16], rdx
 mov QWORD PTR [rsp+8], rcx
 sub rsp, 24
; Line 4
 mov rax, QWORD PTR a$[rsp]
 mov eax, DWORD PTR [rax]
 mov DWORD PTR t$[rsp], eax
; Line 5
 mov rax, QWORD PTR a$[rsp]
 mov rcx, QWORD PTR b$[rsp]
 mov ecx, DWORD PTR [rcx]
 mov DWORD PTR [rax], ecx
; Line 6
 mov rax, QWORD PTR b$[rsp]
 mov ecx, DWORD PTR t$[rsp]
 mov DWORD PTR [rax], ecx
; Line 7
 mov eax, 1
; Line 8
 add rsp, 24
 ret 0
?swap@@YAHPEAH0@Z ENDP ; swap
_TEXT ENDS
END

我们来学着上面写个自己的汇编文件,建个记事本,名字mytest.asm,代码如下
.data
.code
t$ = 0
a$ = 32
b$ = 40
my_swap PROC ; swap
 mov QWORD PTR [rsp+16], rdx
 mov QWORD PTR [rsp+8], rcx
 sub rsp, 24
; Line 4
 mov rax, QWORD PTR a$[rsp]
 mov eax, DWORD PTR [rax]
 mov DWORD PTR t$[rsp], eax ; t = *a
; Line 5
 mov rax, QWORD PTR a$[rsp]
 mov rcx, QWORD PTR b$[rsp]
 mov ecx, DWORD PTR [rcx]
 mov DWORD PTR [rax], ecx ;*a = *b
; Line 6
 mov rax, QWORD PTR b$[rsp]
 mov ecx, DWORD PTR t$[rsp]
 mov DWORD PTR [rax], ecx ;*b = t
; Line 7
 mov eax, 1
; Line 8
 add rsp, 24
 ret 0
 my_swap ENDP 
 jiayi PROC 
 mov eax, DWORD PTR [rcx]
 inc eax
 mov DWORD PTR [rcx], eax
 ret 
 jiayi ENDP
end
还是把D:\Microsoft Visual Studio 10.0\VC\bin\x86_amd64目录加入到path环境变量吧,省得每次都进该目录,
写个批处理吧,省得修改文件之后每次编译都要敲,如下
//build-test.bat
ml64 /c mytest.asm
运行批处理,在该目录下生成mytest.obj
新建一个Win32控制台应用程序cc, cc.cpp如下
#include "stdafx.h"
extern "C" void __stdcall jiayi(int* a);
extern "C" int __stdcall my_swap(int* a, int* b);
int _tmain(int argc, _TCHAR* argv[])
{
 int a = 4, b = 5;
 printf("a = %d, b = %d\n", a, b);
 
 jiayi(&a);
 jiayi(&b);
 printf("执行jiayi:\n");
 printf("a = %d, b = %d\n", a, b);
 int ret = my_swap(&a, &b);
 printf("执行my_swap:\n");
 printf("a = %d, b = %d\n", a, b);
 getchar();
 return 0;
}

配置x64平台
点击图片以查看大图 图片名称: QQ截图20150503173422.png 查看次数: 1 文件大小: 22.6 KB 文件 ID : 97595
在附加依赖项里加入刚才的mytest.obj ,用绝对路径吧,反正测试,哈哈。
点击图片以查看大图 图片名称: QQ截图20150503163022.png 查看次数: 3 文件大小: 70.5 KB 文件 ID : 97594
运行结果如下:
点击图片以查看大图 图片名称: QQ截图20150503173642.png 查看次数: 1 文件大小: 18.7 KB 文件 ID : 97596
VS启动调试,下断,右键转到反汇编

跟进去可以看到反汇编
点击图片以查看大图 图片名称: QQ截图20150503165849.png 查看次数: 12 文件大小: 56.9 KB 文件 ID : 97598
呵呵。到此收工,欢迎拍砖!