Advertisement
Guest User

4

a guest
May 27th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. use16             ;Генерировать 16-битный код
  2. org 100h          ;Программа начинается с адреса 100h
  3. jmp start         ;(1) Переход к метке start
  4.  
  5. ;----------------------------------------------------------------------
  6. s_one db 'Stroka 1 stolbec 5$' ; резервирует в памяти строку,  $ - окончание строки
  7. s_two db 'Stroka 2 stolbec 4$'
  8. s_three db 'Stroka 3 stolbec 3$'
  9. s_four db 'Stroka 4 stolbec 2$'
  10. s_five db 'Stroka 5 stolbec 1$'
  11.  
  12. s_x db 13,10,'Address X: $'
  13. s_y db 13,10,'Address Y: $'
  14. s_cx db 13,10,'CX: $'
  15. s_ss db 13,10,'SS: $'
  16.  
  17. s_exit db 13,10,13,10,'Press any key to exit...$' ;13.10 перевод на новую строку
  18.  
  19.  x dw 5     ;резервирует в памяти x = 5
  20.  y dw 5
  21.  
  22. ;Двумерный массив
  23. table:
  24.     dw 12,45,0,82,11    ;резервирует в памяти данные значения
  25.     dw 46,-5,87,99,56
  26.     dw 35,21,-99,90,-9
  27.     dw 44,2,-1,99,32
  28.     dw 99,45,0,82,34
  29.  
  30. ;----------------------------------------------------------------------
  31. m1:
  32.     mov ax,dx
  33.     push si
  34.     dec cx
  35.     jmp max
  36.  
  37. one:
  38.     mov dx,s_one    ;В DX адрес строки.
  39.     mov ah,9        ;Номер функции DOS.
  40.     int 21h        ;Обращение к функции DOS.
  41.     jmp write_x_y  ;переход на метку write_x_y  так же для всех остальных
  42.    
  43. two:
  44.     mov dx,s_two  
  45.     mov ah,9   
  46.     int 21h    
  47.     jmp write_x_y
  48. three:
  49.     mov dx,s_three
  50.     mov ah,9     
  51.     int 21h    
  52.     jmp write_x_y
  53. four:
  54.     mov dx,s_four  
  55.     mov ah,9     
  56.     int 21h    
  57.     jmp write_x_y
  58. five:
  59.     mov dx,s_five  
  60.     mov ah,9       
  61.     int 21h    
  62.     jmp write_x_y
  63.  
  64.  
  65. write_x_y:
  66.  mov dx,s_x    ;В DX адрес строки.
  67.  mov ah,9    ;Номер функции DOS.
  68.  int 21h     ;Обращение к функции DOS.
  69.  xor ax,ax  ;отчистить ax
  70.  mov ax,x   ;переместить на ах, Х, тут Х не в [], поэтому выводится его адрес, если в [] то его значение
  71.  call write_symbol ; звоним  по метку write_symbol, она нас вернет сюда сама.
  72.  
  73.  ;так же и для y
  74.  
  75.  
  76.  mov dx,s_y  
  77.  mov ah,9  
  78.  int 21h   
  79.  xor ax,ax 
  80.  mov ax,y  
  81.  call write_symbol
  82.  
  83. jmp cx_ss
  84.  
  85.  
  86. cx_ss:
  87.  mov dx,s_cx    ;В DX адрес строки. "s_cx"
  88.  mov ah,9       ;Номер функции DOS.
  89.  int 21h        ;Обращение к функции DOS.
  90. xor ax,ax       ;очистить ax
  91. mov ax,cx       ;переместить на ах значение сх, счетчика)
  92.  call write_symbol ; звоним  по метку write_symbol, она нас вернет сюда сама. так же и для ss
  93.  
  94.  
  95.  mov dx,s_ss   
  96.  mov ah,9    
  97.  int 21h     
  98. xor ax,ax
  99. mov ax,ss
  100.  call write_symbol ; звоним  по метку write_symbol, она нас вернет сюда сама.
  101. jmp exit
  102.  
  103. ;_________________________________________________________
  104. write_symbol: ;это скажи как первая лаба, она тут полностью)
  105. cwd
  106. mov bx,16
  107. div bx       ;без знаковое деление целая часть падает на AX, остаток от деления на DX
  108. push dx      ;поместить в стех значение DX, необходимо для правильной последовательности символов. Последним пришел - первым ушел
  109. inc cx       ;увеличиваем cx на 1 каждый раз, т.к loop уменьшает его на 1
  110.  
  111. cmp ax,0000  ;проверка регистра АХ на наличие в нем числа
  112. je echo      ;если там пусто, то перейти по метке "echo"
  113.  
  114. cwd
  115. jmp write_symbol      ;переход на метку start -начало
  116.  
  117. echo:
  118.  pop dx
  119.  add dx,'0'
  120.  cmp dx,'9'
  121.  jle if_bukv
  122.  add dx,'A'-'0'-10  ;+7
  123. if_bukv:
  124.  mov ah,$02
  125.  int $21
  126. loop echo
  127.  
  128. ret
  129.  
  130. ;_________________________________________________________
  131.  
  132.  
  133. start:
  134.     mov bx,table     ;BX = адрес таблицы, на самом деле двух мерной матрицы нет, все записывается в строчку. Х и У даны для прикола)
  135.     mov si,8         ;SI = смещение элемента от начала таблицы
  136.     push si          ;запоминаем значение регитра si, т.е пихаем его в стек
  137.     mov ax,[bx+si]   ;начинаем бегать по побочной диагонали, на бх у нас таблица, а номер элемнета 8, 8 - потому что начинается с 0, а шаг 2.
  138.                      ;т.е МАТРИЦА А=(0), это элемент  12, шаг два это значит А(2)= 45
  139.     mov cx,[x]      ;чисто символичски засунули Х, это значение счетчика, сколько раз ему пройти по побочной диагонали. х=5
  140. ;_____________________________
  141. max:
  142.     add si,8        ;прибавляем 8 для след действия
  143.     mov dx,[bx+si]  ; шагаем по диагонали, шаг равен 8, 8 прибавили выше
  144.     cmp ax,dx       ; сравниваем ax и dx
  145.     jle m1  ;jle <= если Ах <= DX то переход на метку m1
  146. loop max ; loop max - это переход на метку max пока cx не равен 0. сх задавали на метке старт
  147.  
  148. n_m:       
  149. pop dx      ; достаем из стека последнее значение dx и смотрим чему оно равно cmp это - "если"
  150.  
  151. cmp dx,8
  152. je one ;переход на метку one
  153.  
  154. cmp dx,16
  155. je two  ;переход на метку two
  156.  
  157. cmp dx,24
  158. je three
  159.  
  160. cmp dx,32
  161. je four
  162.  
  163. cmp dx,40
  164. je five
  165. ;_____________________________
  166.  
  167. exit:
  168.  mov dx,s_exit    ;В DX адрес строки.
  169.  mov ah,9    ;Номер функции DOS.
  170.  int 21h     ;Обращение к функции DOS.
  171.     mov ax,0800h
  172.     int 21h
  173.     mov ax,4C00h      ;\
  174.     int 21h       ;/ Завершение программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement