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
相关产品推荐
相关产品推荐

