emu8086 найти минимум и максимум в массиве - PullRequest
0 голосов
/ 03 июля 2011

Да, я тщательно обыскал интернет повсюду, чтобы помочь с этим.Нет, я ничего не понимаю в сборке.Я прохожу 1 неделю на курсе (микропроцессоры), и учитель - психопат с психикой, который думает, что он бесится, потому что мы все новички.

В любом случае, мне нужно придумать код 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 Ответ

3 голосов
/ 03 июля 2011

Я не уверен, но я думаю, что вы хотите переместить переменную SIZE сразу после переменной LIST:

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

То, что он делает, это дает вам количество байтов между текущим адресом ($) и началом переменной LIST - таким образом, давая вам размер (в байтах) самой переменной списка. Поскольку LIST является массивом байтов, SIZE будет фактической длиной массива. Если бы LIST был массивом слов, вам пришлось бы разделить размер на два. Если ваш учитель написал этот код, то, возможно, вам следует оставить его в покое.

Мне не совсем ясно, почему ваш учитель сделал сегмент стека, я не могу придумать причину его использования, но, возможно, это станет ясно в будущем задании. На данный момент вы, вероятно, должны знать, что DUP - это сокращение от дубликатов. Эта строка кода:

DW 128 DUP(0)

Распределяет 128 СЛОВ памяти, инициализированной на 0.

следующие строки кода:

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

Настраиваете ваши указатели, чтобы вы могли просматривать список. Все, что вам нужно знать, это то, что в этот момент AX указывает на начало сегмента данных и, следовательно, на начало вашего LIST.

Что касается остальных ... похоже, у вас бесконечный цикл. Что вам нужно сделать, это:

  1. Установить SI для указания на начало списка
  2. Установите CX равным длине списка, вы сделали это
  3. Скопировать первый байт из [SI] в AX
  4. Сравнить AX с переменной памяти MINIMUM
  5. Если AX меньше, скопируйте его в MINIMUM
  6. Инкремент IS и декримент CX
  7. Если CX = 0 (отметьте флаг ZERO), выйдите из цикла, в противном случае вернитесь к # 3
...