用汇编语言显示杨辉三角形前10行每行用彩色

2024-12-14 18:17:01
推荐回答(4个)
回答1:

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; 以下是有关显示的在BIOS数据区中的变量的定义

BytesPerLine equ 160 ; 在文本显示方式下, 一行占160个字节
VideoRegS equ 0B800H ; 文本显示方式下, 屏幕缓冲区段地址
Magenta equ 5
LightBlue equ 9
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -----------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -----------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 dup(?)
Dec_ASCII EndP
; -----------------------------------------
Under_Write db ' 10225607101 zhangzhou$'
Press_Key db 7,13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
mov ax,3 ;设置80x25,16色文本显示方式
int 10h
; -----------------------------------------
; 设置字符显示颜色
xor bx,bx
mov ah,8 ;读光标位置的字符和属性
int 10h
and ah,0fh
mov cl,4
rol ah,cl
or ah,Magenta ;字符背景颜色不变,前景颜色置Magenta
mov al,20h ;字符置成空格符
mov bx,VideoRegS
mov es,bx
mov cx,BytesPerLine shr 1*25
xor di,di
cld
rep stosw
push cs
pop es ;使数据段、附加段与代码段同段
; -----------------------------------------
; 显示杨辉三角形边每行系数
mov dl,'1' ;第1行是1
call Output_Chr ;显示一个字符
call Output_CTLF ;输出一个回车、换行
mov dl,'1' ;第2行是两个1
call Output_Chr
mov dl,20h ;空一格
call Output_Chr
mov dl,'1'
call Output_Chr
call Output_CTLF
mov cx,8 ;行数
@@Lines: mov dl,'1' ;每行第一个系数都是1
call Output_Chr
mov dl,20h ;空一格
call Output_Chr
lea si,Buffer ;系数表地址
push cx
mov ax,9
sub ax,cx
mov cx,ax
mov bl,1 ;前一个系数初值
@@Coloumn: lodsb ;读取前一个系数
add al,[si] ;加上当前系数
mov [si-1],bl ;更新前一个系数
mov bl,al
xor ah,ah
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
mov dl,20h ;空一格
call Output_Chr
loop @@Coloumn ;下一个系数
mov byte ptr [si],bl
mov byte ptr [si][1],1
@@Next_Line:pop cx
mov dl,'1' ;每行最后一个系数都是1
call Output_Chr ;显示一个字符
call Output_CTLF
loop @@Lines ;下一行
call Output_CTLF
call Output_CTLF
; -----------------------------------------
xor bx,bx
mov ah,3 ;取光标位置
int 10h
mov bx,VideoRegS
mov es,bx
mov al,dh
mov bl,BytesPerLine
mul bl
mov di,ax
mov cx,BytesPerLine shr 1
mov ax,es:[di]
and ah,0f0h
or ah,LightBlue ;字符背景颜色不变,前景颜色置LightBlue
cld
rep stosw
push cs
pop es
Output Under_Write ;在杨辉三角形下方显示自己的学号和姓名(汉语拼音)
Output Press_Key
mov ah,1
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Buffer db 1,1 ;杨辉三角第一行初值
Code ENDS
END Start ;编译到此结束

回答2:

答案在:(急求)在显示器上显示杨辉三角形前10行

回答3:

杨辉三角形?什么来的?

回答4:

不会