2013-01-16 73 views
1

如何編寫一個8086彙編語言程序來計算任何n數的平均值?我寫了兩個程序。一個使用mov ah,01 int 21h輸入功能,因此它只接受一個數字。由於這個原因,我不能輸入數字10. 10一個8086彙編語言程序來計算任意n個數的總和的平均值

我從另一個緩衝區讀取。它可以接受很多數字,但問題是它會不斷循環。

這是第一個節目:

.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 

,這裏是第二:

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 
+1

這不是很明顯,你不退出LBL1中的循環? – Abhineet

+0

請問我該怎麼做? – user1982689

+0

'循環'指令將使用'cx'作爲計數器(至少我很確定這是8086的情況;我推斷這是''ecx'在80386和更新的模型中的行爲)。我看到你修改'cl',但不是'ch'或'cx'本身,所以'LBL1'可能會循環一段時間,這取決於程序啓動時'cx'中的值。 – kevintodisco

回答

1

你似乎是具有int 21h/0Ah一個 「問題」。您第一次執行此操作時,不會將dx設置爲任何明智的緩衝區。你的輸入將會在你的提示上塗寫(可能沒有太大傷害)。在你的循環中,你設置dx爲正確的緩衝區。但是當int 21h/0Ah返回時,您使用al就好像它有用(兩次)。我已經很長時間了,但我的回憶是,al將是最後輸入的字符 - 幾乎肯定是「輸入」鍵 - 我認爲是13或0Dh。

int 21h/0Ah返回時,緩衝區中的第二個字節(buffer + 1)將是輸入的字符數。我記得,這將包括「輸入」鍵。您可能需要檢查此值以查看需要將「轉換」爲數字的字符數。輸入的字符(1或2)將從buffer + 2開始。這些是你想要轉換成數字的字符 - 第一個字符 - '0'乘10 +第二個字符'0'。或者只有字符'0',如果只有一個。

當您嘗試打印結果時,通過add ax, 3030h即可。然後將此值移至dxint 21h/9需要指向dx中的$終止字符串的指針。這不是你所擁有的!將這兩個字符移動到一個緩衝區並用'$'終止它,或者一次打印一個字符......我曾經喜歡那個hokey int 29h,但是你最好使用會打印的東西所以標準輸出(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是「可能」xero,但我確信!

這是所有未經檢驗的,「從記憶」 ......我可能不記得正確的,但它應該讓你靠近一點(我希望)...