[emu8086] Создать матрицу по заданному образцу (переделать образец для emu8086) - Assembler

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

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

Нужно данный код переделать для ему8086. Задать матрицу по заданному образцу
@stack  segment para stack
        db      1024 dup(?)
@stack  ends
 
@data   segment
        N       dw      7
        CrLf    db      0Dh, 0Ah, '$'
@data   ends
 
@code   segment
        assume  cs:@code, ds:@data, ss:@stack
main    proc
        ;инициализация сегментного регистра данных
        mov     ax,     @data
        mov     ds,     ax
 
        mov     si,     0
        mov     cx,     [N]
        @@ForI:
                mov     di,     1
                push    cx
                mov     cx,     [N]
                @@ForJ:
                        mov     bx,     [N]
                        inc     bx
                        mov     ax,     si
                        add     ax,     di
                        cmp     ax,     bx
                        mov     bx,     0
                        sbb     bx,     0
                        and     ax,     bx
                        call    Show_AX
                        inc     di
                loop    @@ForJ
                mov     ah,     09h
                lea     dx,     [CrLf]
                int     21h
 
                pop     cx
                inc     si
        loop    @@ForI
 
        ;завершение программы
        mov     ax,     4C00h
        int 21h
main    endp
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     cx,     10      ;основание системы счисления
        xor     di,     di      ; di - кол. цифр в числе
        xor     si,     si      ; si - признак отрицательного числа
        ; если число в ax отрицательное, то
        ;1) напечатать (запомнить в стеке) символ '-'
        ;2) сделать ax положительным
        or      ax,     ax
        jns     @@Conv
        mov     si,     1
 
        neg     ax
 
@@Conv:
        xor     dx,     dx
        div     cx              ; dl = num mod 10
        add     dl,     '0'     ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стек
        or      ax,     ax
        jnz     @@Conv
        ;если число отрицательное - помещаем символ "-" в строку
        or      si,     si
        jz      @@Positive
        mov     dx,     '-'
        push    dx
        inc     di
@@Positive:
        ; выводим из стека на экран
        ; - сначала пробелы для выравнивания по правому краю
        mov     cx,     8
        sub     cx,     di
        mov     ah,     02h
        mov     dl,     ' '
@@LeftPad:
        int     21h
        loop    @@LeftPad
        ;сохранённые символы цифр
@@Show:
        pop     dx              ; dl = очередной выводимый символ
        mov     ah,     2       ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
@code   ends
 
        end     main

Решение задачи: «[emu8086] Создать матрицу по заданному образцу (переделать образец для emu8086)»

textual
Листинг программы
model   small
.data;????Вы ничего из этой модели памяти не пользуете
.stack
.code
n   equ 9
begin:  mov cx,n
    xor si,si
@@01:   push    cx
    push    si
    mov dx,n
    sub dx,cx
@@02:   inc si
    mov ax,si
    or  al,'0'
    int 29h
    loop    @@02
    mov cx,dx
    jcxz    @@04
@@03:   mov al,'0'
    int 29h
    loop    @@03
@@04:   mov al,10
    int 29h
    mov al,13
    int 29h
    pop si
    inc si
    pop cx
    loop    @@01
    mov ax,4C00h
    int 21h
    end begin

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

  1. model small - устанавливает модель памяти, в данном случае, маленькую.
  2. .data - сегмент данных.
  3. .stack - сегмент стека.
  4. .code - сегмент кода.
  5. n equ 9 - переменная n равна 9.
  6. begin: mov cx,n - переменной cx присваивается значение переменной n.
  7. xor si,si - переменная si устанавливается в 0.
  8. @@01: push cx - значение cx сохраняется на стеке.
  9. push si - значение si сохраняется на стеке.
  10. mov dx,n - переменной dx присваивается значение переменной n.
  11. sub dx,cx - из dx вычитается cx.
  12. inc si - значение si увеличивается на 1.
  13. mov ax,si - переменной ax присваивается значение переменной si.
  14. or al,'0' - в al устанавливается значение 0.
  15. int 29h - выполняется звуковой код (вероятно, для воспроизведения звука).
  16. loop @@02 - выполняется цикл, пока si не станет равным 0.
  17. mov cx,dx - переменной cx присваивается значение переменной dx.
  18. jcxz @@04 - если cx не равно 0, то выполняется код с меткой @@04.
  19. mov al,'0' - в al устанавливается значение 0.
  20. int 29h - выполняется звуковой код (вероятно, для воспроизведения звука).
  21. loop @@03 - выполняется цикл, пока si не станет равным 0.
  22. mov al,10 - в al устанавливается значение 10.
  23. int 29h - выполняется звуковой код (вероятно, для воспроизведения звука).
  24. mov al,13 - в al устанавливается значение 13.
  25. int 29h - выполняется звуковой код (вероятно, для воспроизведения звука).
  26. pop si - значение si берется из стека.
  27. inc si - значение si увеличивается на 1.
  28. pop cx - значение cx берется из стека.
  29. loop @@01 - выполняется цикл, пока si не станет равным 0.
  30. mov ax,4C00h - переменной ax присваивается значение 4C00h.
  31. int 21h - выполняется функция, соответствующая прерыванию 21h (вероятно, для завершения программы).
  32. end begin - конец программы.

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


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

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

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