You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 

代码说明

  1. 按照X86-64 System V ABI规则,main函数的参数传递是固定的:argc在%rdi,argv(参数数组指针)在%rsi,无需手动从栈中读取。
  2. 调用printf时,严格遵循其参数传递规则:格式字符串放在%rdi,要打印的整数值argc放在%rsi。
  3. 格式字符串改用%d,确保和整数类型的argc匹配。

内容的提问来源于stack exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:57:05