Advertisement
Guest User

Untitled

a guest
May 27th, 2019
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ;
  4. ; Created:   Вт фев 26 2019
  5. ; Processor: ATmega8535
  6. ; Compiler:  AVRASM (Proteus)
  7. ;====================================================================
  8.  
  9. ;====================================================================
  10. ; DEFINITIONS
  11. ;====================================================================
  12.  
  13. ;====================================================================
  14. ; VARIABLES
  15. ;====================================================================
  16.  
  17. ;====================================================================
  18. ; RESET and INTERRUPT VECTORS
  19. ;====================================================================
  20.  
  21.       ; Reset Vector
  22.       rjmp  Start
  23.  
  24. ;====================================================================
  25. ; CODE SEGMENT
  26. ;====================================================================
  27.    .org $40
  28.       arr:  .dw $FF50, $F170, $2070, $1802, $4502, $2025
  29.    .org $52
  30.    
  31.    .equ K=4;
  32.    .equ N=6;
  33.  
  34. ; X - место в резидентной памяти программы
  35. ; R18 - Количество двухбайтовых элементнов
  36. ; R16 - Число К = Степени двойки
  37. ; Результат
  38. ; r21 - 2 часть числа
  39. ; r22 - 1 часть числа
  40. AVERAGE:
  41.    push R2
  42.    in R2,sreg
  43.    push R2            
  44.    push R3
  45.    push R4
  46.    push R5
  47.    push R6
  48.    push R7
  49.    push R8
  50.    push R16
  51.    push R17
  52.    push R18
  53.    push R19
  54.    push R20  
  55.    push R23
  56.    push R24
  57.    push R25  
  58.  
  59. ;==============================================
  60. ; Начало сортировки массива
  61. ;==============================================    
  62.    
  63.    ; запоними текущуе место в РПД массива
  64.    push Xl
  65.    push Xh
  66.    push R18
  67.    
  68.    ; Обозначим необходимые нам регистры именами
  69.    .def CurrentX=R2
  70.    .def IndexMaxElement = R3
  71.    .def MaxElementHigh = R4
  72.    .def MaxElementLow = R5
  73.    .def CurrentIndexElement = R6
  74.    .def CurrentElementHigh = R7
  75.    .def CurrentElementLow = R8
  76.    .def CountElement = R21     
  77.    
  78.    MOV CurrentX, Xl
  79.  
  80.   ; Текущий индекс Элемента в РПД в R20
  81.    MOV R20, Xl     
  82. SORT:
  83.    ;Выполняем сортировку пузырьком
  84.    ;загружаем количество элементов в память
  85.    PUSH R18
  86.    
  87.    ; Получаем текущее Двухбайтовое число и думае что оно максимальное в массиве
  88.    ld MaxElementHigh, X+
  89.    ld MaxElementLow, X
  90.    
  91.    ; возращаем Х на первый элемент массива
  92.    dec Xl
  93.  
  94.    ; Индекс текущего максимального числа
  95.    mov IndexMaxElement, Xl
  96.    
  97.    ; Переходим к следующему двухбайтовому числу
  98.    subi Xl, -2
  99.        
  100.    mov CurrentIndexElement, Xl
  101.    
  102. ; Поиск максимального элемента в массиве
  103. FIND_MAX:
  104.    clc
  105.    mov Xl, CurrentIndexElement     
  106.    
  107.    ; Получаем текущее число в массиве
  108.    ld CurrentElementHigh, X+
  109.    ld CurrentElementLow, X
  110.            
  111.    dec Xl
  112.  
  113.    ; Производим сравнения старших байтов на равеснтво
  114.    CPSE MaxElementHigh, CurrentElementHigh  
  115.    ; Производим сравнения Старших байтов
  116.    CP MaxElementHigh, CurrentElementHigh
  117.    brlo REPLACE_ELEMENT
  118.    brsh NEXT_ITTERATION
  119.        
  120.    ; Сравниваем младшие байты
  121.    CP MaxElementLow, CurrentElementLow
  122.    BRLO REPLACE_ELEMENT
  123.                
  124.    rjmp NEXT_ITTERATION
  125.            
  126. REPLACE_ELEMENT:
  127.    ; Производим обмен предыдущего максимального элемента с текущем
  128.    mov MaxElementHigh, CurrentElementHigh
  129.    mov MaxElementLow, CurrentElementLow
  130.  
  131.    ; Производим обмен Индексов предыдущего максимального элемента с текущем
  132.    mov IndexMaxElement, CurrentIndexElement
  133.            
  134. NEXT_ITTERATION:
  135.    ; Переходим к Следующему элемента массива
  136.    inc currentIndexElement
  137.    inc currentIndexElement
  138.                
  139.    dec R18
  140.                
  141.    brne  FIND_MAX
  142.          
  143.    ; Сравниваем индексы максимального элемента и текущего Элемента
  144.    ; если он равны то переходим к следущему шагу
  145.    ; иначе производим обмен в РПД
  146.    CP IndexMaxElement, CurrentX
  147.    breq NEXT_STEP
  148.            
  149.    ; производим обмен элементов в РПД
  150.    mov Xl, CurrentX
  151.    ld CurrentElementHigh, X+
  152.    ld CurrentElementLow, X
  153.            
  154.    dec Xl
  155.            
  156.    st X, MaxElementHigh
  157.    inc Xl
  158.    st X, MaxElementLow
  159.            
  160.    mov Xl, IndexMaxElement
  161.            
  162.    st X, CurrentElementHigh        
  163.    inc Xl
  164.    st X, CurrentElementLow
  165.                            
  166. NEXT_STEP:
  167.    ; Увеличиваем индекс и переходим к следующему числу в массиве
  168.    inc CurrentX
  169.    inc CurrentX
  170.          
  171.    mov Xl, currentX
  172.          
  173.    pop R18
  174.          
  175.    dec R18
  176.          
  177.    brne SORT
  178.    
  179.    ; Убераем обозначения индексов
  180.    .undef CurrentX 
  181.    .undef IndexMaxElement
  182.    .undef MaxElementHigh
  183.    .undef MaxElementLow
  184.    .undef CurrentElementHigh
  185.    .undef CurrentElementLow
  186.    .undef CurrentIndexElement
  187.    .undef CountElement
  188.  
  189.    ; Достанем текущуе место в РПД массива
  190.    pop R18
  191.    pop Xh
  192.    pop Xl  
  193.        
  194. ;==============================================
  195. ; Конец сортировки массива
  196. ;==============================================  
  197.      
  198.    ldi r19, 2
  199.    
  200.    ; R17 Середина массива
  201.    ; Делим на 2 и умножаем на два,
  202.    ; Чтобы получить чётное число
  203.    mov R17, R18  
  204.    lsr R17
  205.    mul R17, R19
  206.    mov R17, R0    
  207.      
  208.    ; устанавливаем Адрес середины массива    
  209.    add Xl, R17
  210.    
  211.    ; Записываем степень двойки
  212.    mov R17, R16
  213.    
  214.    ; Находим середину от неё
  215.    lsr R17
  216.    
  217.    ; умножаем результат на два, так как у нас 16 разрядные числа
  218.    mul R17, R19  
  219.    mov R17, R0  
  220.    ; Получаем адрес начала радиуса ранжировки
  221.    SUB Xl, R17
  222.      
  223.    push R16      
  224.    ; R22 - Первое 8 разрядное число
  225.    ; R21 - Второе 8 разрядное число
  226.    ; R20 - Третье 8 разрядное число
  227.    clr R20
  228.    clr R21
  229.    clr R22
  230. SUM:
  231.    clc
  232.    ; Считываем пладший разряд
  233.    subi Xl, -1
  234.    ld R17, X
  235.    
  236.    ; Добавляем к необходимому разряду
  237.    add R22,R17
  238.    ; Проверяем переполнение
  239.    brcs OVERFLOW_BIT_1
  240.      
  241.    rjmp NEXT_BYTE_2
  242.      
  243. OVERFLOW_BIT_1:
  244.    inc r21
  245.    clc
  246.      
  247. NEXT_BYTE_2:
  248.    ; Загружаме старший разряд числа
  249.    dec xl
  250.    ld r17, x
  251.  
  252.    ; Добавляем к рязряду по середине
  253.    add r21, r17
  254.    ; Проверка переполнения
  255.    brcs OVERFLOW_BIT_2
  256.      
  257.    rjmp NEXT_BYTE_3
  258.      
  259. OVERFLOW_BIT_2:
  260.    inc R20
  261.    clc
  262.      
  263. NEXT_BYTE_3:       
  264.    subi xl, -2
  265.        
  266.    dec R16
  267.    brne sum
  268.    POP R16
  269.    
  270. ;==============================================
  271. ; Деление 3-байтового числа
  272. ;==============================================
  273.  
  274. ; R22 - Первое 8 разрядное число
  275. ; R21 - Второе 8 разрядное число
  276. ; R20 - Третье 8 разрядное число
  277. ; R19 - делитель  
  278.    
  279.    ldi r23, 2
  280.    ldi R24, 1
  281.    ldi r25, 0
  282.    
  283.    Mov R19, R16
  284.    
  285. ; Определяем степень двойки
  286. POW_TWO:
  287.    ; Если они равны, то степень двойки найдена
  288.    cp R24, R19
  289.    brsh DIVISION
  290.      
  291.    mul R24, R23
  292.    mov R24, R0
  293.    inc R25
  294.      
  295.    rjmp POW_TWO
  296.      
  297. ; Выполняем сдвиги 3 байтового числа
  298. DIVISION:
  299.    lsr r20
  300.    brcs BYTE_IS_ONE
  301.    brcc BYTE_IS_ZERO
  302.      
  303. BYTE_IS_ONE:
  304.    seh
  305.    lsr r21             
  306.    brcs BYTE_IS_ONE_2
  307.    brcc BYTE_IS_ZERO_2
  308.      
  309. BYTE_IS_ZERO:
  310.    clh
  311.    clt
  312.    lsr R21
  313.    brcs BYTE_IS_ONE_2
  314.    brcc BYTE_IS_ZERO_2
  315.        
  316. BYTE_IS_ONE_2:
  317.    lsr R22
  318.    set
  319.    bld R22, 7
  320.            
  321.    rjmp EXIT_DIVISION
  322.            
  323. BYTE_IS_ZERO_2:
  324.    lsr R22
  325.            
  326. EXIT_DIVISION:
  327.    brhs BYTE_IS_ZERO_3
  328.    brhc THE_END
  329.      
  330. BYTE_IS_ZERO_3:
  331.    set
  332.    bld R21, 7
  333.              
  334. THE_END:
  335.    dec r25      
  336.    brne DIVISION            
  337.    
  338. ;==============================================
  339. ; Конец Деления 3 байтового чсила
  340. ;==============================================
  341.    
  342. EXIT:    
  343.    pop R25
  344.    pop R24
  345.    pop R23      
  346.    pop R20  
  347.    pop R19
  348.    pop R18
  349.    pop R17
  350.    pop R16
  351.    pop R8
  352.    pop R7
  353.    pop R6
  354.    pop R5
  355.    pop R4
  356.    pop R3
  357.    pop R2
  358.    out sreg, R2
  359.    pop R2
  360.    ret
  361.    
  362. Start:    
  363.    ldi r16, high(ramend)
  364.    out sph, r16
  365.  
  366.    ldi r16, low(ramend)
  367.    out spl, r16
  368.    
  369.    ldi r18,N  
  370.  
  371.    ldi xl, $60; Начальный адрес в РПД
  372.    ldi zh, high(arr<<1); Загрузка адреса массива в памяти данных
  373.    ldi zl, low(arr<<1); и сдвиг влево
  374.  
  375. INPIT_RPD:
  376.    lpm R2, Z+; Запись массива в РПД
  377.    lpm R3, Z+
  378.    st X+, R3
  379.    st X+, R2
  380.    dec R18  
  381.    brne INPIT_RPD
  382.    
  383.    ldi R16, k
  384.    ldi R18, N  
  385.    
  386.    ldi Xl, $60
  387.    
  388.    RCall Average      
  389.  
  390.      
  391. Loop:
  392.       rjmp  Loop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement