-3

这是我们在这个汇编课程介绍中的第一个实验室。我有一个任务,我必须编写嵌入在 c 中的程序集。教授提供了 C 代码,但我们必须编写自己的程序集。任务是比较 3 个值(已放入 eax、ebx 和 ecx)并将最大值和最小值相加并乘以 2。

我写了一个场景,我想知道我是否走在正确的轨道上。

我知道会有4种情况:

  • a > b > c
  • a < b > c
  • a > b < c
  • a < b < c

我写了a>b>c。

这个对吗 ?当我编译教授提供的测试时,我得到了奇怪的答案。例如 eax = 3, ebx = 2, ecx = 1 应该给出 8 的答案,但它给出了一些奇怪的东西。请帮忙,谢谢。

cmp eax, ebx
jge agreatb

agreatb:
cmp ebx, ecx
jge bgreatc

bgreatc:
add eax, ecx
mov eax, edx
4

1 回答 1

2

暂时忘记任务。

如果有 12345 个值,你被要求找出最高和最低的值,你会怎么做?显而易见的方法是跟踪“当前最高值”和“当前最低值”;对于列表中的每个值,您将检查它是否应该成为新的最高值或新的最低值。

对于这种情况,您可以从“current_highest = value1; current_lowest = value1”开始,然后检查 value2 是高于当前最高值还是低于当前最低值,然后检查 value3,然后是 value4,等等(循环直到到达最后一个价值)。

可以将相同的算法实现为在具有任意数量条目的数组中找到最高和最低值的代码(只要值的数量> = 1)

请注意,值的顺序(例如,如果 a < b < c、a < c < b 等)是无关紧要的 - 无论有多少值,您都不需要知道。

现在,将此方法应用于分配,您只在 3 个值的列表中搜索最高和最低值:

current_highest = a;
current_lowest = a;

if(b < current_lowest) current_lowest = b;
else(b > current_highest) current_highest = b;

if(c < current_lowest) current_lowest = c;
else(c > current_highest) current_highest = c;
于 2012-10-04T05:16:57.140 回答