將N方個(gè)(N=3,4,5)個(gè)自然數(shù)按螺旋紋路填入N*N方陣,要求程序運(yùn)行時(shí)輸入?yún)?shù)N,然后輸 出所需的N階方陣,如N=4時(shí)輸出顯示 :
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
本程序設(shè)計(jì)主要要求用匯編語言實(shí)現(xiàn)數(shù)字方陣的創(chuàng)建。
程序提示用戶輸入任一數(shù)字n,系統(tǒng)接收該數(shù)字,并返回一個(gè)n階數(shù)字方陣。要求將n2個(gè)自然數(shù)按螺旋紋路填入這個(gè)n階方陣(順時(shí)針,由外向內(nèi))。本程序設(shè)計(jì)中,系統(tǒng)提示輸入一個(gè)3-9的數(shù)字,根據(jù)輸入的數(shù)字顯示方陣,如輸入4,輸出
要實(shí)現(xiàn)該功能要求,需要顯示提示字符串,接受用戶輸入,調(diào)用中斷[2],按要求顯示方陣。
具體要求:
(1)輸出提示輸入,接受在一定范圍內(nèi)的指定數(shù)字(本程序?yàn)?到9之間),否則重新輸入,如果是ESC鍵,則推出程序
(2)對(duì)接受的數(shù)字進(jìn)行運(yùn)算,將n2個(gè)自然數(shù)按螺旋紋路填入n階方陣并顯示該方陣。

2.2.2 子程序工作流程
SHOW循環(huán)顯示子程序:

程序設(shè)計(jì)分析
算法實(shí)現(xiàn)并不是件簡(jiǎn)單的事情。高級(jí)語言可以設(shè)置二維數(shù)組實(shí)現(xiàn),不必考慮其位數(shù),輸出也僅是一個(gè)元素值。而用匯編則遇到定位鼠標(biāo),才是顯示,根據(jù)程序要求,想要達(dá)到程序要求,必須對(duì)鼠標(biāo)位置做精確定位[3]。匯編一次只能輸出一個(gè)字符,對(duì)于二位十進(jìn)制數(shù)據(jù)時(shí),必須作出處理分別輸出[5]。如果對(duì)于一位二進(jìn)制數(shù)不做處理,輸出時(shí)的樣子非常難看。處理方案是:當(dāng)輸出一位十進(jìn)制數(shù)時(shí),在十位位置填充空格,顯示效果良好[1]。根據(jù)課題的要求,主要完成一下幾方面的設(shè)計(jì):
1.顯示提示輸入,提示輸入 ,并保證輸入大于3小于9,否則重新輸入
2.編寫子程序,用算法實(shí)現(xiàn)每次形如矩形的輸出,直至輸出完畢
3.在輸出時(shí),如果是兩位十進(jìn)制數(shù),使用設(shè)計(jì)子程序分別輸出個(gè)位,十位值,若是一位十進(jìn)制數(shù),十位填充空格,輸出。
3 主要代碼實(shí)現(xiàn)
3.1 主模塊代碼
主模塊主要完成的功能有:在屏幕顯示提示字符串、準(zhǔn)備接收用戶輸入的字符,若為Esc鍵,則推出程序;若為數(shù)字字符,則將其轉(zhuǎn)換成數(shù)字,并判斷數(shù)字是否在規(guī)定范圍內(nèi),然后根據(jù)數(shù)字大小調(diào)用相應(yīng)子模塊,顯示方陣。該模塊主要使用了進(jìn)棧、出棧,基本加減運(yùn)算,賦值運(yùn)算,比較運(yùn)算以及流程跳轉(zhuǎn)控制。
- PUSH CS
- POP DS
- MOV AX,3
- INT 10H ;BIOS中斷,置文本顯示模式
-
- MOV AX,0B800H
- MOV ES,AX ;定位顯存
-
- MOV DX,OFFSET MSG
- MOV AH,9
- INT 21H ;提示
-
- T0: MOV AH,0
- INT 16H ;接收數(shù)據(jù)
-
- CMP AL,1BH ;Esc鍵結(jié)束程序 esc(ascii=1Bh)
- JZ QUIT
-
- CMP AL,'3' ;數(shù)據(jù)校驗(yàn),保證輸入3<al<9
- JB T0
- CMP AL,'9'
- JA T0
-
- MOV AH,0EH ;在Teletype模式下顯示字符
- INT 10H ;顯示有效數(shù)
-
- SUB AL,30H ;得到十進(jìn)制數(shù)字
- PUSH AX
- MUL AL ;al*al
- MOV SI,AX ;保存矩陣最大數(shù)到si中
- POP AX
- CBW ;chang byte to word
- MOV BP,1 ;第一個(gè)元素值
- MOV DI,3*80*2
- NEXT:
- MOV CNT1,AX ;輸入數(shù)據(jù)保存到cnt1
- DEC AX ;n-1
- MOV CNT2,AX
- MOV CNT3,AX
- DEC AX ;(n-1)-1
- MOV CNT4,AX
- ADD DI,3*2
- CALL SHOW ;輸出矩陣
- MOV AX,CNT1
- SUB AX,2
- SUB DI,3*2
- CMP BP,SI
- JBE NEXT ;bp<si,則繼續(xù)執(zhí)行
- MOV AH,0
- INT 16H ;等待
- JNZ START
- QUIT:
- MOV AX,4C00H
- INT 21H
-
- 3.2 顯示方陣模塊代碼
- 顯示方陣模塊主要用于控制數(shù)字及其顯示位置[4],以達(dá)到題目要求的數(shù)字按照螺旋紋路填入n階方陣中。該模塊主要運(yùn)用了賦值運(yùn)算,循環(huán)控制,比較運(yùn)算及流程控制。
- SHOW: ;顯示方陣
- MOV CX,CNT1 ;right 向右賦值
- M1: CALL CRT
- INC BP ;下一個(gè)元素?cái)?shù)值
- LOOP M1
- MOV CX,CNT2 ;down 向下賦值
- JCXZ P2 ;cx=0,則轉(zhuǎn)p2處
- M2: ADD DI,(80-3)*2
- CALL CRT
- INC BP
- LOOP M2
- MOV CX,CNT3 ;left 向左賦值
- JCXZ P2
- M3: SUB DI,6*2 ;下一個(gè)元素位置
- CALL CRT
- INC BP
- LOOP M3
- MOV CX,CNT4 ;up 向上賦值
- JCXZ P2
- M4: SUB DI,(80+3)*2
- CALL CRT
- INC BP
- LOOP M4
- P2: RET
-
- 3.3 顯示控制模塊代碼
- 控制模塊主要用于控制數(shù)字的顯示方式,若為一位數(shù),則顯示個(gè)位,并補(bǔ)充空格;若為兩位數(shù),則分別顯示十位和個(gè)位,以達(dá)到數(shù)字的正確顯示。主要進(jìn)行了數(shù)字的修正和各位數(shù)字的分離。
- CRT:
- MOV AX,BP
- AAM ;調(diào)整指令
- OR AX,3030H
- XCHG AH,AL ;交換ah和al
- CMP AL,'0'
- JNZ P1
- MOV AL,20H
- P1: STOSB ;顯示十位
- INC DI
- MOV AL,AH
- STOSB ;顯示個(gè)位
- INC DI
- MOV AL,20H
- STOSB ;顯示空格
- INC DI
- RET
復(fù)制代碼
運(yùn)行結(jié)果分析
經(jīng)過上訴分析和模塊設(shè)計(jì),編寫出完整的程序代碼。經(jīng)過不斷的調(diào)試和修改得到最終程序設(shè)計(jì)。該程序能正常運(yùn)行,并完成規(guī)定的功能,F(xiàn)將運(yùn)行結(jié)果截圖如下: 程序開始運(yùn)行:
圖4.1 輸入3,運(yùn)行結(jié)果如下:
圖4.2 鍵入9,運(yùn)行結(jié)果如下:
圖4.3
全部資料51hei下載地址: |