Ввести двумерный массив 5х5. И вывести из него главную диагональ (com-файл, tasm) - Assembler

Узнай цену своей работы

Формулировка задачи:

Задание такое:Написать com-программу, которая позволит ввести двумерный массив 5х5. И вывести из него главную диагональ

Решение задачи: «Ввести двумерный массив 5х5. И вывести из него главную диагональ (com-файл, tasm)»

textual
Листинг программы
SEGM segment
assume CS:SEGM, DS:SEGM, ES:SEGM, SS:SEGM
org 100h
Begin:
lea dx,mas
 
mov ax,0 ; vis' "X" 
mov si,0 ; vis' "Y" 
mov di,0 ; 
 
mov cx,1 ;
 
cikl:
cmp cx,10 ;
jl go_go ; 
jmp exit
go_go:
 
;
cmp ax,si ; 
je right_tmpl
cmp right,1
je right_tmpl
jne end_go
 
right_tmpl:
mov right,1 ; 
mov left,0 ; ----
mov down,0 ;---
mov up,0 ; ---
 
call set_mas ; 
inc di ; 
inc di
 
inc si
 
cmp si,k ; 
jne end_go
inc cx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;.......Check end...............
end_go:
mov tmp,ax ; 
mul x ;
shl ax,1 ; 
mov bx,ax
 
cmp mas[bx][di],0 ; 
mov ax,tmp
je down_go ;
jmp chk_end
 
; .DOWN ;;;;;;;;;;;;;
down_go:
cmp si,k
je down_tmpl
cmp down,1
je down_tmpl
jne left_go
 
down_tmpl:
mov right,0
mov left,0
mov down,1
mov up,0
 
mov tmp,ax
call set_mas
mov ax,tmp
inc ax
 
cmp ax,k
jne left_go
inc cx
; LEFT ;;;;;;;;;;;;;
left_go:
cmp ax,k
je left_tmpl
cmp left,1
je left_tmpl
jne up_go
 
left_tmpl:
mov right,0
mov left,1
mov down,0
mov up,0
 
mov tmp,ax
call set_mas
mov ax,tmp
dec di
dec di
 
dec si
 
mov left_ax,ax
mov ax,corner
sub ax,k
cmp si,ax
mov ax,left_ax
jne up_go
inc cx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;..... UP ;;;;;;;;;;;;;
up_go:
mov left_ax,ax
mov ax,corner
sub ax,k
cmp si,ax
mov ax,left_ax
je up_tmpl
cmp up,1
je up_tmpl
jne chk_end
 
up_tmpl:
mov right,0
mov left,0
mov down,0
mov up,1
 
mov tmp,ax
call set_mas
mov ax,tmp
dec ax
 
mov tmp,ax
mul x
shl ax,1
mov bx,ax
 
cmp mas[bx][di],0
mov ax,tmp
je chk_end
inc ax
inc si
 
inc di
inc di
dec k
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
chk_end:
inc cx
jmp cikl
 
exit:
mov di,0
mov ax,0
mov si,0
mov cx,x ; 
mov tmp_cx,cx
Ox:
;Raw
Oy:
mov tmp_ax,ax
mov tmp_si,si
mul x
shl si,1 ; 
shl ax,1
 
mov bx,ax
mov dx,mas[bx][si]
mov al,dl
 
add ax,30h ; 
mov dl,al ;
mov ah,02h ; 
int 21h
 
mov ah,02h ; 
mov dl,0
int 21h
mov si,tmp_si
inc si
 
mov ax,tmp_ax
loop Oy
 
mov dl,13 ; 
mov ah,02h
int 21h
mov dl,10
mov ah,02h
int 21h
 
mov ax,tmp_ax
inc ax
mov si,0
mov cx,tmp_cx
inc di
cmp di,cx ; 
je exit_
inc cx
loop Ox ; цикл...
 
exit_:
mov ax,4c00h ;
int 21h
 
; 
; 
set_mas proc
mul x ; 
shl ax,1 ; *2
mov bx,ax
mov mas[bx][di],cx
ret
set_mas endp
 
;data
mas dw 100 DUP (0) ; 
x dw 3 ;
y dw 3 ; 
 
k dw 2 ;
corner dw 2 ;
left_ax dw 0 ;
tmp dw 0 ; 
 
 
right db 0
left db 0
down db 0
up db 0
 
tmp_ax dw 0
tmp_si dw 0
tmp_cx dw 0
 
 
SEGM ends
end Begin

Объяснение кода листинга программы

Этот код на языке ассемблера предназначен для ввода двумерного массива размером 5x5 и вывода главной диагонали. Он использует регистры для хранения индексов и значений, перемещая их по диагонали от верхнего левого угла до правого нижнего угла. Главная диагональ вычисляется путем умножения суммы индексов на 2 и затем деления на размер массива. Ниже приведен список основных действий, выполняемых в коде:

  1. Ввод двумерного массива размером 5x5.
  2. Инициализация переменных, используемых для хранения индексов и значений.
  3. Вычисление главной диагонали.
  4. Вывод главной диагонали. Список действий в коде:
  5. Переменные ax и si используются в качестве индексов для обхода массива. Первоначально они установлены равными 0.
  6. Переменная cx используется для хранения количества итераций. Она изначально установлена равной 1.
  7. Цикл выполняется до тех пор, пока cx меньше 10.
  8. Если ax и si равны, то это означает, что мы достигли диагонали, и мы переходим к следующему элементу.
  9. Если right равно 1, то это означает, что мы находимся справа от главной диагонали, и мы переходим к следующему элементу.
  10. Если left равно 1, то это означает, что мы находимся слева от главной диагонали, и мы переходим к следующему элементу.
  11. Если down равно 1, то это означает, что мы находимся ниже главной диагонали, и мы переходим к следующему элементу.
  12. Если up равно 1, то это означает, что мы находимся выше главной диагонали, и мы переходим к следующему элементу.
  13. Если di больше cx, то это означает, что мы достигли конца массива, и мы переходим к следующему элементу.
  14. Если mas[bx][di] равно 0, то это означает, что мы находимся на главной диагонали, и мы переходим к следующему элементу.
  15. Если ax и si не равны, то это означает, что мы находимся вне главной диагонали, и мы переходим к следующему элементу.
  16. Если up_tmpl истинно, то это означает, что мы находимся в верхней части массива, и мы переходим к следующему элементу.
  17. Если left_tmpl истинно, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу.
  18. Если right_tmpl истинно, то это означает, что мы находимся в правой части массива, и мы переходим к следующему элементу.
  19. Если down_tmpl истинно, то это означает, что мы находимся в нижней части массива, и мы переходим к следующему элементу.
  20. Если left_ax не равно 0, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу.
  21. Если corner не равно 0, то это означает, что мы находимся в углу массива, и мы переходим к следующему элементу.
  22. Если tmp_ax не равно 0, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу.
  23. Если tmp_si не равно 0, то это означает, что мы находимся в верхней части массива, и мы переходим к следующему элементу.
  24. Если tmp_cx не равно 0, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу.

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы