8086汇编实现螺旋矩阵

DATA SEGMENT
ARR DB 400 DUP(0) ;存储矩阵
N DB 0 ;矩阵的阶数
NUM DB 0 ;正整数变量
FRONT DB 0 ;头下标,初始值为0
REAR DB 0 ;尾下标
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX ;设置数据段寄存器指向DATA段
CALL READDEC ;调用子程序输入N
MOV N,AL ;将输入的矩阵阶数保存到变量N中
MOV REAR,AL ;设置尾下标为N
DO: ;最外层循环
MOV CH,FRONT
MOV CL,FRONT ;CH用作行坐标,CL用作列坐标
FOR1: ;第一个内层for循环,填充最上面一行
CMP CL,REAR
JNL EXITFOR1 ;循环的条件cl<rear
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX ;以上五行根据行下标ch和列下标cl,计算该矩阵元素在一维数组中的偏移地址ch*N+cl,并赋值给BX
INC NUM ;正整数变量加1
MOV AL,NUM
MOV ARR[BX],AL ;矩阵元素赋值
INC CL ;列下标增1,从左向右赋值
JMP FOR1
EXITFOR1:
DEC CL
MOV CH,FRONT
INC CH
FOR2: ;第二个内层for循环,填充最右边一列
CMP CH,REAR
JNL EXITFOR2 ;循环条件:ch<rear
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX
INC NUM
MOV AL,NUM
MOV ARR[BX],AL
INC CH ;行坐标加1,从上到下赋值
JMP FOR2
EXITFOR2:
DEC CH
MOV CL,REAR
SUB CL,2
FOR3: ;第三个内层for循环,填充最下面一行
CMP CL,FRONT
JL EXITFOR3 ;循环条件cl>=front
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX
INC NUM
MOV AL,NUM
MOV ARR[BX],AL
DEC CL ;列坐标减1,从右向左赋值
JMP FOR3
EXITFOR3:
INC CL
MOV CH,REAR
SUB CH,2
FOR4: ;第四个内层for循环,填充最左边一列
CMP CH,FRONT
JNG EXITFOR4 ;循环条件ch>front
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX
INC NUM
MOV AL,NUM
MOV ARR[BX],AL
DEC CH ;行坐标减1,从下到上赋值
JMP FOR4
EXITFOR4:
INC FRONT
DEC REAR
MOV AL,CH
INC AL
MUL N
ADD AL,CL
ADC AH,0
INC AX
MOV BX,AX
MOV AL,ARR[BX]
OR AL,AL
JNZ OUTPUT
JMP DO

OUTPUT: ;输出矩阵
LEA BX,ARR
MOV CH,0 ;ch做行坐标
LOP1:
CMP CH,N
JNL EXITLOP1
MOV CL,0 ;cl做列坐标
LOP2: ;内层循环输出矩阵一行内容
CMP CL,N
JNL EXITLOP2
MOV AL,CH
MUL N
ADD AL,CL
ADC AH,0
MOV BX,AX ;计算矩阵元素在数组中的偏移地址
MOV AL,ARR[BX]
MOV AH,0
PUSH CX
CALL WRITEDEC
POP CX
MOV AH,2
MOV DL,9
INT 21H ;输出水平制表符
INC CL
JMP LOP2
EXITLOP2:
MOV AH,2
MOV DL,10
INT 21H ;输出换行
INC CH
JMP LOP1
EXITLOP1:
MOV AH,4CH
INT 21H

READDEC PROC ;输入十进制数,返回值AX
MOV CX,10
XOR BX,BX
LOPREAD:
MOV AH,01H
INT 21H
CMP AL,’ ’
JZ EXITREAD
CMP AL,13
JZ EXITREAD
SUB AL,30H
PUSH AX
MOV AX,BX
MUL CX
POP DX
ADD AL,DL
ADC AH,0
MOV BX,AX
JMP LOPREAD
EXITREAD:
MOV AX,BX
RET
READDEC ENDP

WRITEDEC PROC ;输出十进制数,参数:AX
XOR CX,CX
MOV BX,10
DIV10:
XOR DX,DX
DIV BX
PUSH DX
INC CX
TEST AX,AX
JNZ DIV10
POPNUM:
POP DX
ADD DL,‘0’
MOV AH,2
INT 21H
LOOP POPNUM
RET
WRITEDEC ENDP

CODE ENDS
END START

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值