找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2015|回复: 0
打印 上一主题 下一主题
收起左侧

汇编语言实现数字方阵程序

[复制链接]
跳转到指定楼层
楼主
ID:910466 发表于 2021-4-22 19:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将N方个(N=3,4,5)个自然数按螺旋纹路填入N*N方阵,要求程序运行时输入参数N,然后输 出所需的N阶方阵,如N=4时输出显示 :
1   2   3   4
12  13  14  5
11  16  15  6
10  9   8   7

本程序设计主要要求用汇编语言实现数字方阵的创建。
程序提示用户输入任一数字n,系统接收该数字,并返回一个n阶数字方阵。要求将n2个自然数按螺旋纹路填入这个n阶方阵(顺时针,由外向内)。本程序设计中,系统提示输入一个3-9的数字,根据输入的数字显示方阵,如输入4,输出

     要实现该功能要求,需要显示提示字符串,接受用户输入,调用中断[2],按要求显示方阵。
具体要求:
(1)输出提示输入,接受在一定范围内的指定数字(本程序为3到9之间),否则重新输入,如果是ESC键,则推出程序
(2)对接受的数字进行运算,将n2个自然数按螺旋纹路填入n阶方阵并显示该方阵。



2.2.2  子程序工作流程
SHOW循环显示子程序:  



程序设计分析
算法实现并不是件简单的事情。高级语言可以设置二维数组实现,不必考虑其位数,输出也仅是一个元素值。而用汇编则遇到定位鼠标,才是显示,根据程序要求,想要达到程序要求,必须对鼠标位置做精确定位[3]。汇编一次只能输出一个字符,对于二位十进制数据时,必须作出处理分别输出[5]。如果对于一位二进制数不做处理,输出时的样子非常难看。处理方案是:当输出一位十进制数时,在十位位置填充空格,显示效果良好[1]。根据课题的要求,主要完成一下几方面的设计:
1.显示提示输入,提示输入 ,并保证输入大于3小于9,否则重新输入
2.编写子程序,用算法实现每次形如矩形的输出,直至输出完毕
3.在输出时,如果是两位十进制数,使用设计子程序分别输出个位,十位值,若是一位十进制数,十位填充空格,输出。

3  主要代码实现

3.1 主模块代码
      主模块主要完成的功能有:在屏幕显示提示字符串、准备接收用户输入的字符,若为Esc键,则推出程序;若为数字字符,则将其转换成数字,并判断数字是否在规定范围内,然后根据数字大小调用相应子模块,显示方阵。该模块主要使用了进栈、出栈,基本加减运算,赋值运算,比较运算以及流程跳转控制。
  1. PUSH      CS
  2.               POP       DS
  3.               MOV       AX,3
  4.               INT       10H         ;BIOS中断,置文本显示模式

  5.               MOV       AX,0B800H
  6.               MOV       ES,AX       ;定位显存

  7.               MOV       DX,OFFSET MSG
  8.               MOV       AH,9
  9.               INT       21H         ;提示

  10.          T0:  MOV       AH,0
  11.               INT       16H         ;接收数据

  12.               CMP       AL,1BH      ;Esc键结束程序  esc(ascii=1Bh)
  13.               JZ        QUIT

  14.               CMP       AL,'3'      ;数据校验,保证输入3<al<9
  15.               JB        T0
  16.               CMP       AL,'9'
  17.               JA        T0

  18.               MOV       AH,0EH      ;在Teletype模式下显示字符
  19.               INT       10H         ;显示有效数

  20.               SUB       AL,30H      ;得到十进制数字
  21.               PUSH      AX
  22.               MUL       AL          ;al*al
  23.               MOV       SI,AX       ;保存矩阵最大数到si中
  24.               POP       AX
  25.               CBW                   ;chang byte to word
  26.               MOV       BP,1        ;第一个元素值
  27.               MOV       DI,3*80*2
  28.        NEXT:
  29.               MOV       CNT1,AX     ;输入数据保存到cnt1
  30.               DEC       AX          ;n-1
  31.               MOV       CNT2,AX
  32.               MOV       CNT3,AX
  33.               DEC       AX          ;(n-1)-1
  34.               MOV       CNT4,AX
  35.               ADD       DI,3*2
  36.               CALL      SHOW        ;输出矩阵
  37.               MOV       AX,CNT1
  38.               SUB       AX,2
  39.               SUB       DI,3*2
  40.               CMP       BP,SI
  41.               JBE       NEXT        ;bp<si,则继续执行
  42.               MOV       AH,0
  43.               INT       16H         ;等待
  44.               JNZ       START
  45.        QUIT:
  46.               MOV       AX,4C00H
  47.               INT       21H

  48. 3.2 显示方阵模块代码
  49.     显示方阵模块主要用于控制数字及其显示位置[4],以达到题目要求的数字按照螺旋纹路填入n阶方阵中。该模块主要运用了赋值运算,循环控制,比较运算及流程控制。
  50. SHOW:                            ;显示方阵
  51.               MOV       CX,CNT1       ;right 向右赋值
  52.          M1:  CALL      CRT
  53.              INC       BP            ;下一个元素数值
  54.               LOOP      M1
  55.               MOV       CX,CNT2       ;down 向下赋值
  56.               JCXZ      P2            ;cx=0,则转p2处
  57.          M2:  ADD       DI,(80-3)*2
  58.               CALL      CRT
  59.               INC       BP
  60.               LOOP      M2
  61.               MOV       CX,CNT3        ;left 向左赋值
  62.               JCXZ      P2
  63.          M3:  SUB       DI,6*2         ;下一个元素位置
  64.               CALL      CRT
  65.               INC       BP
  66.               LOOP      M3
  67.               MOV       CX,CNT4       ;up 向上赋值
  68.               JCXZ      P2
  69.          M4:  SUB       DI,(80+3)*2
  70.               CALL      CRT
  71.               INC       BP
  72.               LOOP      M4
  73.          P2:  RET

  74. 3.3 显示控制模块代码
  75.       控制模块主要用于控制数字的显示方式,若为一位数,则显示个位,并补充空格;若为两位数,则分别显示十位和个位,以达到数字的正确显示。主要进行了数字的修正和各位数字的分离。
  76. CRT:
  77.               MOV       AX,BP
  78.               AAM                      ;调整指令
  79.               OR        AX,3030H
  80.               XCHG      AH,AL          ;交换ah和al
  81.               CMP       AL,'0'
  82.               JNZ       P1
  83.               MOV       AL,20H
  84.          P1:  STOSB                   ;显示十位
  85.               INC       DI
  86.               MOV       AL,AH
  87.               STOSB                   ;显示个位
  88.               INC       DI
  89.               MOV       AL,20H
  90.               STOSB                   ;显示空格
  91.               INC       DI
  92.               RET
复制代码

运行结果分析
经过上诉分析和模块设计,编写出完整的程序代码。经过不断的调试和修改得到最终程序设计。该程序能正常运行,并完成规定的功能。现将运行结果截图如下:
程序开始运行:

                         图4.1
输入3,运行结果如下:

                        图4.2
键入9,运行结果如下:

                         图4.3

全部资料51hei下载地址:
数字方正程序exe汇编.7z (92.81 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表