Формирование одномерного массива слов по формуле - Assembler

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

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

Вот код программы, нужно было сделать следующее: Разработайте программу на языке ассемблера, формирующую одномерный массив слов A{ai} (i=1..20), где ai вычисляется по формуле: ai = (i*3 – i*2) х 4. При вывода на экран выдает какие-то иероглифы. В чем проблема?
data segment
    mas dw 20 dup (?)
ends                     
 
stack segment
    dw   128  dup(0)
ends
 
code segment
start:  
mov ax, data
mov ds, ax
mov es, ax 
xor bx, bx
 
mov di, 1
 
ffff:   
   mov ax, di
   mov cx, 3
   mul cx
   mov dx, ax    
   mov cx, 2
   mov ax, di
   mul cx
   sub dx, ax
   mov ax, dx
   mov cx, 4
   mul cx
   mov mas[di], ax
   inc di 
   cmp di, 20
   je rrrr
   jmp ffff
   
rrrr:  
   mov di, 1
   mov ah, 02h    
   print:
   mov dx, mas[di]  
   int 21h      
   inc di
   cmp di, 20
   je eeend
   jmp print
   
eeend:     
   mov ax, 4c00h
int 21h  
 
ends
 
end start

Решение задачи: «Формирование одномерного массива слов по формуле»

textual
Листинг программы
data segment
    mas dw 20 dup (?)
data ends                     
 
stk segment stack
    dw 128 dup('?')
stk ends
 
code segment
assume cs:code,ds:data,ss:stk
    start:  
    mov ax,data
    mov ds,ax 
 
    mov di,1
    mov si,0
 
    ffff:   
    mov ax,di
    mov cl,3
    mul cl
    mov dx,ax 
    mov ax,di
    mov cl,2
    mul cl
    sub dx,ax
    mov ax,dx
    mov cl,4
    mul cl
    mov mas[si],ax
    inc di
    inc si
    inc si
    cmp di,21
    je rrrr
    jmp ffff
   
    rrrr:  
    mov si,0    
    print:
    mov ax,mas[si]
    mov dl,10
    div dl
    
    mov dx,ax
        
    mov ah,02h
    or dl,30h
    int 21h
    
    xchg dh,dl
    
    or dl,30h
    int 21h
    
    mov dl,' '
    int 21h
    
    inc si
    inc si
    cmp si,40
    je eeend
    jmp print
   
    eeend:     
    mov ax,4C00h
    int 21h  
 
code ends
end start

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

В этом коде на языке Assembler формируется одномерный массив слов по формуле. Список действий:

  1. Переменная mas инициализируется 20 одинаковыми значениями (?).
  2. Переменная di устанавливается равной 1, а si равной 0.
  3. Начинается цикл ffff, который выполняется до тех пор, пока di меньше или равно 21. В каждой итерации цикла выполняется:
    • dx присваивается произведение di на 3.
    • ax присваивается произведение di на 2.
    • dx вычитается из ax.
    • mas[si] присваивается значение ax.
    • di увеличивается на 1, si увеличивается на 1, а затем на 1 снова.
  4. Если di больше или равно 21, то выполняется переход к метке rrrr.
  5. Начинается цикл print, который выполняется до тех пор, пока si меньше или равно 40. В каждой итерации цикла выполняется:
    • ax присваивается значение mas[si].
    • Выводится десятичное значение ax.
    • dl устанавливается равным пробелу (' ').
    • Выводится символьное значение dl.
    • si увеличивается на 1, затем на 1 снова.
  6. Если si больше или равно 40, то выполняется переход к метке eeend.
  7. Завершается выполнение программы.

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


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

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

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