一千萬個為什麽

搜索

emu8086在數組中找到最小值和最大值

是的,我已經徹底搜索了整個地方的互聯網以尋求幫助。不,我對裝配一無所知。我進入課程一周(微處理器),老師是一個瘋狂的精神病患者,認為他生氣,因為我們都是初學者。

無論如何,我必須提出一個ASM代碼(對於emu8086),它將在任何給定大小的數組中找到最小值和最大值。在示例代碼中,他提供(似乎是)一個包含名為LIST的數組的數據段。他聲稱他將用其他不同大小的列表替換此列表,我們的代碼必須能夠處理它。

這是下面的示例代碼。我已經突出顯示了我添加的部分,只是為了向您展示我已盡力解決此問題:

; You may customize this and other start-up templates; 
; The location of this template is c:\emu8086\inc\0_com_template.txt

org 100h

data segment
    LIST DB 05H, 31H, 34H, 30H, 38H, 37H
    MINIMUM DB ?
    MAXIMUM DB ?
    AVARAGE DB ?
    **SIZE=$-OFFSET LIST**
ends

stack segment       **;**

    DW 128 DUP(0)   **; I have NO CLUE what this is supposed to do**

ends                **;**

code segment
start proc far

; set segment registers:

    MOV AX,DATA      **;**
    MOV DS,AX        **;I'm not sure what the point of this is, especially since I'm supposed to be the programmer, not my teacher.**
    MOV ES,AX        **;**

; add your code here

**;the number of elements in LIST is SIZE (I think)                                      
MOV CX,SIZE   ;a loop counter, I think

;find the minimum value in LIST and store it into MINIMUM

;begin loop
AGAIN1:


 LEA SI,LIST
 LEA DI,MINIMUM
 MOV AL,[SI]
 CMP AL,[SI+1]
 If carry flag=1:{I got no idea}

LOOP AGAIN1

;find the maximum value in LIST and store it into MAXIMUM
    ;Something similar to the other loop, but this time I gotta find the max.

AGAIN2:


 LEA SI,LIST
 LEA DI,MINIMUM
 MOV AL,[SI]
 CMP AL,[SI-1]        ;???



LOOP AGAIN2


**
; exit to operating system.

    MOV AX,4C00H
    INT 21H

start endp

ends

end start ; set entry point and stop the assembler.

ret

最佳答案

我不是肯定的,但我認為你想在LIST變量之後立即移動SIZE變量:

data segment
    LIST DB 05H, 31H, 34H, 30H, 38H, 37H
    SIZE=$-OFFSET LIST
    MINIMUM DB ?
    MAXIMUM DB ?
    AVARAGE DB ?
ends

它的作用是為您提供當前地址($)和LIST變量開頭之間的字節數 - 從而為您提供列表變量本身的大小(以字節為單位)。因為LIST是一個字節數組,SIZE將是數組的實際長度。如果LIST是一個WORDS數組,則必須將SIZE除以2。如果你的老師寫了那段代碼,那麽也許你應該不管它。

我不清楚為什麽你的老師做了一個堆棧段,我想不出任何使用它的理由,但也許它將在未來的任務中變得清晰。現在,您可能應該知道DUP是復制的簡寫。這行代碼:

DW 128 DUP(0)

將128個字的內存初始化為0。

以下代碼行:

MOV AX,DATA
MOV DS,AX
MOV ES,AX

正在設置指針,以便您可以遍歷LIST。您需要知道的是,此時,AX指向數據段的開頭,因此指向LIST的開頭。

至於其余的......看起來你有一個無限循環。你需要做的是:

  1. 將SI設置為指向LIST的開頭
  2. 將CX設置為LIST的長度,您已經完成了
  3. 將[SI]的第一個字節復制到AX
  4. 將AX與內存變量MINIMUM
  5. 進行比較
  6. 如果AX較小,請將其復制到MINIMUM
  7. 增加IS和decriment CX
  8. 如果CX = 0(檢查ZERO標誌)退出循環,否則,返回#3

轉載註明原文: emu8086在數組中找到最小值和最大值