1

n数値の平均を計算する 8086 アセンブリ言語プログラムを作成するにはどうすればよいですか? 私は2つのプログラムを書きました。1 つはmov ah,01 int 21h入力関数を使用するため、1 つの数値のみを受け入れます。このため、10 のような数字を入力することはできません。

もう一方のバッファから読み取りました。多くの数字を受け入れることができますが、問題は継続的にループすることです。

最初のプログラムは次のとおりです。

.MODEL SMALL
.DATA
        VAL1    DB      ?
        NL1     DB      0AH,0DH,'ENTER HOW MANY NO U WANT:','$'
        NL2     DB      0AH,0DH,'ENTER NO:','$'
        NL3     DB      0AH,0DH,'AVEARGE:','$'
.CODE
MAIN    PROC
        MOV AX,@DATA
        MOV DS,AX

        LEA DX,NL1
        MOV AH,09H
        INT 21H

        MOV AH,01H
        INT 21H
        SUB AL,30H

        MOV CL,AL
        MOV BL,AL
        MOV AL,00
        MOV VAL1,AL

LBL1:
        LEA DX,NL2
        MOV AH,09H
        INT 21H

        MOV AH,01H
        INT 21H
        SUB AL,30H

        ADD AL,VAL1
        MOV VAL1,AL
        LOOP LBL1

LBL2:
        LEA DX,NL3
        MOV AH,09H
        INT 21H

        MOV AX,00
        MOV AL,VAL1
        DIV BL
        ADD AX,3030H
        MOV DX,AX
        MOV AH,02H
        INT 21H

        MOV AH,4CH
        INT 21H

MAIN    ENDP
        END     MAIN

2番目は次のとおりです。

TITLE "THIS PROGRAM CALCULATES ANY N NUMBER OF STUDENT AVERAGE SCORES"

.MODEL SMALL
.DATA
        VAL1         DB      ?
        DISPLAY1     DB      0AH,0DH,'HOW MANY NUMBER OF STUDENT SCORES DO YOU WANT TO INPUT? :','$'
        DISPLAY2         DB      0AH,0DH,'ENTER NO:','$'
        DISPLAY3         DB      0AH,0DH,'AVEARGE:','$'
    BUFFER       DB      3,4 DUP(?)
.CODE
MAIN    PROC

.STARTUP

        LEA DX,DISPLAY1 ; loads the message in the variable display 1
        MOV AH,09H  ; interrupt function to display the message
        INT 21H

        MOV AH,0AH  ; Read into buffer
    INT 21H
    SUB AL,30H

    MOV CL,AL
    MOV BL,AL   ; moves the content of al to bl register
        MOV AL,00   ; sets the value of al to zero, the value of al is now in bl register
        MOV VAL1,AL ; stores al in val1 NB: al is still zero.

LBL1:
        LEA DX,DISPLAY2 ; displays message in display 2
        MOV AH,09H
        INT 21H

        MOV AH,0AH  ;Read into buffer
    LEA DX,BUFFER
    INT 21H
    SUB AL,30H

        ADD AL,VAL1 ; add val1 to al i.e, it now adds the previous value to the new one.
        MOV VAL1,AL ; saves the added value to val 1.
        LOOP LBL1   ; continues too add.

LBL2:
        LEA DX,DISPLAY3 ; displays character in display 3
        MOV AH,09H
        INT 21H

        MOV AX,00   ; sets ax value back to 00
        MOV AL,VAL1 ; moves the total value back to al
        DIV BL      ; divides the total value with the inputed number of values tht was stored in bl
        ADD AX,3030H    ;  convert to ASCII
        MOV DX,AX   ; now moves the content of ax register to data register
        MOV AH,09H  ; this displays the result
        INT 21H

.EXIT

MAIN    ENDP
        END     MAIN
4

2 に答える 2

1

で「問題」が発生しているようint 21h/0Ahです。初めて実行するときは、dx適切なバッファーに設定しません。入力はプロンプトに走り書きされます (おそらくそれほど害はありません)。ループ内でdx、正しいバッファーに設定します。しかし、int 21h/0Ah戻ってきたときは、alそれが有用であるかのように使用しています (両方の場合)。dos を実行してから長い時間が経ちましたが、私の記憶ではal、最後に入力される文字になります。ほぼ間違いなく「Enter」キーです。13 または 0Dh だと思います。

戻るときint 21h/0Ah、バッファの 2 番目のバイト ( buffer + 1) は、入力された文字数になります。思い出したように、これには「Enter」キーが含まれます。この値をチェックして、数値に「変換」する必要がある文字数を確認することをお勧めします。入力した文字 (1 または 2) は から始まりbuffer + 2ます。これらは、数値に変換する文字です-最初の文字-「0」×10 + 2番目の文字-「0」。または、文字が 1 つしかない場合は -'0' だけです。

結果を印刷しようとすると、 で問題ありませんadd ax, 3030h。次に、この値を に移動しますdxint 21h/9の $ で終わる文字列へのポインタが必要dxです。これはあなたが持っているものではありません!これらの2文字をバッファに移動して「$」で終了するか、一度に1つずつ出力します...私はそのホーキーint 29hが好きでしたが、おそらく出力されるものを使用する方がよいでしょうstdout (int 29h画面に移動し、リダイレクトできません)。多分何か...

...
add ax, 3030h
mov dx, ax
mov ah, 2
xchg dl, dh ; print dh first, then dl
int 21h
xchg dl, dh
int 21h ; I think ah is still okay here...
...

でループに入る前に、何かLBL1:に設定clします(正しくないと思います)。ch「おそらく」ゼロですが、確認します!

それはすべて「記憶から」テストされていません...そして、私は正しく覚えていないかもしれませんが、それはあなたをもう少し近づけるはずです(願っています)...

于 2013-01-16T21:14:42.780 に答える