Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use16 ;Генерировать 16-битный код
- org 100h ;Программа начинается с адреса 100h
- jmp start ;(1) Переход к метке start
- ;----------------------------------------------------------------------
- s_one db 'Stroka 1 stolbec 5$' ; резервирует в памяти строку, $ - окончание строки
- s_two db 'Stroka 2 stolbec 4$'
- s_three db 'Stroka 3 stolbec 3$'
- s_four db 'Stroka 4 stolbec 2$'
- s_five db 'Stroka 5 stolbec 1$'
- s_x db 13,10,'Address X: $'
- s_y db 13,10,'Address Y: $'
- s_cx db 13,10,'CX: $'
- s_ss db 13,10,'SS: $'
- s_exit db 13,10,13,10,'Press any key to exit...$' ;13.10 перевод на новую строку
- x dw 5 ;резервирует в памяти x = 5
- y dw 5
- ;Двумерный массив
- table:
- dw 12,45,0,82,11 ;резервирует в памяти данные значения
- dw 46,-5,87,99,56
- dw 35,21,-99,90,-9
- dw 44,2,-1,99,32
- dw 99,45,0,82,34
- ;----------------------------------------------------------------------
- m1:
- mov ax,dx
- push si
- dec cx
- jmp max
- one:
- mov dx,s_one ;В DX адрес строки.
- mov ah,9 ;Номер функции DOS.
- int 21h ;Обращение к функции DOS.
- jmp write_x_y ;переход на метку write_x_y так же для всех остальных
- two:
- mov dx,s_two
- mov ah,9
- int 21h
- jmp write_x_y
- three:
- mov dx,s_three
- mov ah,9
- int 21h
- jmp write_x_y
- four:
- mov dx,s_four
- mov ah,9
- int 21h
- jmp write_x_y
- five:
- mov dx,s_five
- mov ah,9
- int 21h
- jmp write_x_y
- write_x_y:
- mov dx,s_x ;В DX адрес строки.
- mov ah,9 ;Номер функции DOS.
- int 21h ;Обращение к функции DOS.
- xor ax,ax ;отчистить ax
- mov ax,x ;переместить на ах, Х, тут Х не в [], поэтому выводится его адрес, если в [] то его значение
- call write_symbol ; звоним по метку write_symbol, она нас вернет сюда сама.
- ;так же и для y
- mov dx,s_y
- mov ah,9
- int 21h
- xor ax,ax
- mov ax,y
- call write_symbol
- jmp cx_ss
- cx_ss:
- mov dx,s_cx ;В DX адрес строки. "s_cx"
- mov ah,9 ;Номер функции DOS.
- int 21h ;Обращение к функции DOS.
- xor ax,ax ;очистить ax
- mov ax,cx ;переместить на ах значение сх, счетчика)
- call write_symbol ; звоним по метку write_symbol, она нас вернет сюда сама. так же и для ss
- mov dx,s_ss
- mov ah,9
- int 21h
- xor ax,ax
- mov ax,ss
- call write_symbol ; звоним по метку write_symbol, она нас вернет сюда сама.
- jmp exit
- ;_________________________________________________________
- write_symbol: ;это скажи как первая лаба, она тут полностью)
- cwd
- mov bx,16
- div bx ;без знаковое деление целая часть падает на AX, остаток от деления на DX
- push dx ;поместить в стех значение DX, необходимо для правильной последовательности символов. Последним пришел - первым ушел
- inc cx ;увеличиваем cx на 1 каждый раз, т.к loop уменьшает его на 1
- cmp ax,0000 ;проверка регистра АХ на наличие в нем числа
- je echo ;если там пусто, то перейти по метке "echo"
- cwd
- jmp write_symbol ;переход на метку start -начало
- echo:
- pop dx
- add dx,'0'
- cmp dx,'9'
- jle if_bukv
- add dx,'A'-'0'-10 ;+7
- if_bukv:
- mov ah,$02
- int $21
- loop echo
- ret
- ;_________________________________________________________
- start:
- mov bx,table ;BX = адрес таблицы, на самом деле двух мерной матрицы нет, все записывается в строчку. Х и У даны для прикола)
- mov si,8 ;SI = смещение элемента от начала таблицы
- push si ;запоминаем значение регитра si, т.е пихаем его в стек
- mov ax,[bx+si] ;начинаем бегать по побочной диагонали, на бх у нас таблица, а номер элемнета 8, 8 - потому что начинается с 0, а шаг 2.
- ;т.е МАТРИЦА А=(0), это элемент 12, шаг два это значит А(2)= 45
- mov cx,[x] ;чисто символичски засунули Х, это значение счетчика, сколько раз ему пройти по побочной диагонали. х=5
- ;_____________________________
- max:
- add si,8 ;прибавляем 8 для след действия
- mov dx,[bx+si] ; шагаем по диагонали, шаг равен 8, 8 прибавили выше
- cmp ax,dx ; сравниваем ax и dx
- jle m1 ;jle <= если Ах <= DX то переход на метку m1
- loop max ; loop max - это переход на метку max пока cx не равен 0. сх задавали на метке старт
- n_m:
- pop dx ; достаем из стека последнее значение dx и смотрим чему оно равно cmp это - "если"
- cmp dx,8
- je one ;переход на метку one
- cmp dx,16
- je two ;переход на метку two
- cmp dx,24
- je three
- cmp dx,32
- je four
- cmp dx,40
- je five
- ;_____________________________
- exit:
- mov dx,s_exit ;В DX адрес строки.
- mov ah,9 ;Номер функции DOS.
- int 21h ;Обращение к функции DOS.
- mov ax,0800h
- int 21h
- mov ax,4C00h ;\
- int 21h ;/ Завершение программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement