externdef 的语法格式:
symbol 是用户想要定义的外部符号,type 是该符号的类型,定义外部函数时,类型是 proc。
比如调用 printf() 函数,语句为:
externdef printf:proc
;filename: main.asm
option casemap:none
;所有符号区分大小写
.data
;该段用于定义已初始化的数据
fmtStr byte 'hello word !', 10, 0
;fmtStr是定义的变量名,ASCII码10是换行符,ASCII码0是空终止符
.code
;这个部分是写可执行指令的地方
externdef printf:proc
;externdef伪指令放在该段中
public asmFunc
;public伪指令声明asmFunc可被外部访问
asmFunc proc
sub rsp, 56
;减少栈指针RSP的值56个字节,在栈上分配空间
lea rcx, fmtStr
;将fmtStr的地址加载到rcx寄存器中。printf期望在rcx中接收格式字符串
call printf
;调用printf函数打印字符串
add rsp, 56
;平栈
ret
;返回到调用方
asmFunc endp
end
//filename: 源.cpp
extern "C"
{
void asmFunc(void); // 调用汇编写的 asmFunc 函数
}
// extern "C" 防止 C++ 编译器的名称篡改
int main(void) {
printf("Call asmFuncn");
asmFunc();
printf("Returned from asmFunc");
}
原文始发于微信公众号(走在网安路上的哥布林):ASM 调用 C/C++ 函数
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论