【问题标题】:Read 16 bits from memory in Assembly x86 NASM在 Assembly x86 NASM 中从内存中读取 16 位
【发布时间】:2015-03-09 09:19:34
【问题描述】:

我正在尝试在汇编中做一个非常简单的练习:将位于连续存储单元中的 N 个数字相加。这是我的实际代码:

全局 _start
节 .data

        数组:DD 300,10,20,30,40,50 ;分配号码
        arrayLen: EQU $-array ;获取数字的数量

部分 .text
        _开始:

        移动 ecx, 0 ;柜台
        移动 ebx, 0 ;蓄能器

循环:添加 ebx, DWORD [array+ecx] ;获取第 i 个单词并将其添加到累加器中
        添加 ecx, 4
        cmp ecx, arrayLen
        循环

        移动 eax, 1
        整数 0x80

程序已正确编译和执行,但返回的值不正确。结果应该是 450,而不是我得到 194。

我注意到 194 与 450 是相同的比特流,但省略了第 9 位。 调试我的程序时,我争辩说由于某种原因,我在阅读时无法理解

[数组+ecx]

虽然我指定了关键字 DWORD,但它只能读取 8 位。

有人可以帮助我吗? 提前致谢

【问题讨论】:

  • 你在哪里看到 8 位读取? ebx 增加了一个 4 字节(dword)值,没关系。也许你在看BL,而不是EBX
  • 当我在终端执行程序时,它返回 ebx 中的值。要查看这个返回值,我输入 echo $?

标签: assembly x86 sum nasm 32-bit


【解决方案1】:

程序正确地对数组求和。问题在于返回结果。

[答案已更正,感谢 Jester。]

您将返回值传递给sys_exit()(这是mov eax, 1; int 0x80 所做的)。 sys_exit() 只留下返回值的the lower 8 bits(其他位用于某些标志)。

这就是第 9 位丢失的地方。

Shell 观察已截断的返回值并将其打印出来。

【讨论】:

  • 非常感谢,这非常有用!如何在汇编中为我的程序设置返回码?
  • 实际上在exit系统调用期间第9位已经丢失了。这不是外壳的错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2017-03-12
  • 2015-01-12
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多