装配比较指令

时间:2012-10-04 01:51:54

标签: assembly

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

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

我知道会有4种情况:

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

我写了一个> 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

1 个答案:

答案 0 :(得分:2)

暂时忘掉作业。

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

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

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

请注意,值的顺序(例如,如果&lt; b&lt; b&lt; b&lt; c&lt; c&lt; b&lt; b等)无关紧要 - 无论有多少值,您都不需要知道。< / p>

现在,将此方法应用于分配,您只在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;