如何在X86-64汇编中打印命令行参数的数量?
X86-64汇编打印命令行参数数量的问题修正
你的代码里存在几个关键错误,导致无法正确获取并打印命令行参数数量,下面逐一说明并给出修正方案:
核心问题分析
- 错误的栈操作逻辑:
popq %rsp是完全错误的用法,这会直接修改栈指针寄存器的值,根本无法获取argc。在X86-64的System V调用约定中,main函数的第一个参数argc是通过%rdi寄存器直接传递的,不需要从栈上读取。 - 格式字符串不匹配:你使用了
%s(字符串格式符),但argc是整数类型,应该用%d来匹配。 - printf参数传递顺序错误:
printf要求第一个参数是格式字符串(放在%rdi),第二个参数才是要打印的值(放在%rsi)。你的代码先把argc移到%rdi,随后立刻用格式字符串覆盖了%rdi,导致argc丢失。
修正后的代码
.file "args.s" .globl main .type main, @function .section .data format_string: .string "Number of arguments: %d\n" ; 改为整数格式符%d .section .text main: pushq %rbp movq %rsp, %rbp movq %rdi, %rsi ; 将main的第一个参数argc移到printf的第二个参数寄存器 movq $format_string, %rdi ; 设置printf的第一个参数:格式字符串 call printf leave ret .size main, .-main
代码说明
- 按照X86-64 System V ABI规则,
main函数的参数传递是固定的:argc在%rdi,argv(参数数组指针)在%rsi,无需手动从栈中读取。 - 调用
printf时,严格遵循其参数传递规则:格式字符串放在%rdi,要打印的整数值argc放在%rsi。 - 格式字符串改用
%d,确保和整数类型的argc匹配。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

