2010-01-20 77 views
0

我遇到了汇编代码问题。我是一个汇编程序的新手,所以我自己很难解决它。汇编程序任务 - 阵列的最小值和最大值

任务是:“查找数组的最小和最大元素。”

我已经完成的所有工作是搜索最大元素。我找不到,如何检查最小的元素,以及我应该在哪里进行验证。或者,可能,我应该在找到最大元素后第二次遍历元素?

代码:

#include <conio.h> 
#include <stdio.h> 
#include <iostream.h> 
void main() { 
    int N = 10, i; 
    clrscr(); 
    int a[] = { 1, 4, -6, 12, -25, 10, 3, -4, 15, 7}, MAX, MIN, RESULT; 

    __asm{ 
    mov cx, N 
    lea si, a 
    lodsw 
    mov bx, ax 
    mov dx, ax 
    dec cx } 
    m: 
     __asm{ 
    lodsw 
    cmp dx, ax 
    jge m1 
    mov dx, ax 
     } 
    m1: 
     __asm{ 
     loop m 
     mov MAX, dx 
    } 

cout << "Max = " << MAX; 
//cout << "Min = " << MIN; 
getch(); 
} 
+0

是否最好在计算最大值的同一个循环中计算最小值,也就是说,对于每个元素,在寄存器中进行计算时,在测试最大值的同时对其进行最小值测试。在标签'm1'似乎是正确的地方。 – 2010-01-20 12:04:08

+0

谢谢你的帮助。我已经理解了算法,如何实现这种验证,但不幸的是我无法编写代码来使此代码可行。 – Alex 2010-01-20 12:25:31

回答

0

如果它是有趣的人,这里是我的问题的解决方案(我今天发现了它与我的导师的帮助):

#include <conio.h> 
#include <stdio.h> 
#include <iostream.h> 
void main() { 
    int N = 10, i; 
    clrscr(); 
    int a[] = { 1, 4, -6, 12, -25, 10, 3, -4, 15, 7}, MAX, MIN, RESULT; 

    __asm{ 
     mov cx, N 
     lea si, a 
     lodsw 
     mov MIN, ax 
     mov MAX, ax 
     dec cx 
    } 
    m: 
    __asm{ 
     lodsw 
     cmp MIN, ax 
     jle m1 
     mov MIN, ax 
     jmp m2 
    } 
    m1: 
    __asm{ 
     cmp MAX, ax 
     jge m2 
     mov MAX, ax 
    } 
    m2: 
    __asm{ 
     loop m; 
    } 

cout << "Max = " << MAX << "\n"; 
cout << "Min = " << MIN; 
getch(); 
} 

算法:如果cmp MIN, ax具有负的结果,这意味着ax大于MIN。因此,脚本跳转到m1标签以比较ax值与MAX。当cmp MIN, ax返回正值时,脚本将ax寄存器的值赋值给MIN变量,然后跳转到m2标签以递减循环计数器。查找最大值的算法的工作原理类似(标签m1)。

3

如果你更换 “JGE” 与 “JLE” 会怎样?试试看看。

+0

结果将等于'-25' - 数组的最小值。 – Alex 2010-01-20 14:58:58

+0

非常好。现在你有两个循环,一个计算最小值,一个计算最大值。你需要做什么才能将它们组合成一个循环?提示:您拥有的循环已经初始化了两个寄存器(bx和dx),但目前仅使用其中的一个。 – 2010-01-20 15:56:40