Windows汇编调用printf

VS2022 汇编

项目右键 生成依赖项 生成自定义 勾选masm
在这里插入图片描述
链接器 高级 入口点 main
在这里插入图片描述

X86

.686
.model flat,stdcall
option casemap:none
includelib ucrt.lib
includelib legacy_stdio_definitions.lib

EXTERN printf:proc

.data
szFormat db '%s',0
szStr db 'hello',0

.code
main proc
	lea eax, szStr
	push eax
	lea eax, szFormat
	push eax
	call printf
	add esp,8
	mov eax,eax
	ret
main endp
end

x64

includelib ucrt.lib
includelib legacy_stdio_definitions.lib

EXTERN printf:proc

.data
szFormat db '%s',0
szHello db 'HelloWorld',0

.code
main proc
	sub rsp,28h
	lea rdx, szHello
	mov rcx,offset szFormat
	call printf
	add rsp,28h
	ret
main endp
end

cpp文件调用汇编函数

要注意汇编文件的项类型正确配置
在这里插入图片描述

;includelib ucrt.lib
includelib legacy_stdio_definitions.lib

EXTERN printf:proc

.data
szFormat db '%s',0
szHello db 'Hello X64',0

.code
x64_print proc
	sub rsp,28h
	lea rcx, szHello
	call printf
	mov eax,666
	add rsp,28h
	ret
x64_print endp
end
extern "C" int x64_print();

int main()
{
	x64_print();
	return 0;
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是x86汇编语言的代码,可以调用C语言的printf函数输出Hello world字符串: ``` section .data hw db 'Hello world!',0 section .text global _start _start: ; 调用printf函数 push hw call printf add esp, 4 ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 ``` 解释一下代码: - `.data`:这个部分定义了变量`hw`,存储了要输出的字符串`Hello world!`,并且在字符串末尾加上了一个0,表示字符串的结束。 - `.text`:这个部分是程序的主体部分,包括了程序的入口点`_start`和调用printf函数的代码。 - `_start`:这是程序的入口点,程序从这里开始执行。 - `push hw`:将字符串`Hello world!`的地址压入栈中。 - `call printf`:调用C语言的printf函数,这个函数的地址在编译时会被链接器解析。 - `add esp, 4`:将栈指针向上移动4个字节,弹出字符串`Hello world!`的地址。 - `mov eax, 1`:将退出程序的系统调用号1存入寄存器eax中。 - `xor ebx, ebx`:将寄存器ebx清零,用来表示程序正常退出。 - `int 0x80`:执行系统调用,退出程序。 需要注意的是,这段代码需要在Linux环境下编译和运行。可以使用gcc编译器来编译这个程序,命令如下: ``` nasm -f elf32 hello.asm gcc -m32 -o hello hello.o ./hello ``` 其中,`nasm`是汇编器,将汇编代码编译成目标文件;`gcc`是链接器,将目标文件链接成可执行文件;`-m32`选项表示生成32位的可执行文件。最后,执行`./hello`就可以运行这个程序了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才不要写代码呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值