汇编语言数字矩阵显示程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
石家庄铁道大学信息学院
数字矩阵(25分
【问题描述】
从键盘输入一个整数(1~10,以该数字为矩阵的大小,把1,2,3,……,n*n 的数字按照顺时针螺旋的形式填入其中。
【函数形式】
void f8(
【输入】
一个整数(1~10。
【输出】
数字矩阵。
【举例1】
输入:3
输出:
1 2 3
8 9 4
7 6 5
【举例2】
输入:4
输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
源程序为:
;woniusuanfa
;------------------------------------------------- huiche macro ;定义换行打印的宏
push ax
mov ah,02h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
pop ax
endm
;--------------------------------------------------- tab macro ;定义tab宏
push ax
mov ah,02h
mov dl,09h
int 21h
pop ax
endm
;---------------------------------------------------
mi macro ;定义打印*号的宏
push ax
mov ah,02h
mov dl,2ah
int 21h
pop ax
endm
;------------------------------------------------------
;***************************************** datarea segment
mess1 db 'Please enter a integer !$'
mess2 db 'The characters you entered illegally, please re-enter!$' mess3 db 'Print results are as follows :$'
mess4 db 'jishu$'
mess5 db 'oushu$'
arr dw 100 dup(0
n dw ? ;要打印的数字个数
i dw ? ;要打印的矩形边的个数
t db 2
q dw 0 ;q表示列
h dw 0 ;h表示行
j dw 0
k dw 0
q1 dw 0 ;q表示列
h1 dw 0 ;h表示行
j1 dw 0
k1 dw 0
datarea ends
;************************************************* stack segmentstack
db 100 dup(0
stack ends
;********************************************* code segment
assume cs:code,ds:datarea,ss:stack
main proc far
start:
mov ax,datarea
mov ds,ax
sub ax,ax
mov ah,9
mov dx,offset mess1
int 21h
huiche
tab ;打印回车和换行
call scanf ;从键盘接受十进制数
mov bx,n
huiche
mov ah,9
mov dx,offset mess3
int 21h
;----------------------------------------------------
mov ax,1 ;计算矩形方框边上数字的个数
mov cx,1 ;让输入的数和边个数的平方比较one: mov ax,cx mul c x
cmp ax,n
ja two
je two
inc cx
jmp o ne
;------------------------------------------------------
two: mov i,cx ;要打印的矩形边的个数mov ax,cx
div t
cmp ah,1 ;边的数字个数为奇数是跳转
jz three
cmp ah,0
jz four ;边的数字个数为偶数时跳转three:
call print1 ;调用奇数打印函数
call printf
jmp f ive
four:
call print2 ;调用偶数打印函数
call printf
jmp f ive
five:
mov ah,4ch
int 21h
main endp
;-----------------------------------------------
scanf proc near ;接受十进制数的子程序mov ax,0 mov bx,0
mov cx,0
newchar:
mov ah,01h
int 21h
cmp al,0dh
jz exit
cmp al,48
jl exit1
cmp al,57
ja exit1
sub ax,30h cbw
cmp cx,0
jz jinzhi
inc cx
xchg ax,bx mov cx,10 mul c x xchg ax,bx add bx,ax jmp n ewchar jinzhi:
inc cx
xchg ax,bx jmp n ewchar exit:
mov n,bx
ret
exit1:
huiche
mov ah,9
mov dx,offset mess2
int 21h
huiche
tab
jmp s canf
huiche
scanf endp
;******************************************************* ;---------------------------------------------
print1 proc near ;奇数打印蜗牛
push ax
push bx
push cx
push dx
mov bx,20
mov si,0
mov di,0
mov dx,0
mov ax,1 ;让AX作为起始值,一直累加到所打印的个数mov cx,i
push i
dec cx
mov q,cx ;最外层循环
mov h,0
pri:
cmp i,1 ;
je qui2
mov j,0
;------------------------------------------------------------
pri0:
cmp j,0 ;j等于0就跳转到pri1
je pr1
cmp j,1 ;j等于1就跳转到pri2
je pr2
cmp j,2 ;j等于2就跳转到pri3 je pr3
cmp j,3 ;j等于3就跳转到pri4 je pr4
cmp j,4
je pr5
qui2:
jmp q uit1
pr1:
mov cx,h ;把H的值给K
mov k,cx
jmp p ri1
pr2:
mov cx,h ;把H的值给K
mov k,cx
jmp p ri2
pr3:
mov cx,q ;把Q的值给K
mov k,cx
jmp p ri3
pr4:
mov cx,q ;把Q的值给K
mov k,cx
jmp p ri4
pr5:
jmp p ri5
pri1:
mov cx,q
cmp k,cx
je priexit1
push bx
push ax ;ax入栈,保存现场
mov ax,bx
mul h;基址bx乘以20,进去数组的第二行mov bx,ax
mov ax,k ;変址di乘以K跳到数组下一个单元mul t
mov di,ax
pop ax
mov arr[bx+di],ax
pop bx
inc ax
inc k
jmp p ri1
priexit1:
jmp p riexit
pri2:
mov cx,q
cmp k,cx
je priexit1
push bx
push ax
mov ax,bx ;跳转到第k行mul k
mov bx,ax
mov ax,q
mul t
mov di,ax
pop ax
mov arr[bx+di],ax pop bx
inc ax
inc k
jmp p ri2
pri3:
mov cx,h
cmp k,cx
je priexit
push bx
push ax
mov ax,bx
mul q
mov bx,ax
mov ax,k
mul t
mov di,ax
pop ax
mov arr[bx+di],ax pop bx
inc ax
dec k
jmp p ri3
pri4:
mov cx,h
cmp k,cx
je priexit
push bx
push ax
mov ax,bx
mul k
mov bx,ax
mov ax,h
mul t
mov di,ax
pop ax
mov arr[bx+di],ax
pop bx
inc ax
dec k
jmp p ri4
priexit:
inc j
cmp j,4
je pri5
jmp p ri0
;------------------------------------------------------------------- pri5: mov j,0 inc h ;h减1
dec q ;q减1
dec i
dec i
jmp p ri
quit1:
pop i ;最后那个数赋给数组
push ax
mov ax,i
dec ax
push ax
div t
cbw
mov dx,ax
mov ax,bx
mul d x
mov bx,ax
mul t
div t
cbw
mov di,ax
pop ax
mov arr[bx+di],ax
;--------------------------------------------------------------------- ;------------------------------------------------------------------------ pop dx
pop cx
pop bx
pop ax
ret
print1 endp
;----------------------------------------------
print2 proc near ;偶数打印蜗牛
push ax
push bx
push cx
push dx
mov bx,20
mov si,0
mov di,0
mov dx,0
mov ax,1 ;让AX作为起始值,一直累加到所打印的个数mov cx,i
push i
dec cx
mov q1,cx ;最外层循环
mov h1,0
pr:
cmp i,1 ;
jl q2
mov j1,0
;------------------------------------------------------------ prit0:
cmp j1,0 ;j等于0就跳转到pri1
je p1
cmp j1,1 ;j等于1就跳转到pri2
je p2
cmp j1,2 ;j等于2就跳转到pri3
je p3
cmp j1,3 ;j等于3就跳转到pri4
je p4
cmp j1,4
je p5
q2:
jmp q uit2
p1:
mov cx,h1 ;把H的值给K mov k1,cx
jmp p rit1
p2:
mov cx,h1 ;把H的值给K mov k1,cx
jmp p rit2
p3:
mov cx,q1 ;把Q的值给K mov k1,cx
jmp p rit3
p4:
mov cx,q1 ;把Q的值给K mov k1,cx
jmp p rit4
p5:
jmp p rit5
prit1:
mov cx,q1
cmp k1,cx
je priexi1
push bx
push ax ;ax入栈,保存现场
mov ax,bx
mul h1 ;基址bx乘以20,进去数组的第二行
mov bx,ax
mov ax,k1 ;変址di乘以K跳到数组下一个单元mul t mov di,ax
pop ax
mov arr[bx+di],ax
pop bx
inc ax
inc k1
jmp p rit1
priexi1:
jmp p riexi
prit2: mov cx,q1 cmp k1,cx je priexi1 push bx push ax mov ax,bx ;跳转到第 k 行mul k1 mov bx,ax mov ax,q1 mul t mov di,ax pop ax mov arr[bx+di],ax pop bx inc ax inc k1 jmp prit2 prit3: mov cx,h1 cmp k1,cx je priexi push bx push ax mov ax,bx mul q1 mov bx,ax mov ax,k1 mul t mov di,ax pop ax mov arr[bx+di],ax pop bx inc ax dec k1 jmp prit3 prit4: mov cx,h1 cmp k1,cx je priexi push bx
push ax mov ax,bx mul k1 mov bx,ax mov ax,h1 mul t mov di,ax pop ax mov
arr[bx+di],ax pop bx inc ax dec k1 jmp prit4 priexi: inc j1 cmp j1,4 je prit5 jmp prit0 ;------------------------------------------------------------------prit5: mov j1,0 inc h1 ;h 减 1 dec
q1 ;q 减 1 dec i dec i jmp pr quit2: pop i pop dx pop cx pop bx pop ax ret print2 endp ;-----------------------------------------------------------------------printf proc near l dw 0 ;定义行 m dw 0 ;定义列 push ax push bx push cx push dx ;----------------------------------------huiche mov l,0 qu3: mov dx,i ;for 语句(第 L 行为最后一行时结束)
cmp l,dx jz qu1 ;打印函数的外部循环 ;--------------------------------------------mov m,0 qu4: mov dx,i ;for 语句(第 M 列为最后一行列时结束) cmp m,dx jz qu2 ;---------------------------------------------mov bx,20 mov ax,bx mul l mov bx,ax mov ax,m mul t mov di,ax push bx mov dx,arr[bx+di] cmp dx,n ja qu5 mov bx,dx tab call printDec ;------------------------------------------------------inc m pop bx jmp qu4 qu5: tab mi inc m pop bx jmp qu4 qu2: huiche inc l jmp qu3 ;----------------------------------qu1: pop dx pop cx pop bx pop ax ret
printf endp ;-----------------------------------------------------------------------
;*********************************************************** ;----------------------------------------------------printDecproc near;输出一个十进制数,参数:BX ten dw 10 digsdw 0 ;从个位开始,逐位压入堆栈,然后出栈,即可从高位到地位输出 mov digs,0 lable1: mov ax, bx mov dx, 0 ; (dx,ax为被除数 div ten ;除以 10,余数为最低位,保存在dx 中 cmp dx, bx jz lable2 ;bx%10==bx ,只剩下一位了,可以直接压栈 inc digs push dx mov bx, ax jmp lable1 lable2: inc digs push bx mov cx,digs next: pop ax mov dx, ax add
dl, 30h mov ah, 2 int 21h loop next ret printDec endp ;--------------------------------------------------;***************************************** code ends end start。