Ввести двумерный массив 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 и затем деления на размер массива. Ниже приведен список основных действий, выполняемых в коде:
- Ввод двумерного массива размером 5x5.
- Инициализация переменных, используемых для хранения индексов и значений.
- Вычисление главной диагонали.
- Вывод главной диагонали. Список действий в коде:
- Переменные
ax
иsi
используются в качестве индексов для обхода массива. Первоначально они установлены равными 0. - Переменная
cx
используется для хранения количества итераций. Она изначально установлена равной 1. - Цикл выполняется до тех пор, пока
cx
меньше 10. - Если
ax
иsi
равны, то это означает, что мы достигли диагонали, и мы переходим к следующему элементу. - Если
right
равно 1, то это означает, что мы находимся справа от главной диагонали, и мы переходим к следующему элементу. - Если
left
равно 1, то это означает, что мы находимся слева от главной диагонали, и мы переходим к следующему элементу. - Если
down
равно 1, то это означает, что мы находимся ниже главной диагонали, и мы переходим к следующему элементу. - Если
up
равно 1, то это означает, что мы находимся выше главной диагонали, и мы переходим к следующему элементу. - Если
di
большеcx
, то это означает, что мы достигли конца массива, и мы переходим к следующему элементу. - Если
mas[bx][di]
равно 0, то это означает, что мы находимся на главной диагонали, и мы переходим к следующему элементу. - Если
ax
иsi
не равны, то это означает, что мы находимся вне главной диагонали, и мы переходим к следующему элементу. - Если
up_tmpl
истинно, то это означает, что мы находимся в верхней части массива, и мы переходим к следующему элементу. - Если
left_tmpl
истинно, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу. - Если
right_tmpl
истинно, то это означает, что мы находимся в правой части массива, и мы переходим к следующему элементу. - Если
down_tmpl
истинно, то это означает, что мы находимся в нижней части массива, и мы переходим к следующему элементу. - Если
left_ax
не равно 0, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу. - Если
corner
не равно 0, то это означает, что мы находимся в углу массива, и мы переходим к следующему элементу. - Если
tmp_ax
не равно 0, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу. - Если
tmp_si
не равно 0, то это означает, что мы находимся в верхней части массива, и мы переходим к следующему элементу. - Если
tmp_cx
не равно 0, то это означает, что мы находимся в левой части массива, и мы переходим к следующему элементу.