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

来源:互联网 发布:和弓淘宝 编辑:程序博客网 时间:2024/06/05 09:13

2015-04-01:

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

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

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

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

sseg segment para stack     dw 256 dup(?)sseg ends;dseg segmentmess db 'Input your number:$'result0 db 'The result is:$'space db ' $'output1 db '1',0num db ?,0odd db 'y'isEnd db 'y'MESS1 DB 0dh,0ah,'$'dseg ends;cseg segment     assume cs:cseg,ds:dsegstart:     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 axloopIt: 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 loopItresult1:     MOV  BX, OFFSET output1 call printColor jmp endItresult2:     mov bx,offset output1 call printColor call printColor jmp endItendIt:     mov ah,4ch int 21h;printColor proc    push axpush bxpush cxpush dxL:  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  nextRed:mov  bl,4next:        MOV  CX, 1             ;显示一个字符.    INT  10H               ;显示吧.pop  BXinc  BXjmp  LChangeColor:    mov  cl,[isEnd]    cmp   cl,'n'    je    EXITmov  cl,[odd]cmp  cl,'y'je   Changemov  [odd],'y'jmp  AddSpaceChange:    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 retprintColor endpnewline 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 retnewline endpprintSpace proc    push axpush bxpush cxpush dx    mov dx,offset spacemov ah,9int 21hpop dx        pop cx        pop bxpop axretprintSpace endp   printInt proc     push ax ;保存寄存器的值(一定要的)    push bx    push cx     push dx    mov dx,'0'push dxmov [isEnd],'n'loopInt:cmp ax,10jb  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 axcmp ax,'0'jnz nextlinemov [isEnd],'y'nextline:    push ax    mov [num],dlmov bx,offset numcall printColorpop axcmp ax,'0'je IntEndjmp loopInt2IntEnd:    pop dx ;恢复寄存器的值     pop cx pop bx    pop ax     ret ;子程序返回  printInt endp   GetInt proc     push bx    push cx push dxmov ax,0mov bx,0Intloop:    push ax    mov cl,10d ;乘数为10d     mul cl   ;    mov bl,al;保存ax的值    pop ax    mov ah,0push ax    mov ah,1int 21hmov ah,0cmp al,13je  EndIntpop dxsub 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


这是运行截图哦



0 0
原创粉丝点击