64位Windows下汇编调用printf无输出问题求助
64位Windows汇编调用printf无输出的解决办法
你的汇编代码无法输出内容,核心是两个问题没处理好:
1. 违反了Microsoft x64调用约定
printf是可变参数函数,按照Windows x64调用规则,必须把AL寄存器设为通过XMM寄存器传递的浮点参数个数——这里你没有传浮点参数,所以得把AL置0。之前的代码里漏掉了这一步,导致printf内部逻辑出错,没法正常执行输出。
2. 标准输出缓冲区未刷新
你定义的字符串没有换行符\n,stdout默认是行缓冲模式,程序直接退出时缓冲区里的内容还没被刷到控制台,自然看不到输出。
修正后的完整代码
; hello.asm section .data hello db 'Hello, World!', 0xA, 0 ; 加上换行符0xA,强制缓冲区刷新 section .text global main extern printf extern ExitProcess main: mov rdi, hello ; 第一个参数存入rdi(符合Windows x64调用约定) xor al, al ; 标记无浮点参数传递 call printf mov eax, 0 call ExitProcess
编译链接命令不变
编译:
nasm -f win64 hello.asm -o hello.obj
链接:
gcc -o hello.exe hello.obj -lkernel32 -lmsvcrt
额外说明:Windows x64调用约定里,前4个整数/指针参数要依次放在RCX、RDX、R8、R9,可变参数函数必须用AL声明浮点参数数量,这些规则一定要遵守,不然很容易出现诡异的运行错误。
内容的提问来源于stack exchange,提问作者Aseed Kid
相关产品推荐
相关产品推荐

