2010-01-20 123 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