【问题标题】:Negative result on the stack in assembly组装中堆栈的负结果
【发布时间】:2015-07-07 11:26:30
【问题描述】:

组装 AT&T。

嗨, 当我尝试执行 subl 时遇到问题。

特别是我正在尝试 x - y where x 。 但是正确的结果并没有入栈。

这里有一段代码:

....
call read             # Function to read a number (i.e. 5)
movl %eax, -8(%ebp)   # Copy the number read into the stack.
....
call read             # Function to read a number (i.e. 15)
movl %eax, -28(%ebp)  # Copy the number read into the stack.
....
movl -8(%ebp), %eax   # Copy the number 5 in EAX.
subl -28(%ebp), %eax  # EAX = 5 - 15
movl %eax, -32(%ebp)  # Put the result in -32(%ebp)
....

如果我打印 -32(%ebp),我不会得到 -10 (5-15),但会得到一个奇怪的符号。

所以,问题是:如何在不改变形式的情况下将负数存储在堆栈上?

非常感谢。

阿方兹

【问题讨论】:

  • 您是否使用了可以处理 32 位有符号数字的打印功能?
  • 你得到了什么“奇怪的符号”?
  • 您的调试器显示 EAX 的值是多少?
  • @SuperBiasedMan 在这种情况下,使用 5 - 15,即 -10,我获得符号“&”。如果我尝试使用 10 - 15,即 -5,我会得到符号“+”。
  • @AlfonZ 我之所以问你 EAX 中有什么是因为你实际上并没有告诉我们。 “一些奇怪的符号”几乎没有足够的描述性。 EAX 中实际的十六进制值是多少?

标签: assembly stack negative-number att


【解决方案1】:

错误是您的打印功能不是为支持负数而设计的。

您可以在堆栈(或其他地方)中存储一个负数而不改变其形式。但是您需要使用该存储值来理解它是一个有符号数量。

您的打印函数将任何小于 10 的值视为单个非负数(通过向其添加“0”并打印该单个字符)。当您将“0”添加到负数并打印该字符时,您会得到观察到的“奇怪符号”。

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 2012-10-12
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    相关资源
    最近更新 更多