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