VS2017编写汇编函数并调用

Posted wyzrain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2017编写汇编函数并调用相关的知识,希望对你有一定的参考价值。

先在VS里面创建个空项目,然后添加汇编文件 .asm,    右键asm文件属性  --- 常规,改成下图的设置  , 从生成中排除改为否, 项类型改为自定义生成工具 然后点确定。

 

技术图片

 

 再次右键asm文件属性, 配置属性 ---自定义生成工具  --- 常规  :在命令行中写入: ml /c /coff %(fileName).asm    

 输出:%(fileName).obj;%(OutPuts)     然后点确定就可以正常运行了

 

      

 

技术图片

 

 

 

.asm  汇编代码

 1 ;测试函数   三个数相加  
 2 ;.386
 3 .model flat, c
 4 ;public test_
 5 .code    
 6 
 7 test_ proc
 8 
 9 ;初始化栈帧指针
10     push ebp
11     mov ebp,esp
12     push     ebx
13 
14  
15     ;确保除数不为0
16     xor eax,eax
17 
18     ;加载参数值
19     mov ecx,[ebp+8]  ;ecx = a
20     mov edx,[ebp+12]  ;edx = b
21     or edx,edx
22     jz test1_  ;诺b为0 则跳转
23 
24     ;计算积并保存
25     imul    edx,ecx
26     mov    ebx,[ebp+16]
27     mov    [ebx],edx
28 
29     ;计算商和余数 ,并保存结构
30     mov eax,ecx
31     cdq
32     idiv dword ptr [ebp+12]
33 
34     mov ebx,[ebp+20]
35     mov [ebx],eax
36     mov    ebx,[ebp+24]
37     mov    [ebx],edx    
38     mov    eax    ,1
39 
40 test1_: 
41 
42 pop ebx
43 pop ebp
44 ret    
45 test_ endp    
46 
47 end

.cpp 代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 using namespace std;
 4 extern "C" int test_(int a, int b, int* prod , int * quo ,int * rem);
 5 
 6 int main()
 7 {
 8     int a = 21, b = 9;
 9     int prod = 0, qro = 0, rem = 0;
10     int rc;
11 
12     rc = test_(a, b, &prod, &qro, &rem);
13 
14     printf("Input1  -  a:     %4d    b:     %4d 
", a, b);
15     printf("Output1 - rc:     %4d   prod:   %4d
", rc, prod);
16     printf("         qro:     %4d    rem:   %4d 
", qro, rem);
17     
18     a = -29;
19     prod = qro = rem = 0;
20     rc = test_(a, b, &prod, &qro, &rem);
21     printf("Input2  -  a:     %4d    b:     %4d 
", a, b);
22     printf("Output2 - rc:     %4d   prod:   %4d
", rc, prod);
23     printf("         qro:     %4d    rem:   %4d 
", qro, rem);
24 
25 
26     b = 0;
27     prod = qro = rem = 0;
28     rc = test_(a, b, &prod, &qro, &rem);
29     printf("Input3  -  a:     %4d    b:     %4d 
", a, b);
30     printf("Output3 - rc:     %4d   prod:   %4d
", rc, prod);
31     printf("         qro:     %4d    rem:   %4d 
", qro, rem);
32 
33 
34 
35 
36     system("pause");
37     return 0;
38 }

 

汇编设置的方法参考来源:https://blog.csdn.net/qq_33775402/article/details/78828235

 

以上是关于VS2017编写汇编函数并调用的主要内容,如果未能解决你的问题,请参考以下文章

32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针

VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)

VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)

vs2017 自定义生成规则 错误 MSB3721 命令 ”已退出,返回代码为 1。

如何在vs2017中进行64位汇编的配置