ARM汇编访问ARGV打印参数字符串乱码问题求助
ARM汇编打印命令行参数乱码问题解决方案
核心问题原因
你的代码存在3个核心逻辑错误:
- 入口处
r1本来存储的是argv数组的首地址,你执行mov r1, r0把r1覆盖为了argc的值,直接丢失了argv的起始指针 - 你从
sp + #8读取数据的逻辑完全错误:你入栈了ip和lr两个4字节寄存器,此时sp + #8指向的是入栈操作前的栈地址,存储的是无关的历史值,和argv没有任何关系,读到的自然是无效内存数据 - 就算正确拿到argv首地址,
argv[0]存储的是程序自身的名称路径,你需要的第一个用户输入参数对应argv[1],需要在首地址基础上偏移4字节读取
修正后的代码
.data stringD: .asciz "Argc: %d\n" stringS: .asciz "First arg: %s\n" .text .global main main: push {ip, lr} @ 先把argv首地址存到r2,避免后续操作被覆盖 mov r2, r1 @ 打印参数个数 mov r1, r0 ldr r0, =stringD bl printf @ 读取argv[1],即第一个用户输入参数的指针 ldr r1, [r2, #4] ldr r0, =stringS bl printf pop {ip, pc} .global printf .end
验证效果
用argdisplay ab ac ad命令运行修正后的程序,输出如下:
Argc: 4 First arg: ab
完全符合需求预期。
内容的提问来源于stack exchange,提问作者Rick Dearman
相关产品推荐
相关产品推荐

