Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;86 6-1
- ;исходим из предположения, что все значения СВ лежат в диапазоне 0..9, хранятся как однобайтные числа в области памяти
- ;с адреса Buf33 и дальше. при написании кода ПП в пункте 2 предполагается, что ASCII-коды значений СВ в памяти были
- ;заменены на соответствующие им числа.
- ;Пункт 2:
- ;ПП с передачей параметров через регистры
- ; р.п. HL - адрес текущего значения СВ. рег. B - счётчик цикла (сказано, что N - byte). р.п. DE - рез-т сложения значений.
- ; параметры - адрес буфера данных, его размер в формате byte
- ;вызов ПП
- LXI H,Buf33 ; загружаем в р.п. HL адрес первого значения СВ
- MVI B, N ; рег. B используем в качестве счётчика для массива
- CALL PP_SKO
- ;конец вызова ПП. результат (СКО) записан в регистр H.
- ; код ПП
- PP_SKO:
- LXI D,00FFh ; в рег. D будем хранить максимум, в рег E - минимум
- LOOP:
- MOV A,M ; чтение значения СВ из памяти
- CMP E; сравниваем с минимумом
- JNC MAX; если A>=E (значение СВ больше текущего минимума), то переходим к проверке на максимум
- MOV E,A; иначе записываем в E новый минимум
- MAX:
- CMP D; сравниваем с максимумом
- JC NEXT; если A>=D (значение СВ меньше текущего максимума, то переходим к постусловию цикла
- MOV D,A; иначе записываем в D новый максимум (если новый максимум равен старому - тоже записываем, это тратит впустую процессорные циклы, но разве кому-то не пофиг?)
- NEXT:
- INX H; сдвигаем указатель на следущий адрес в памяти
- DCR B; уменьшаем счётчик на 1
- JNZ LOOP; проверка постусловия
- ; подготовим параметры для ПП деления
- MOV A,D; запишем в А максимум
- SUB E; вычтем из него минимум
- MVI C,3; Загружаем в регистр C делитель
- CALL Divide; Вызываем подпрограмму деления
- RET
- ;конец кода ПП
- ;Пункт 3. ПП перевода массива чисел, записанных ASCII-кодами в соответствующие им числовые значения.
- ;вызов ПП
- LXI H,Buf33 ; загружаем в р.п. HL адрес первого значения СВ
- MVI B, N ; рег. B используем в качестве счётчика для массива
- CALL PP_ASCII2NUM
- ;конец вызова ПП. результат (числовые значения СВ) записаны в те же ячейки памяти, откуда мы брали их ASCII-коды.
- ;код ПП
- PP_ASCII2NUM:
- LOOP:
- MOV A,M; записываем элемент массива в аккумулятор
- SUB 30h; вычитаем 30h, чтобы поставить ASCII-коду числа в соответствие само число
- MOV M,A; результат записываем обратно в массив
- INX H; сдвигаем указатель на следущий адрес в памяти
- DCR B; уменьшаем счётчик на 1
- JNZ LOOP; проверка постусловия
- RET; возвращаемся из кода ПП. параметры не возвращаются.
- ;конец кода ПП
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement