【发布时间】:2016-10-16 03:55:03
【问题描述】:
我正在开发一个同时使用 x86 汇编 (NASM) 和 C 的项目。有一个用 Assembly 编写的子例程,它使用索引寻址模式来确定某个年份 (int) 是否小于或大于另一个年份,然后根据结果返回 -1、1 或 0。看来,如果我输入超过 4 或 5 条记录,则无法正确排序。我花了几个小时通过 gdb 运行它,并发现在第一次递增 j 的最后一次迭代中(在 i 递增之前),它运行交换,即使它不应该运行,但我不确定如何修复它。提前感谢您的任何想法。
---C代码---
【问题讨论】:
-
为什么不将函数参数传递给
cmpbook,而不是使用两个全局变量?这真的很难看(而且有点慢)。相关:此评论是虚假的:mov esi, [book1] ; store the pointers to each book。这是一个加载指令(内存源,而不是内存目标)。 -
uses indexed addressing modes to figure out if a certain year (int) is lesser or greater than another。另一个完全虚假的描述。我真的很好奇你发明了什么样的查找表来比较整数和地址数学,而不是只使用cmp,但事实证明你只是使用[reg + displacement]寻址模式来访问结构字段。 -
您在 asm 函数的末尾缺少
ret。 -
其中一些是为我们设置的,并规定了我们能做什么和不能做什么。全局变量是其中的一部分。我们还没有学会如何在 Assembly 和 C 之间传递类似的参数。