首页
社区
课程
招聘
X64 平台 C/C++调用汇编代码
发表于: 2015-5-3 17:48 11431

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

2015-5-3 17:48
11431
汇编好久没用了,差不多忘干净了,说句实话,本菜也不会写,临时找了个例子。
建个文本文档,命名为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平台

在附加依赖项里加入刚才的mytest.obj ,用绝对路径吧,反正测试,哈哈。

运行结果如下:

VS启动调试,下断,右键转到反汇编

跟进去可以看到反汇编

呵呵。到此收工,欢迎拍砖!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 341
活跃值: (153)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
需要 学习了
2015-5-4 08:26
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习学习.
2015-5-4 09:13
0
雪    币: 74
活跃值: (1023)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习下,感谢分享
2015-5-4 09:57
0
雪    币: 144
活跃值: (733)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错,因为听说不支持x64 vs雷链汇编了
2015-5-4 10:24
0
雪    币: 248
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了,试试
2015-5-17 22:41
0
雪    币: 261
活跃值: (547)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
右键自定义工具集  命令输入 DOS命令一样的 方便些
2015-12-12 18:39
0
雪    币: 1361
活跃值: (1225)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
mark
2015-12-12 18:45
0
雪    币: 5143
活跃值: (4960)
能力值: ( LV10,RANK:171 )
在线值:
发帖
回帖
粉丝
9
感谢,最近在查如何用VS编译汇编,问题解决了
2018-1-4 15:54
0
游客
登录 | 注册 方可回帖
返回