发布网友 发布时间:2022-04-20 09:51
共3个回答
热心网友 时间:2022-05-23 16:27
370行的程序,慢慢看吧。
; 生成并显示NxN顺时针螺旋矩阵(N=2~15)
; 运行和结束程序
; 1、程序运行后,提示输入矩阵宽度(2~15范围的数)。直接回车,则结束程序;输足两位数,自动结束输入;
; 不足两位数,需回车结束输入。
; 2、程序判断矩阵宽度的有效性,若超出有效宽度,则重新输入
; 3、显示指定宽度的顺时针螺旋矩阵
; 4、重复第1步,直至满足程序结束条件。
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
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
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。
; 输足N位的,自动结束输入;不足N位的,回车结束输入。
; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536
; 约定:直接回车,视为数字0
; 入口:@@Digits=数字位数;di=保存输入的数字首地址
; @@Type_Data=保存的数据类型,B=字节类型,W=字类型。
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KBBack
jz @@KB_Back ;若是回空键,重新输入
cmp al,'0'
jb @@KBBack ;若低于数字'0',重新输入
cmp al,'9'
ja @@KBBack ;若高于数字'9',重新输入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit: lodsb
cbw
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;字节类型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
ret
@@Digits db ? ;十进制数字位数
@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型
@@Save_Tmp db 16 p(?)
Input_Digit EndP
; -------------------------------------
; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII码,并在当前光位置处显示
; 入口:AL=二进制数
; 出口:AX=转换后的ASCII码数字
AL_ASCII Proc Near
push bx
mov bl,100
xor ah,ah
div bl
or al,30h
mov bh,30h
cmp al,30h
jnz $+6
mov al,20h
mov bh,al
mov dl,al
call Output_Chr ;输出一个字符
mov bl,10
mov al,ah
xor ah,ah
div bl
or ax,3030h
cmp al,30h
jnz $+4
mov al,bh
mov dl,al
call Output_Chr ;输出一个字符
mov dl,ah
call Output_Chr ;输出一个字符
pop bx
ret
AL_ASCII EndP
; -------------------------------------
; 某行元素向右方向赋值
Right_Arry Proc Near
mov al,Row_Range ;取最小行号
mul Matrix_Width ;矩阵宽度
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov cx,WORD PTR Col_Range ;取列号范围
mov al,cl
sub ch,cl ;最大列号-最小列号
inc ch ;本行未赋值元素个数
xor cl,cl
xchg ch,cl
xor ah,ah
add di,ax ;本行第一个未赋值元素地址
mov al,Value_Current ;取当前元素数值
cld
@@Right_Arry: stosb ;给当前元素赋值
inc al ;下一个元素数值
loop @@Right_Arry
inc Row_Range ;最小行号增1
ret
Right_Arry Endp
; -------------------------------------
; 某列元素向下方向赋值
Down_Arry Proc Near
mov ax,WORD PTR Row_Range ;取行号范围
mov cx,ax
mov bl,Matrix_Width ;矩阵宽度
xor bh,bh
mov bp,bx
mul bl
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov al,Col_Range[1] ;取最大列号
xor ah,ah
add di,ax ;本列第一个未赋值元素地址
sub ch,cl ;最大行号-最小行号
inc ch ;本列未赋值元素个数
xor cl,cl
xchg ch,cl
mov al,Value_Current ;取当前元素数值
@@Down_Arry: mov [di],al ;给当前元素赋值
add di,bp ;下一个元素地址
inc al ;下一个元素数值
loop @@Down_Arry
dec Col_Range[1] ;最大列号减1
ret
Down_Arry Endp
; -------------------------------------
; 某行元素向左方向赋值
Left_Arry Proc Near
mov al,Row_Range[1] ;取最大行号
mul Matrix_Width ;矩阵宽度
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov cx,WORD PTR Col_Range ;取列号范围
mov al,ch
sub ch,cl ;最大列号-最小列号
inc ch ;本行未赋值元素个数
xor cl,cl
xchg ch,cl
xor ah,ah
add di,ax ;本行第一个未赋值元素地址
mov al,Value_Current ;取当前元素数值
std
@@Left_Arry: stosb ;给当前元素赋值
inc al ;下一个元素数值
loop @@Left_Arry
dec Row_Range[1] ;最大行号减1
ret
Left_Arry Endp
; -------------------------------------
; 某列元素向上方向赋值
Up_Arry Proc Near
mov ax,WORD PTR Row_Range ;取行号范围
mov cx,ax
mov bl,Matrix_Width ;矩阵宽度
xor bh,bh
mov bp,bx
xchg ah,al
mul bl
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov al,Col_Range ;取最小列号
xor ah,ah
add di,ax ;本列第一个未赋值元素地址
sub ch,cl ;最大行号-最小行号
inc ch ;本列未赋值元素个数
xor cl,cl
xchg ch,cl
mov al,Value_Current ;取当前元素数值
@@Up_Arry: mov [di],al ;给当前元素赋值
sub di,bp ;下一个元素地址
inc al ;下一个元素数值
loop @@Up_Arry
inc Col_Range ;最小列号加1
ret
Up_Arry Endp
; -------------------------------------
Value_Current db 1 ;将要赋值的元素值
Max_Value db ? ;矩阵元素最大值
Matrix_Width db ? ;矩阵宽度
Row_Range db ?,? ;行号范围
Col_Range db ?,? ;列号范围
Subroutine dw Right_Arry,Down_Arry,Left_Arry,Up_Arry ;子程序地址
Prompt_Str db 'Please input a number(2-15): $'
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
; -------------------------------------
Start: push cs
pop ds
push cs
pop es
@@Prompt_Input:Output Prompt_Str ;提示输入螺旋矩阵宽度
lea di,Matrix_Width ;保存输入的数字地址
mov @@Digits,2 ;数字位数
mov @@Type_Data,'B' ;保存的数据类型,B=字节类型,W=字类型。
@@Input_Num: call Input_Digit ;键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。输足N位的,自动结束输入;不足N位的,回车结束输入。
mov al,Matrix_Width ;取矩阵宽度
test al,al ;=0?
jz Exit_Proc ;直接回车或输入的数值为0,结束程序
cmp al,2 ;<2?
jb @@Prompt_Input ;超出有效数字范围,重新输入
cmp al,15 ;>15?
ja @@Prompt_Input ;超出有效数字范围,重新输入
dec ax
xchg ah,al
mov WORD PTR Row_Range,ax ;保存行号范围
mov WORD PTR Col_Range,ax ;保存列号范围
inc ah
mov al,ah
mul ah ;N的平方
mov Max_Value,al ;保存矩阵元素最大值
xor bx,bx ;第一个子程序地址偏移量
mov al,1 ;将要赋值的元素值
@@Cwise_spiral:mov Value_Current,al ;将要赋值的元素值
cmp al,Max_Value ;将要赋值的元素值>矩阵元素最大值?
ja @@List_Matrix ;转去显示矩阵
push bx
call Subroutine[bx] ;调用顺时针螺旋赋值子程序
pop bx
cmp bl,6
jz $+6
inc bx
inc bx
jmp @@Cwise_spiral ;顺时针螺旋
xor bx,bx
jmp @@Cwise_spiral ;顺时针螺旋
@@List_Matrix: call Output_CTLF ;显示一个回车、换行
call Output_CTLF
lea si,Buffer ;矩阵数据区地址
mov cl,Matrix_Width ;矩阵宽度
xor ch,ch
mov bp,cx
cld
@@Line_Disp: push cx
mov cx,bp
@@Column_Disp: lodsb ;读出一个元素
call AL_ASCII ;把AL中的二进制无符号数转换成显式的十进制ASCII码,并在当前光位置处显示
cmp cx,1
jz $+7
mov dl,20h
call Output_Chr ;输出一个字符
loop @@Column_Disp ;下一列
call Output_CTLF
pop cx
loop @@Line_Disp ;下一行
call Output_CTLF
jmp @@Prompt_Input
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Buffer: ;数据缓冲区
Code ENDS
END Start ;编译到此结束
热心网友 时间:2022-05-23 16:27
严格遵守题目要求,升级至2.0版可显示(1-20)之螺旋方阵:
;105行的程序,慢慢看吧。
CODE SEGMENT ;经过调试,运行正确。
。。。 。。。
参考资料:http://tieba.baidu.com/f?kz=680135494
热心网友 时间:2022-05-23 16:28
;比楼上的好一点只有140行程序,我的设计思路是光标随着数字,只需改变光
;标位置就可以了。
DATAS SEGMENT
x db ?
y db ?
z db ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
;初始化,输入你要显示的大小
mov ah,01h
int 21h
sub al,30h
mov x,al
mul al
mov y,al
mov z,0
mov dx,0506h
;分析可知最后结束的地方只可能在R和L后,所以只在R和L后设置跳转。
a: call r
cmp x,0
jz e
call d
call l
cmp x,0
jz e
call u
jmp a
e:
mov ah,01h
int 21h
MOV AH,4CH
INT 21H
;实现每行向右的输出
r proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
r1: add dl,4
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop r1
dec x
pop cx
pop bx
pop ax
ret
r endp
;实现每行向下的输出
d proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
d1: add dh,2
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop d1
pop cx
pop bx
pop ax
ret
d endp
;实现每行向左的输出
l proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
l1: sub dl,4
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop l1
dec x
pop cx
pop bx
pop ax
ret
l endp
;实现每行向上的输出
u proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
u1: sub dh,2
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop u1
pop cx
pop bx
pop ax
u2: ret
u endp
;输出每个数字
shuc proc near
push ax
push bx
push cx
push dx
mov al,z
and ah,0
mov bl,10
div bl
mov cx,ax
cmp cl,0
jz k
add cl,30h
mov dl,cl
mov ah,02h
int 21h
jmp g
k: mov dl,20h
mov ah,02h
int 21h
g:
mov dl,ch
add dl,30h
mov ah,02h
int 21h
pop dx
pop cx
pop bx
pop ax
ret
shuc endp
CODES ENDS
END START
热心网友 时间:2022-05-23 16:27
370行的程序,慢慢看吧。
; 生成并显示NxN顺时针螺旋矩阵(N=2~15)
; 运行和结束程序
; 1、程序运行后,提示输入矩阵宽度(2~15范围的数)。直接回车,则结束程序;输足两位数,自动结束输入;
; 不足两位数,需回车结束输入。
; 2、程序判断矩阵宽度的有效性,若超出有效宽度,则重新输入
; 3、显示指定宽度的顺时针螺旋矩阵
; 4、重复第1步,直至满足程序结束条件。
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
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
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。
; 输足N位的,自动结束输入;不足N位的,回车结束输入。
; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536
; 约定:直接回车,视为数字0
; 入口:@@Digits=数字位数;di=保存输入的数字首地址
; @@Type_Data=保存的数据类型,B=字节类型,W=字类型。
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KBBack
jz @@KB_Back ;若是回空键,重新输入
cmp al,'0'
jb @@KBBack ;若低于数字'0',重新输入
cmp al,'9'
ja @@KBBack ;若高于数字'9',重新输入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit: lodsb
cbw
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;字节类型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
ret
@@Digits db ? ;十进制数字位数
@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型
@@Save_Tmp db 16 p(?)
Input_Digit EndP
; -------------------------------------
; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII码,并在当前光位置处显示
; 入口:AL=二进制数
; 出口:AX=转换后的ASCII码数字
AL_ASCII Proc Near
push bx
mov bl,100
xor ah,ah
div bl
or al,30h
mov bh,30h
cmp al,30h
jnz $+6
mov al,20h
mov bh,al
mov dl,al
call Output_Chr ;输出一个字符
mov bl,10
mov al,ah
xor ah,ah
div bl
or ax,3030h
cmp al,30h
jnz $+4
mov al,bh
mov dl,al
call Output_Chr ;输出一个字符
mov dl,ah
call Output_Chr ;输出一个字符
pop bx
ret
AL_ASCII EndP
; -------------------------------------
; 某行元素向右方向赋值
Right_Arry Proc Near
mov al,Row_Range ;取最小行号
mul Matrix_Width ;矩阵宽度
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov cx,WORD PTR Col_Range ;取列号范围
mov al,cl
sub ch,cl ;最大列号-最小列号
inc ch ;本行未赋值元素个数
xor cl,cl
xchg ch,cl
xor ah,ah
add di,ax ;本行第一个未赋值元素地址
mov al,Value_Current ;取当前元素数值
cld
@@Right_Arry: stosb ;给当前元素赋值
inc al ;下一个元素数值
loop @@Right_Arry
inc Row_Range ;最小行号增1
ret
Right_Arry Endp
; -------------------------------------
; 某列元素向下方向赋值
Down_Arry Proc Near
mov ax,WORD PTR Row_Range ;取行号范围
mov cx,ax
mov bl,Matrix_Width ;矩阵宽度
xor bh,bh
mov bp,bx
mul bl
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov al,Col_Range[1] ;取最大列号
xor ah,ah
add di,ax ;本列第一个未赋值元素地址
sub ch,cl ;最大行号-最小行号
inc ch ;本列未赋值元素个数
xor cl,cl
xchg ch,cl
mov al,Value_Current ;取当前元素数值
@@Down_Arry: mov [di],al ;给当前元素赋值
add di,bp ;下一个元素地址
inc al ;下一个元素数值
loop @@Down_Arry
dec Col_Range[1] ;最大列号减1
ret
Down_Arry Endp
; -------------------------------------
; 某行元素向左方向赋值
Left_Arry Proc Near
mov al,Row_Range[1] ;取最大行号
mul Matrix_Width ;矩阵宽度
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov cx,WORD PTR Col_Range ;取列号范围
mov al,ch
sub ch,cl ;最大列号-最小列号
inc ch ;本行未赋值元素个数
xor cl,cl
xchg ch,cl
xor ah,ah
add di,ax ;本行第一个未赋值元素地址
mov al,Value_Current ;取当前元素数值
std
@@Left_Arry: stosb ;给当前元素赋值
inc al ;下一个元素数值
loop @@Left_Arry
dec Row_Range[1] ;最大行号减1
ret
Left_Arry Endp
; -------------------------------------
; 某列元素向上方向赋值
Up_Arry Proc Near
mov ax,WORD PTR Row_Range ;取行号范围
mov cx,ax
mov bl,Matrix_Width ;矩阵宽度
xor bh,bh
mov bp,bx
xchg ah,al
mul bl
mov si,ax
lea di,Buffer[si] ;本行第一个元素地址
mov al,Col_Range ;取最小列号
xor ah,ah
add di,ax ;本列第一个未赋值元素地址
sub ch,cl ;最大行号-最小行号
inc ch ;本列未赋值元素个数
xor cl,cl
xchg ch,cl
mov al,Value_Current ;取当前元素数值
@@Up_Arry: mov [di],al ;给当前元素赋值
sub di,bp ;下一个元素地址
inc al ;下一个元素数值
loop @@Up_Arry
inc Col_Range ;最小列号加1
ret
Up_Arry Endp
; -------------------------------------
Value_Current db 1 ;将要赋值的元素值
Max_Value db ? ;矩阵元素最大值
Matrix_Width db ? ;矩阵宽度
Row_Range db ?,? ;行号范围
Col_Range db ?,? ;列号范围
Subroutine dw Right_Arry,Down_Arry,Left_Arry,Up_Arry ;子程序地址
Prompt_Str db 'Please input a number(2-15): $'
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
; -------------------------------------
Start: push cs
pop ds
push cs
pop es
@@Prompt_Input:Output Prompt_Str ;提示输入螺旋矩阵宽度
lea di,Matrix_Width ;保存输入的数字地址
mov @@Digits,2 ;数字位数
mov @@Type_Data,'B' ;保存的数据类型,B=字节类型,W=字类型。
@@Input_Num: call Input_Digit ;键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。输足N位的,自动结束输入;不足N位的,回车结束输入。
mov al,Matrix_Width ;取矩阵宽度
test al,al ;=0?
jz Exit_Proc ;直接回车或输入的数值为0,结束程序
cmp al,2 ;<2?
jb @@Prompt_Input ;超出有效数字范围,重新输入
cmp al,15 ;>15?
ja @@Prompt_Input ;超出有效数字范围,重新输入
dec ax
xchg ah,al
mov WORD PTR Row_Range,ax ;保存行号范围
mov WORD PTR Col_Range,ax ;保存列号范围
inc ah
mov al,ah
mul ah ;N的平方
mov Max_Value,al ;保存矩阵元素最大值
xor bx,bx ;第一个子程序地址偏移量
mov al,1 ;将要赋值的元素值
@@Cwise_spiral:mov Value_Current,al ;将要赋值的元素值
cmp al,Max_Value ;将要赋值的元素值>矩阵元素最大值?
ja @@List_Matrix ;转去显示矩阵
push bx
call Subroutine[bx] ;调用顺时针螺旋赋值子程序
pop bx
cmp bl,6
jz $+6
inc bx
inc bx
jmp @@Cwise_spiral ;顺时针螺旋
xor bx,bx
jmp @@Cwise_spiral ;顺时针螺旋
@@List_Matrix: call Output_CTLF ;显示一个回车、换行
call Output_CTLF
lea si,Buffer ;矩阵数据区地址
mov cl,Matrix_Width ;矩阵宽度
xor ch,ch
mov bp,cx
cld
@@Line_Disp: push cx
mov cx,bp
@@Column_Disp: lodsb ;读出一个元素
call AL_ASCII ;把AL中的二进制无符号数转换成显式的十进制ASCII码,并在当前光位置处显示
cmp cx,1
jz $+7
mov dl,20h
call Output_Chr ;输出一个字符
loop @@Column_Disp ;下一列
call Output_CTLF
pop cx
loop @@Line_Disp ;下一行
call Output_CTLF
jmp @@Prompt_Input
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Buffer: ;数据缓冲区
Code ENDS
END Start ;编译到此结束
热心网友 时间:2022-05-23 16:28
严格遵守题目要求,升级至2.0版可显示(1-20)之螺旋方阵:
;105行的程序,慢慢看吧。
CODE SEGMENT ;经过调试,运行正确。
。。。 。。。
参考资料:http://tieba.baidu.com/f?kz=680135494
热心网友 时间:2022-05-23 16:28
;比楼上的好一点只有140行程序,我的设计思路是光标随着数字,只需改变光
;标位置就可以了。
DATAS SEGMENT
x db ?
y db ?
z db ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
;初始化,输入你要显示的大小
mov ah,01h
int 21h
sub al,30h
mov x,al
mul al
mov y,al
mov z,0
mov dx,0506h
;分析可知最后结束的地方只可能在R和L后,所以只在R和L后设置跳转。
a: call r
cmp x,0
jz e
call d
call l
cmp x,0
jz e
call u
jmp a
e:
mov ah,01h
int 21h
MOV AH,4CH
INT 21H
;实现每行向右的输出
r proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
r1: add dl,4
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop r1
dec x
pop cx
pop bx
pop ax
ret
r endp
;实现每行向下的输出
d proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
d1: add dh,2
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop d1
pop cx
pop bx
pop ax
ret
d endp
;实现每行向左的输出
l proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
l1: sub dl,4
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop l1
dec x
pop cx
pop bx
pop ax
ret
l endp
;实现每行向上的输出
u proc near
push ax
push bx
push cx
sub cx,cx
mov cl,x
u1: sub dh,2
mov ah,02h
mov bh,0
int 10h
inc z
call shuc
loop u1
pop cx
pop bx
pop ax
u2: ret
u endp
;输出每个数字
shuc proc near
push ax
push bx
push cx
push dx
mov al,z
and ah,0
mov bl,10
div bl
mov cx,ax
cmp cl,0
jz k
add cl,30h
mov dl,cl
mov ah,02h
int 21h
jmp g
k: mov dl,20h
mov ah,02h
int 21h
g:
mov dl,ch
add dl,30h
mov ah,02h
int 21h
pop dx
pop cx
pop bx
pop ax
ret
shuc endp
CODES ENDS
END START