由于数比较大,要用到EAX等寄存器才不会溢出(其实最后四位数还是溢出的,没解决。。交作业时间比较急,没顾得上改,就这样吧)
DATAS SEGMENT
ARRAY DWORD 50 dup(?)
COUNT DWORD ?
CHANGELINE DB 0AH,0DH,'$'
MESS DB "TOP 50 fibonacci number is:",0ah,0dh,'$'
DATAS ENDS
STACKS SEGMENT
WORD 1024 DUP(?)
TOS LABEL WORD
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MAIN PROC FAR
.386
MOV AX,DATAS
MOV DS,EAX
MOV AX,STACKS
MOV SS,EAX
MOV SP,OFFSET TOS
MOV ECX,45
MOV ESI,OFFSET ARRAY
MOV EAX,1;第一项
MOV EBX,1;第二项
MOV [ESI],EAX
INC COUNT
ADD ESI,TYPE ARRAY
MOV [ESI],EBX
INC COUNT
ADD ESI,TYPE ARRAY
F: ADD EAX,EBX;n-2项+n-1项
MOV EDX,EAX;第n项
MOV [ESI],EDX
INC COUNT
ADD ESI,TYPE ARRAY
MOV EAX,EBX
MOV EBX,EDX
LOOP F
CALL PRINT
MOV EAX,4C00H
INT 21H
MAIN ENDP
PRINT PROC NEAR
MOV EDX,OFFSET MESS
MOV AH,09H
INT 21H
MOV ESI,OFFSET ARRAY
MOV ECX,COUNT;做count次loop
H1:MOV EAX,COUNT
SUB AX,CX ;每次cx减1
MOV BL,10
DIV BL;被除数是AX
CMP AH,0;余数在AH中
JNZ AGAIN;余数不为0,即ax-cx不是10的倍数
MOV DX,OFFSET CHANGELINE
MOV AH,09H;是10的倍数,输出换行
INT 21H
AGAIN:
MOV EBX,[ESI]
PUSH ECX;转十进制输出的acssi码要用cx,原cx入栈保留
MOV ECX,0
D1: MOV EAX,EBX
MOV EDX,0
MOV EBX,10
DIV EBX;32位,余数放DX中
PUSH EDX
INC ECX
MOV EBX,EAX;商放AX
CMP EAX,0
JNZ D1
D2: POP EDX
ADD EDX,30H
MOV AH,2H
INT 21H
LOOP D2
POP ECX
ADD ESI,TYPE ARRAY
MOV DL,00H
MOV AH,2H
INT 21H
L: LOOP H1
RET
PRINT ENDP
CODES ENDS
END START
欢迎批评指正。