操作系统汇编语言实现彩色输出斐波拉契数列

2015-04-01:

大二下,计算机与操作系统课

实验要求:系统请求输入1个正整数,用户输入要显示的项的个数,回车键结束输入;显示指定数目的斐波那契数列项,要求各个项用空格隔开,并用不同颜色显示(不限制颜色的种类、数目) 。

当时不知道同学们都拿着学长学姐的上一届实验代码,只有我一个人默默地啃了一个周末做出来了(第一次做masm实验啊。。),等我做完了,朋友把学长的代码发给我,我的内心是崩溃的。不过能自己摸索,学到了很多知识,(虽然现在过了差不多一年不太记得了),也是蛮高兴的。

下给出源码。(原谅我过了一年已忘记当时的心路历程了,只能给出结果。。。)

sseg segment para stack
     dw 256 dup(?)
sseg ends
;
dseg segment
mess db 'Input your number:$'
result0 db 'The result is:$'
space db ' $'
output1 db '1',0
num db ?,0
odd db 'y'
isEnd db 'y'
MESS1 DB 0dh,0ah,'$'
dseg ends
;
cseg segment
     assume cs:cseg,ds:dseg
start:
     mov ax,dseg
	 mov ds,ax
	 mov dx,offset mess
	 mov ah,9
	 int 21h

     call getInt
;
	 call newline
	 push ax
	 mov dx,offset result0
	 mov ah,9
	 int 21h
	 pop ax

     cmp al,1
	 je  result1
	 cmp al,2
	 je  result2 
	 ;
     mov bx,offset output1
	 call printColor
	 call printColor
	 mov bx,1
	 mov cx,1	
;	 pop ax
loopIt:
	 push ax	
	 cmp al,2
	 jbe EndIt   
     mov dx,cx
     mov cx,bx
	 add bx,dx
	 mov ax,bx
	 call printInt
	 pop ax
	 sub al,1
	 jmp loopIt

result1:

     MOV  BX, OFFSET output1
	 call printColor
	 jmp endIt
result2:
     mov bx,offset output1
	 call printColor
	 call printColor
	 jmp endIt
endIt:
     mov ah,4ch
	 int 21h
;
printColor proc
    push ax
	push bx
	push cx
	push dx
L:  MOV  AL, [BX]          ;取来字符.
	CMP  AL, 0             ;为0吗?
    JZ   ChangeColor         ;为0就结束.
    MOV  AH, 3             ;找光标位置.
    INT  10H
    MOV  AH, 2             ;设定光标位置.
    INC  DX
    INT  10H
;;;;;;;;;;;;;;	
	cmp  dl,76
    jb   next1
    push ax
    push dx
    MOV DX,OFFSET MESS1
    MOV AH,9
    INT 21H 
    pop dx
    MOV  AH, 3             ;zhao光标位置.
    INT  10H
    MOV  AH, 2             ;设定光标位置.
    INC  DX
    INT  10H
    
    pop ax
	
;;;;;;;;;;;;;;	
next1:
	push BX
    MOV  AH, 9             ;显示字符.
;                          ;AL为字符的ASCII
    mov  cl,[odd]
	cmp  cl,'y'
	je   Red
    MOV  BL, 2            ; 绿色的字符.
	jmp  next
Red:mov  bl,4
next:    
    MOV  CX, 1             ;显示一个字符.
    INT  10H               ;显示吧.
	pop  BX
	inc  BX
	jmp  L
	
ChangeColor:
    mov  cl,[isEnd]
    cmp   cl,'n'
    je    EXIT	
	mov  cl,[odd]
	cmp  cl,'y'
	je   Change
	mov  [odd],'y'
	jmp  AddSpace
Change:
    mov  [odd],'n'

;;;;;;;;;
 AddSpace: 
    MOV BX,offset space
    MOV  AL, [BX]          ;取来字符.
    MOV  AH, 3             ;找光标位置.
    INT  10H
    MOV  AH, 2             ;设定光标位置.
    INC  DX
    INT  10H
    MOV  AH, 9             ;显示字符.
;                          ;AL为字符的ASCII

    MOV  BL, 2            ; 绿色的字符.    
    MOV  CX, 1             ;显示一个字符.
    INT  10H               ;显示吧.

EXIT:pop dx
     pop cx
	 pop bx
	 pop ax
	 ret
printColor endp

newline proc
     push ax
	 push dx
	 mov dl,0dh
	 mov ah,2
	 int 21h
	 mov dl,0ah
	 mov ah,2
	 int 21h
	 pop dx
	 pop ax
	 ret
newline endp

printSpace proc
    push ax
push bx
push cx
	push dx
    mov dx,offset space
	mov ah,9
	int 21h
	pop dx
        pop cx
        pop bx
	pop ax
	ret
printSpace endp
   
printInt proc 
    push ax ;保存寄存器的值(一定要的)
    push bx	
    push cx 
    push dx
    mov dx,'0'
	push dx
	mov [isEnd],'n'
loopInt:
	cmp ax,10
	jb  loopInt2
    mov dx,0 ;被除数高16位置0 
    mov cx,10d ;除数为10d 
    div cx 
    push dx ;先保存余数 
    jmp loopInt
	;
loopInt2:
	mov dl,al ;显示商(即十进制二位数的十位) 
    add dl,30h ;转换成Ascii码 
    pop ax
	cmp ax,'0'
	jnz nextline
	mov [isEnd],'y'
nextline:	
    push ax
    mov [num],dl
	mov bx,offset num
	call printColor
	pop ax
	cmp ax,'0'
	je IntEnd
	jmp loopInt2
IntEnd:	
    pop dx ;恢复寄存器的值 
    pop cx 
	pop bx
    pop ax 
    ret ;子程序返回 
 printInt endp 
 
 GetInt proc 
    push bx	
    push cx 
	push dx
	mov ax,0
	mov bx,0
Intloop:
    push ax
    mov cl,10d ;乘数为10d 
    mul cl   ;
    mov bl,al;保存ax的值
    pop ax	
	
    mov ah,0

	push ax
    mov ah,1
	int 21h
	mov ah,0
	cmp al,13
	je  EndInt
	pop dx
	sub al,30h ;转化为数字
	add bl,al  ;加上
	mov al,bl
    jmp Intloop
	;
EndInt:	
    pop ax
    mov ah,0
    pop dx   
    pop cx 
	pop bx
    ret ;子程序返回 
 GetInt endp  
 
cseg ends
     end start


这是运行截图哦

操作系统汇编语言实现彩色输出斐波拉契数列_第1张图片



你可能感兴趣的:(操作系统,masm,汇编语言)