奇怪的集会搞砸涉及一个有效但不正确的程序

时间:2011-05-26 17:41:36

标签: assembly gnu

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',而不是零。为什么呢?

1 个答案:

答案 0 :(得分:2)

您需要了解 argv [1] 不是整数,而是字符串终止为空!字符串是以'\0'结尾的字节序列。

这意味着当您通过cmd-line将字符 2 传递给您的应用时,内存中的此字符串将显示为[2][\0],其中仅包含2个字节。 问题是您将%edx 中的尺寸指定为 4 ,这不是真的,并且会打印write()另外2个字节的内存垃圾到你的屏幕。

正确的方法是在您的应用程序上实现strlen()功能。此函数遍历字节流,计算字符\0出现之前的字节数。只有这样你才能打印出正确的字符串。 strlen()时,请将write()返回的号码用作%edx