Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.07 KB | None | 0 0
  1. ;86 6-1
  2. ;исходим из предположения, что все значения СВ лежат в диапазоне 0..9, хранятся как однобайтные числа в области памяти
  3. ;с адреса Buf33 и дальше. при написании кода ПП в пункте 2 предполагается, что ASCII-коды значений СВ в памяти были
  4. ;заменены на соответствующие им числа.
  5.  
  6.  
  7. ;Пункт 2:
  8. ;ПП с передачей параметров через регистры
  9. ; р.п. HL - адрес текущего значения СВ. рег. B - счётчик цикла (сказано, что N - byte). р.п. DE - рез-т сложения значений.
  10. ; параметры - адрес буфера данных, его размер в формате byte
  11.  
  12. ;вызов ПП
  13. LXI H,Buf33 ; загружаем в р.п. HL адрес первого значения СВ
  14. MVI B, N ; рег. B используем в качестве счётчика для массива
  15. CALL PP_SKO
  16. ;конец вызова ПП. результат (СКО) записан в регистр H.
  17.  
  18. ; код ПП
  19. PP_SKO:
  20. LXI D,00FFh ; в рег. D будем хранить максимум, в рег E - минимум
  21. LOOP:
  22. MOV A,M ; чтение значения СВ из памяти
  23. CMP E; сравниваем с минимумом
  24. JNC MAX; если A>=E (значение СВ больше текущего минимума), то переходим к проверке на максимум
  25. MOV E,A; иначе записываем в E новый минимум
  26. MAX:
  27. CMP D; сравниваем с максимумом
  28. JC NEXT; если A>=D (значение СВ меньше текущего максимума, то переходим к постусловию цикла
  29. MOV D,A; иначе записываем в D новый максимум (если новый максимум равен старому - тоже записываем, это тратит впустую процессорные циклы, но разве кому-то не пофиг?)
  30. NEXT:
  31. INX H; сдвигаем указатель на следущий адрес в памяти
  32. DCR B; уменьшаем счётчик на 1
  33. JNZ LOOP; проверка постусловия
  34. ; подготовим параметры для ПП деления
  35. MOV A,D; запишем в А максимум
  36. SUB E; вычтем из него минимум
  37. MVI C,3; Загружаем в регистр C делитель
  38. CALL Divide; Вызываем подпрограмму деления
  39. RET
  40. ;конец кода ПП
  41.  
  42.  
  43. ;Пункт 3. ПП перевода массива чисел, записанных ASCII-кодами в соответствующие им числовые значения.
  44.  
  45. ;вызов ПП
  46. LXI H,Buf33 ; загружаем в р.п. HL адрес первого значения СВ
  47. MVI B, N ; рег. B используем в качестве счётчика для массива
  48. CALL PP_ASCII2NUM
  49. ;конец вызова ПП. результат (числовые значения СВ) записаны в те же ячейки памяти, откуда мы брали их ASCII-коды.
  50.  
  51. ;код ПП
  52. PP_ASCII2NUM:
  53. LOOP:
  54. MOV A,M; записываем элемент массива в аккумулятор
  55. SUB 30h; вычитаем 30h, чтобы поставить ASCII-коду числа в соответствие само число
  56. MOV M,A; результат записываем обратно в массив
  57. INX H; сдвигаем указатель на следущий адрес в памяти
  58. DCR B; уменьшаем счётчик на 1
  59. JNZ LOOP; проверка постусловия
  60. RET; возвращаемся из кода ПП. параметры не возвращаются.
  61. ;конец кода ПП
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement