Создание одно- и многосегментных программ - Assembler

Узнай цену своей работы

Формулировка задачи:

Ребят помогите пожалуйста, думаю уже которую неделю, нужно разработать одно- и многосегментную программы. Суть заключается в следующем: Написать программу на ассемблере, осуществляющую ввод последовательности символов с клавиатуры, обработку кодов символов в соответствии с заданием и вывод на экран результирующей последовательности Программа должна включать в себя: • ввод последовательности символов с клавиатуры (в результате ввода формируется статический массив кодов символов, максимальное число вводимых символов задается студентом самостоятельно); • обработку кодов символов в соответствии с заданием (вариант задания, B. Перестановка a(n),a(n-1),a(n-2),...,a(n/2),a(1),a(2),...,a(n/2-1).); • вывод на экран результирующей последовательности Программа должна быть реализована в 2-х вариантах: а) односегментная (.com); б) многосегментная (.exe). ЗАДАНИЕ 2: Написать программу на Ассемблере, осуществляющую вывод на экран даты создания BIOS (Aф=0FFFF5h) прямой записью в видеопамять (Аф=B8000h). Использовать точечные директивы (модель памяти, директивы сегментации). пожалуйста хотя бы объясните, просто эту тему пропустил, никак въехать не могу, знаю что это самая мелочь, но всё равно.

Решение задачи: «Создание одно- и многосегментных программ»

textual
Листинг программы
mov    cx, 8   //длина строки
mov    si,0200   //адрес начального массива
mov    di,0208  //адрес конечного массива
push    si      //читаем байт из исходного массива
add    si,cx        //добавляем в si длину строки
dec     si          //указатель на конец si
shr    cx,1       //сдвигаем на 1
push    cx        //делим по полам cx
mov    al,[si]        //сравниваем si 
mov    [di],al       //сравниваем di
dec     si         //указатель на конец начального массива   
inc     di     //записываем в конечный массив
loop    0110              //переходим на строку 0110
pop    cx              //достаем cx
pop     si       //достаем si
mov    al,[si]        //сравниваем si 
mov    [di],al       //сравниваем di
inc     si         //указатель на начало массива 
inc     di     //записываем в конечный массив
loop    011A              //переходим на строку 011A

Объяснение кода листинга программы

Список действий:

  1. mov cx, 8 - устанавливаем счётчик длины строки в 8
  2. mov si,0200 - устанавливаем начальный адрес массива в 0200
  3. mov di,0208 - устанавливаем конечный адрес массива в 0208
  4. push si - читаем байт из исходного массива и добавляем к нему длину строки
  5. add si, cx - смещаем указатель на конец строки
  6. dec si - уменьшаем счётчик на единицу
  7. shr cx,1 - сдвигаем счётчик на единицу вправо
  8. push cx - делим счётчик пополам
  9. mov al,[si] - сравниваем начальный байт строки
  10. mov [di],al - записываем начальный байт в конечный массив
  11. dec si - уменьшаем счётчик на единицу
  12. inc di - увеличиваем указатель на конечный массив на единицу
  13. loop 0110 - переходим к строке 0110
  14. pop cx - достаём счётчик из стека
  15. pop si - достаём указатель из стека
  16. mov al,[si] - сравниваем байт из начального массива
  17. mov [di],al - записываем байт из начального массива в конечный массив
  18. inc si - увеличиваем счётчик на единицу
  19. inc di - увеличиваем указатель на конечный массив на единицу
  20. loop 011A - переходим к строке 011A

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы