emu8086在数组中找到最小值和最大值

时间:2011-07-02 22:47:08

标签: arrays assembly x86-16

是的,我已经彻底搜索了整个地方的互联网以寻求帮助。不,我对装配一无所知。我进入课程一周(微处理器),老师是一个疯狂的精神病患者,认为他生气,因为我们都是初学者。

无论如何,我必须提出一个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

1 个答案:

答案 0 :(得分:3)

我不是肯定的,但我想你想在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