Среднее арифмитическое квадратов ненулевых элементов массива - Assembler
Формулировка задачи:
ВОПРОС: как найти квадрат числа (слово) а*а=а в квадрате. Если я не ошибаюсь!
но ведь диапазон чисел (слово) = 0 - 65535
и как быть если пользователь задаст число 65535 (для чисел со знаком –32 768...+32 767; для чисел без знака 0...65 535 то как то не совсем понятно! будет ведь скорей всего складываться только остаток
MOV AL, 2 IMUL AL ; AX = 4 RET
Решение задачи: «Среднее арифмитическое квадратов ненулевых элементов массива»
textual
Листинг программы
LEA SI, dwArray MOV CX, dwDimenArray XOR BX, BX XOR DI, DI ; Array Sum = DI:BX = 0 addloop: LODSW ; AX = DS:[SI], SI = SI + 2 CMP AX, 0 JE @addloop IMUL AX ADD BX, AX ADC DI, DX ; DI:BX = DI:BX + DX:AX INC KolNotZERO @addloop: LOOP addloop ;BX=младшая часть числа ;DI=старшая часть числа MOV CX, KolNotZERO CMP CX, 0 JE OnlyZero MOV AX, DI XOR DX, DX DIV CX XCHG BX, AX DIV CX ;AX=младшая часть числа ;BX=старшая часть числа
Объяснение кода листинга программы
- Инициализация счётчика и указателя на массив: LEA SI, dwArray MOV CX, dwDimenArray
- Инициализация суммы элементов массива: XOR BX, BX XOR DI, DI
- Начальный цикл обработки элементов массива: addloop: LODSW CMP AX, 0 JE addloop
- Вычисление квадрата текущего элемента массива: IMUL AX
- Добавление квадрата к сумме: ADD BX, AX ADC DI, DX
- Увеличение счётчика элементов массива: INC KolNotZERO
- Проверка: является ли сумма элементов массива равной нулю? CMP CX, 0 JE OnlyZero
- Переменные AX и BX используются для хранения результата вычисления среднего арифметического: MOV AX, DI XOR DX, DX
- Деление суммы на количество ненулевых элементов массива: DIV CX
- Обмен младшей и старшей частей числа: XCHG BX, AX
- Деление суммы на количество ненулевых элементов массива: DIV CX
- Выход из программы: OnlyZero: ENDP