汇编语言数字矩阵显示程序.docx
《汇编语言数字矩阵显示程序.docx》由会员分享,可在线阅读,更多相关《汇编语言数字矩阵显示程序.docx(14页珍藏版)》请在冰豆网上搜索。
汇编语言数字矩阵显示程序
石家庄铁道大学信息学院
数字矩阵(25分
【问题描述】
从键盘输入一个整数(1~10,以该数字为矩阵的大小,把1,2,3,……,n*n的数字按照顺时针螺旋的形式填入其中。
【函数形式】
voidf8(
【输入】
一个整数(1~10。
【输出】
数字矩阵。
【举例1】
输入:
3
输出:
123
894
765
【举例2】
输入:
4
输出:
1234
1213145
1116156
10987
源程序为:
;woniusuanfa
;-------------------------------------------------
huichemacro;定义换行打印的宏
pushax
movah,02h
movdl,0ah
int21h
movdl,0dh
int21h
popax
endm
;---------------------------------------------------
tabmacro;定义tab宏
pushax
movah,02h
movdl,09h
int21h
popax
endm
;---------------------------------------------------
mimacro;定义打印*号的宏
pushax
movah,02h
movdl,2ah
int21h
popax
endm
;------------------------------------------------------
;*****************************************
datareasegment
mess1db'Pleaseenterainteger!
$'
mess2db'Thecharactersyouenteredillegally,pleasere-enter!
$'mess3db'Printresultsareasfollows:
$'
mess4db'jishu$'
mess5db'oushu$'
arrdw100dup(0
ndw?
;要打印的数字个数
idw?
;要打印的矩形边的个数
tdb2
qdw0;q表示列
hdw0;h表示行
jdw0
kdw0
q1dw0;q表示列
h1dw0;h表示行
j1dw0
k1dw0
datareaends
;*************************************************stacksegmentstack
db100dup(0
stackends
;*********************************************
codesegment
assumecs:
code,ds:
datarea,ss:
stack
mainprocfar
start:
movax,datarea
movds,ax
subax,ax
movah,9
movdx,offsetmess1
int21h
huiche
tab;打印回车和换行
callscanf;从键盘接受十进制数
movbx,n
huiche
movah,9
movdx,offsetmess3
int21h
;----------------------------------------------------
movax,1;计算矩形方框边上数字的个数
movcx,1;让输入的数和边个数的平方比较one:
movax,cx
mulcx
cmpax,n
jatwo
jetwo
inccx
jmpone
;------------------------------------------------------
two:
movi,cx;要打印的矩形边的个数movax,cx
divt
cmpah,1;边的数字个数为奇数是跳转
jzthree
cmpah,0
jzfour;边的数字个数为偶数时跳转three:
callprint1;调用奇数打印函数
callprintf
jmpfive
four:
callprint2;调用偶数打印函数
callprintf
jmpfive
five:
movah,4ch
int21h
mainendp
;-----------------------------------------------
scanfprocnear;接受十进制数的子程序movax,0
movbx,0
movcx,0
newchar:
movah,01h
int21h
cmpal,0dh
jzexit
cmpal,48
jlexit1
cmpal,57
jaexit1
subax,30h
cbw
cmpcx,0
jzjinzhi
inccx
xchgax,bx
movcx,10
mulcx
xchgax,bx
addbx,ax
jmpnewchar
jinzhi:
inccx
xchgax,bx
jmpnewchar
exit:
movn,bx
ret
exit1:
huiche
movah,9
movdx,offsetmess2
int21h
huiche
tab
jmpscanf
huiche
scanfendp
;*******************************************************
;---------------------------------------------
print1procnear;奇数打印蜗牛
pushax
pushbx
pushcx
pushdx
movbx,20
movsi,0
movdi,0
movdx,0
movax,1;让AX作为起始值,一直累加到所打印的个数
movcx,i
pushi
deccx
movq,cx;最外层循环
movh,0
pri:
cmpi,1;
jequi2
movj,0
;------------------------------------------------------------
pri0:
cmpj,0;j等于0就跳转到pri1
jepr1
cmpj,1;j等于1就跳转到pri2
jepr2
cmpj,2;j等于2就跳转到pri3
jepr3
cmpj,3;j等于3就跳转到pri4
jepr4
cmpj,4
jepr5
qui2:
jmpquit1
pr1:
movcx,h;把H的值给K
movk,cx
jmppri1
pr2:
movcx,h;把H的值给K
movk,cx
jmppri2
pr3:
movcx,q;把Q的值给K
movk,cx
jmppri3
pr4:
movcx,q;把Q的值给K
movk,cx
jmppri4
pr5:
jmppri5
pri1:
movcx,q
cmpk,cx
jepriexit1
pushbx
pushax;ax入栈,保存现场
movax,bx
mulh;基址bx乘以20,进去数组的第二行
movbx,ax
movax,k;変址di乘以K跳到数组下一个单元
mult
movdi,ax
popax
movarr[bx+di],ax
popbx
incax
inck
jmppri1
priexit1:
jmppriexit
pri2:
movcx,q
cmpk,cx
jepriexit1
pushbx
pushax
movax,bx;跳转到第k行
mulk
movbx,ax
movax,q
mult
movdi,ax
popax
movarr[bx+di],ax
popbx
incax
inck
jmppri2
pri3:
movcx,h
cmpk,cx
jepriexit
pushbx
pushax
movax,bx
mulq
movbx,ax
movax,k
mult
movdi,ax
popax
movarr[bx+di],ax
popbx
incax
deck
jmppri3
pri4:
movcx,h
cmpk,cx
jepriexit
pushbx
pushax
movax,bx
mulk
movbx,ax
movax,h
mult
movdi,ax
popax
movarr[bx+di],ax
popbx
incax
deck
jmppri4
priexit:
incj
cmpj,4
jepri5
jmppri0
;-------------------------------------------------------------------pri5:
movj,0
inch;h减1
decq;q减1
deci
deci
jmppri
quit1:
popi;最后那个数赋给数组
pushax
movax,i
decax
pushax
divt
cbw
movdx,ax
movax,bx
muldx
movbx,ax
mult
divt
cbw
movdi,ax
popax
movarr[bx+di],ax
;---------------------------------------------------------------------
;------------------------------------------------------------------------
popdx
popcx
popbx
popax
ret
print1endp
;----------------------------------------------
print2procnear;偶数打印蜗牛
pushax
pushbx
pushcx
pushdx
movbx,20
movsi,0
movdi,0
movdx,0
movax,1;让AX作为起始值,一直累加到所打印的个数
movcx,i
pushi
deccx
movq1,cx;最外层循环
movh1,0
pr:
cmpi,1;
jlq2
movj1,0
;------------------------------------------------------------
prit0:
cmpj1,0;j等于0就跳转到pri1
jep1
cmpj1,1;j等于1就跳转到pri2
jep2
cmpj1,2;j等于2就跳转到pri3
jep3
cmpj1,3;j等于3就跳转到pri4
jep4
cmpj1,4
jep5
q2:
jmpquit2
p1:
movcx,h1;把H的值给K
movk1,cx
jmpprit1
p2:
movcx,h1;把H的值给K
movk1,cx
jmpprit2
p3:
movcx,q1;把Q的值给K
movk1,cx
jmpprit3
p4:
movcx,q1;把Q的值给K
movk1,cx
jmpprit4
p5:
jmpprit5
prit1:
movcx,q1
cmpk1,cx
jepriexi1
pushbx
pushax;ax入栈,保存现场
movax,bx
mulh1;基址bx乘以20,进去数组的第二行
movbx,ax
movax,k1;変址di乘以K跳到数组下一个单元mult
movdi,ax
popax
movarr[bx+di],ax
popbx
incax
inck1
jmpprit1
priexi1:
jmppriexi
prit2:
movcx,q1cmpk1,cxjepriexi1pushbxpushaxmovax,bx;跳转到第k行mulk1movbx,axmovax,q1multmovdi,axpopaxmovarr[bx+di],axpopbxincaxinck1jmpprit2prit3:
movcx,h1cmpk1,cxjepriexipushbxpushaxmovax,bxmulq1movbx,axmovax,k1multmovdi,axpopaxmovarr[bx+di],axpopbxincaxdeck1jmpprit3prit4:
movcx,h1cmpk1,cxjepriexipushbx
pushaxmovax,bxmulk1movbx,axmovax,h1multmovdi,axpopaxmovarr[bx+di],axpopbxincaxdeck1jmpprit4priexi:
incj1cmpj1,4jeprit5jmpprit0;------------------------------------------------------------------prit5:
movj1,0inch1;h减1decq1;q减1decidecijmpprquit2:
popipopdxpopcxpopbxpopaxretprint2endp;-----------------------------------------------------------------------printfprocnearldw0;定义行mdw0;定义列pushaxpushbxpushcxpushdx;----------------------------------------huichemovl,0qu3:
movdx,i;for语句(第L行为最后一行时结束)
cmpl,dxjzqu1;打印函数的外部循环;--------------------------------------------movm,0qu4:
movdx,i;for语句(第M列为最后一行列时结束)cmpm,dxjzqu2;---------------------------------------------movbx,20movax,bxmullmovbx,axmovax,mmultmovdi,axpushbxmovdx,arr[bx+di]cmpdx,njaqu5movbx,dxtabcallprintDec;------------------------------------------------------incmpopbxjmpqu4qu5:
tabmiincmpopbxjmpqu4qu2:
huicheincljmpqu3;----------------------------------qu1:
popdxpopcxpopbxpopaxret
printfendp;-----------------------------------------------------------------------;***********************************************************;----------------------------------------------------printDecprocnear;输出一个十进制数,参数:
BXtendw10digsdw0;从个位开始,逐位压入堆栈,然后出栈,即可从高位到地位输出movdigs,0lable1:
movax,bxmovdx,0;(dx,ax为被除数divten;除以10,余数为最低位,保存在dx中cmpdx,bxjzlable2;bx%10==bx,只剩下一位了,可以直接压栈incdigspushdxmovbx,axjmplable1lable2:
incdigspushbxmovcx,digsnext:
popaxmovdx,axadddl,30hmovah,2int21hloopnextretprintDecendp;--------------------------------------------------;*****************************************codeendsendstart