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

x86汇编中无法打印命令行参数,求打印所有参数的方法

x86汇编打印所有命令行参数的正确实现

你的代码存在几个关键错误:

  • [ebp + 8] 对应的是参数个数argc,不是第一个命令行参数的地址,第一个参数的地址存在[ebp + 12]指向的数组中
  • 硬把edx设为10完全错误,每个命令行参数的长度不固定,必须手动计算到字符串结束符\0
  • 没有循环遍历所有参数,也未处理参数之间的分隔

下面是能正确打印所有命令行参数的实现,每个参数单独占一行:

section .text
    global main

main:
    push ebp            ; 保存栈帧基址
    mov ebp, esp        ; 建立当前栈帧

    mov ecx, [ebp + 8]  ; ecx = argc(参数个数)
    mov esi, [ebp + 12] ; esi = argv数组的首地址,argv[0]是程序名

print_loop:
    cmp ecx, 0          ; 参数个数为0时退出循环
    je exit_program

    mov ebx, [esi]      ; ebx = 当前要打印的参数字符串地址
    call str_len        ; 调用函数计算字符串长度,结果存入edx

    ; 调用sys_write打印字符串
    mov eax, 4
    mov ebx, 1
    mov ecx, [esi]
    int 0x80

    ; 打印换行符
    mov eax, 4
    mov ebx, 1
    mov ecx, newline
    mov edx, 1
    int 0x80

    add esi, 4          ; 移动到下一个argv元素(x86下指针占4字节)
    dec ecx             ; 参数计数减1
    jmp print_loop

; 字符串长度计算函数:输入ebx=字符串地址,输出edx=长度
str_len:
    mov edx, 0
len_loop:
    cmp byte [ebx + edx], 0 ; 检查当前字符是否为结束符
    je len_done
    inc edx
    jmp len_loop
len_done:
    ret

exit_program:
    mov eax, 1
    xor ebx, ebx
    int 0x80

section .data
newline db 0xA ; 换行符

关键细节说明

  • 借助栈帧获取argc和argv:[ebp+8]是参数总数,[ebp+12]是指向参数指针数组的地址
  • str_len函数遍历字符串直到\0,返回长度到edx,这是正确打印字符串的核心
  • 每打印一个参数后输出换行,方便区分不同参数
  • 用esi遍历argv数组,每次偏移4字节,同时递减ecx计数,直到所有参数处理完成

编译运行方式(假设文件名为args.asm):

nasm -f elf32 args.asm -o args.o
ld -m elf_i386 args.o -o args
./args hello world test

运行后会输出:

./args
hello
world
test

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:38:29