【问题标题】:strange assembly goof-up involving a working, but incorrect program涉及工作但不正确的程序的奇怪装配错误
【发布时间】:2011-05-26 17:41:36
【问题描述】:
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”,而不是零。为什么?

【问题讨论】:

  • 实际上它打印的是 'OR' 而我只是注意到了 'R'

标签: assembly gnu


【解决方案1】:

您需要了解 argv[1] 不是您想要的 整数,而是 一个以 null 结尾的字符串!字符串是以'\0'结尾的字节序列。

这意味着当你通过 cmd-line 将字符 2 传递给你的应用程序时,内存中的这个字符串将看起来像 [2][\0],它仅包含 2 个字节。 问题是您在 %edx 中将尺寸指定为 4,这是不正确的,并且会使 write() 再打印 2字节的内存垃圾到您的屏幕。

做你想做的事情的正确方法是在你的应用程序上实现strlen() 函数。此函数遍历字节流,计算在字符 \0 出现之前有多少字节。只有这样您才能打印正确的字符串。当您write() 时,使用strlen() 返回的数字作为%edx

【讨论】:

  • 快速修复您的代码,如果您真的只想打印字符串的第一个数字,请将 %edx 更改为 movl $1,%edx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2014-01-15
  • 2012-07-01
  • 2014-09-25
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多