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#调用)