Протабулировать функцию - Assembler

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

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

Отображение таблицы значений выражения x div 3 + x mod 3. Заполнять массив результатами вычислегий. Х от 0 до 20 шаг 5

Решение задачи: «Протабулировать функцию»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        T       db      5 dup(0)
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        lea     si,     T
        mov     di,     0       ;di = x
@@For:
        mov     ax,     di
        call    OutInt
        mov     bl,     3
        div     bl
        add     al,     ah
        mov     [si],   al
 
        push    ax
        mov     ah,     02
        mov     dl,     ' '
        int     21h
        pop     ax
 
        call    OutInt
        push    ax
        mov     ah,     02
        mov     dl,     0Dh
        int     21h
        mov     dl,     0Ah
        int     21h
        pop     ax
 
        add     si,     1
        add     di,     5
        cmp     di,     20
        ja      @@Break
        jmp     @@For
@@Break:
 
        mov     ax,     4C00h
        int     21h
main    endp
 
OutInt  proc
        push    ax
        aam
        add     ax,     '00'
        mov     dl,     ah
        mov     dh,     al
        mov     ah,     02
        int     21h
        mov     dl,     dh
        int     21h
        pop     ax
        ret
OutInt  endp
 
end     main

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

  1. Создание секции LOCALS для локальных переменных
  2. Определение модели памяти 'small'
  3. Резервирование стека размером 100h
  4. Определение секции данных:
    • Создание переменной 'T' как массив с пятью элементами, инициализированных нулями
  5. Начало процедуры 'main'
    • Загрузка базового адреса данных в регистр 'ax'
    • Перемещение адреса данных из 'ax' в регистр 'ds'
  6. Инициализация указателя 'si' на массив 'T' и установка значения регистра 'di' в 0 (di = x)
  7. Метка '@@For': в цикле вычисляется значение для элементов массива 'T':
    • Разделение значения из регистра 'di' на 3
    • Вычисление остатка от деления и его прибавление к частному
    • Запись вычисленного значения в текущий элемент массива 'T' ('[si]')
    • Вывод вычисленного значения посредством вызова процедуры 'OutInt'
    • Вывод пробела и перевод строки
    • Увеличение указателя 'si' на 1 и увеличение значения регистра 'di' на 5
    • Сравнение значения регистра 'di' с 20 для выхода из цикла при достижении этого значения
  8. Метка '@@Break': выход из цикла и завершение процедуры 'main'
  9. Создание процедуры 'OutInt' для вывода чисел
  10. Завершение программы 'end main' Указанный код на ассемблере выполняет простую операцию табулирования функции и вывода результатов.

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

12   голосов , оценка 3.75 из 5