GNU nano 2.2.4 File: argv.s
.section .text
.globl _start
_start:
movl %esp, %ebp
movl 8(%ebp),%ecx
movl $4,%edx
movl $1,%ebx
movl $4,%eax
int $0x80
movl $1,%eax
movl $0,%ebx
int $0x80
让我作为这个问题的前言,说我(显然)是asm的新手,欢迎任何与该主题无关的随机一般建议...... 我打算简单地从bash终端读取argv [1]并将其打印出来。这是为了确保我真正知道如何接受争论的测试。如果我输入一个整数,如2.程序打印2O。资本'o',而不是零。为什么呢?
答案 0 :(得分:2)
您需要了解 argv [1] 不是整数,而是字符串终止为空!字符串是以'\0'
结尾的字节序列。
这意味着当您通过cmd-line将字符 2 传递给您的应用时,内存中的此字符串将显示为[2][\0]
,其中仅包含2个字节。 问题是您将%edx 中的尺寸指定为 4 ,这不是真的,并且会打印write()
另外2个字节的内存垃圾到你的屏幕。
正确的方法是在您的应用程序上实现strlen()
功能。此函数遍历字节流,计算字符\0
出现之前的字节数。只有这样你才能打印出正确的字符串。 strlen()
时,请将write()
返回的号码用作%edx 。