Из данного массива создать массив квадратов элементов. В чем ошибка? - Assembler

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

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

программа из данного масива создает массивквадротов этих значений
assume cs:mycode,ds:mydate,ss:mystack
mycode  segment para 
start:  push  ds     
        xor   ax,ax  
        push  ax
        mov   ax,seg mydate
        mov   ds,ax
        xor   si,si   
        mov   di,si
        mov   cx,n 
cycl:   mov   ax,a[si] 
        mov   b,ax
        mul   ax
        mov   bx,b
        mov   b[di],bx
        inc   si         
        inc   si
        inc   di
        inc   di
        loop cycl
        retf         
mycode  ends
mydate    segment para
n       dw   12
a       dw   4,3,8,5,-1,9,6,7,2,-8,1,-3
b       dw   12 dup(0)
d       dw   12 dup (0)
mydate  ends
 
mystack segment para stack 'stack'
        dw 100 dup (?) 
mystack ends
        end start
вроде все правильно в цикле но значения вместо этого вообще не меняются p/s/ не ругайте если что. я только учусь.

Решение задачи: «Из данного массива создать массив квадратов элементов. В чем ошибка?»

textual
Листинг программы
.model  compact
.386
.code
start:  mov ax, @data
    mov ds, ax
    mov es, ax
        lea   si, a
        lea   di, b
        mov   cx,n 
cycl:   lodsw
    imul    ax,ax
    stosw
    loop    cycl
    mov ax, 4C00h
    int 21h
.data
a       dw  4,3,8,5,-1,9,6,7,2,-8,1,-3
n       =   ($ - a)/2
b       dw  n dup(?)
;d       dw   12 dup (0)
.stack
        end start

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

В этом коде выполняется следующая последовательность действий:

  1. Устанавливаются сегменты данных и кода.
  2. Перемещаются указатели на начальный элемент массива a и на пустой массив b.
  3. Вычисляется размер массива a в словах.
  4. Начинается цикл по всем элементам массива a.
  5. Каждый элемент массива a умножается на себя и записывается в массив b.
  6. После окончания цикла в массив b записывается слово 0.
  7. Задается код завершения работы программы. Ошибка в этом коде заключается в вычислении размера массива a. В данном случае, переменная n вычисляется как ($ - a)/2, где $ — это конец массива a, а a — это начало массива a. То есть, переменная n будет всегда равна 1, потому что она вычисляется как разность двух указателей, которые всегда указывают на один и тот же элемент памяти. Правильный способ вычисления размера массива a в словах — это использование функции dw, которая вычисляет размер массива в словах. В данном случае, нужно заменить строку n dw ($ - a)/2 на n dw ?, где знак вопроса означает, что размер массива a неизвестен на этапе компиляции программы.

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

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