汇编!! 在一个asm文件中怎么调用另一个asm文件中的函数

m504055331 2014-02-25 04:17:28
如题,
///123.asm 如下,里面就写了一个函数f,函数原型是int f(int a, int b, int c, int d, int e)
f proc
mov ecx, dword ptr [rsp+28h]
ret
f ENDP

///456.asm 如下,里面写了一个函数g,在g中调用f,函数原型是int g()
.code
g proc
include H:\\del\\Test20140217\\123.asm
mov rax, f(1,2,3,4,5);取出的是参数堆栈中的e
ret
g ENDP
end

用ml64 /c 456.asm编译总出现456.asm(4) : error A2008: syntax error : ,错误
就是mov rax, f(1,2,3,4,5);取出的是参数堆栈中的e 这行出错了。
求大侠帮忙解决,菜鸟感激不尽啊!!!
...全文
1806 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
m504055331 2014-02-26
  • 打赏
  • 举报
回复 1
纠结半天,终于出来,不知道方法是不是精确和简练,但是有结果了 分别改成下边的: ///123.asm 如下 public f .code f proc mov rax, r8 ret f ENDP end ///456.asm 如下, extern f:far .code g proc mov rcx, 1 mov rdx, 2 mov r8, 3 mov r9, 4 call f mov rdx, rax;取出的是参数堆栈中的e ret g ENDP end 使用的时候,将123.obj和456.obj都包含进去就可以了 PS:非常感谢大家的回答,谢谢
mLee79 2014-02-25
  • 打赏
  • 举报
回复
像这个样子, 自己改 masm 语法吧, 只喜欢 yasm ... f.S

section .text


;int f_C(int a, int b, int c, int d, int e)
extern f_C

; int f_asm(int a, int b, int c, int d, int e)
global f_asm 

f_asm:
%ifdef ELF64
	mov rdi, 1
	mov rsi, 2
	mov rdx, 3
	mov rcx, 4
	mov r8, 5
	call f_C		; return 100 + f_C(1,2,3,4,5)
	add rax, 100    ; 
	ret
%else
	sub rsp, 64
	mov rcx, 1
	mov rdx, 2
	mov r8 , 3
	mov r9 , 4
	mov QWORD [rsp+32], 5
	
	call f_C	   ; return 100 + f_C(1,2,3,4,5)	
	add rax, 100
	
	add rsp, 64
	ret	
%endif	
	
	ret
	
main.c

#include <stdio.h>

int f_C(int a, int b, int c, int d, int e)
{
	return a + b + c + d + e;
}

int f_asm(int a, int b, int c, int d, int e);

int main()
{
	printf("%d\n", f_C(1,2,3,4,5));
	printf("%d\n", f_asm(1,2,3,4,5));
	return 0;
}
WIN64 下: yasm -f win64 -o f.obj f.S cl main.c f.obj linux 下: yasm -f ELF64 -DELF64 -o f.o f.S gcc -m64 main.c f.o
mLee79 2014-02-25
  • 打赏
  • 举报
回复
win64 下前4个参数用寄存器传递, elf64下前6个参数用寄存器传递 . 1楼的写法可不行地..
  • 打赏
  • 举报
回复
引用 6 楼 miao504 的回复:
to : akirya(珍惜生命远离CPP ) 你说的意思是不用写 include H:\\del\\Test20140217\\123.asm 这句话 换成 extern int f(int a, int b, int c, int d, int e) 是这样操作么?
得是汇编的写法 查 PROTO
m504055331 2014-02-25
  • 打赏
  • 举报
回复
to : akirya(珍惜生命远离CPP ) 因为在64位机器上,vs2010不能嵌入汇编语言,所以是单独的asm文件,生成obj再调用的 在两个asm之间出现了函数调用情况,要怎么处理呢?
m504055331 2014-02-25
  • 打赏
  • 举报
回复
to : akirya(珍惜生命远离CPP ) 你说的意思是不用写 include H:\\del\\Test20140217\\123.asm 这句话 换成 extern int f(int a, int b, int c, int d, int e) 是这样操作么?
  • 打赏
  • 举报
回复
引用 3 楼 miao504 的回复:
由于刚接触汇编,领导让在64位机器上写汇编,遇到此问题,纠结半天了还是不知道怎么解决,求过路的都来帮忙想想那
声明一下函数,就可以调用了.
赵4老师 2014-02-25
  • 打赏
  • 举报
回复
在汇编相关帮助里面搜“public”“extern” ?
m504055331 2014-02-25
  • 打赏
  • 举报
回复
由于刚接触汇编,领导让在64位机器上写汇编,遇到此问题,纠结半天了还是不知道怎么解决,求过路的都来帮忙想想那
m504055331 2014-02-25
  • 打赏
  • 举报
回复
to: truelance 我想将f定义成一个宏来使用,但是不知道怎么定义, 要按你说的那样,是不是在每次使用f的时候都要重新压栈?
熊熊大叔 2014-02-25
  • 打赏
  • 举报
回复
f(1,2,3,4,5); 语法不一定正确, 大意是 push BP, 5 push BP, 4 push BP, 3 push BP, 2 push BP, 1 call f pop BP, 5

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧