-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 ワードのメモリを割り当てています。

次のコード行:

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 (ZERO フラグを確認) の場合はループを終了し、それ以外の場合は #3 に戻る
于 2011-07-02T23:30:43.243 に答える