-4

我必须想出一个 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
4

1 回答 1

4

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

正在分配初始化为 0 的 128 WORDS 内存。

以下代码行:

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. 如果 AX 较小,则将其复制到 MINIMUM
  6. 递增 IS 递减 CX
  7. 如果 CX = 0(检查零标志)退出循环,否则返回#3
于 2011-07-02T23:30:43.243 回答