汇编好久没用了,差不多忘干净了,说句实话,本菜也不会写,临时找了个例子。
建个文本文档,命名为swap.cpp (记得改下扩展名),内容如下;
资源管理器打开 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内容如下:
我们来学着上面写个自己的汇编文件,建个记事本,名字mytest.asm,代码如下
建个文本文档,命名为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如下
写个批处理吧,省得修改文件之后每次编译都要敲,如下
//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;
}
呵呵。到此收工,欢迎拍砖!