Из данного массива создать массив квадратов элементов. В чем ошибка? - Assembler
Формулировка задачи:
программа из данного масива создает массивквадротов этих значенийвроде все правильно в цикле но значения вместо этого вообще не меняются
p/s/ не ругайте если что. я только учусь.
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
Решение задачи: «Из данного массива создать массив квадратов элементов. В чем ошибка?»
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
Объяснение кода листинга программы
В этом коде выполняется следующая последовательность действий:
- Устанавливаются сегменты данных и кода.
- Перемещаются указатели на начальный элемент массива a и на пустой массив b.
- Вычисляется размер массива a в словах.
- Начинается цикл по всем элементам массива a.
- Каждый элемент массива a умножается на себя и записывается в массив b.
- После окончания цикла в массив b записывается слово 0.
- Задается код завершения работы программы. Ошибка в этом коде заключается в вычислении размера массива a. В данном случае, переменная n вычисляется как ($ - a)/2, где $ — это конец массива a, а a — это начало массива a. То есть, переменная n будет всегда равна 1, потому что она вычисляется как разность двух указателей, которые всегда указывают на один и тот же элемент памяти. Правильный способ вычисления размера массива a в словах — это использование функции dw, которая вычисляет размер массива в словах. В данном случае, нужно заменить строку n dw ($ - a)/2 на n dw ?, где знак вопроса означает, что размер массива a неизвестен на этапе компиляции программы.