Вычислить значение выражения: (a^2+b(2c-d)^2)/3e - Assembler (223235)

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

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

Вычислить f=(a^2+b(2c-d)^2)/3e , операнды – слова, вычисления беззнаковые. Подскажите,что в этом коде нужно исправить?
.model small
.386
.stack 100h
. data
    a dw 2
    b dw 2
    c dw 4
    d dw 3
    e dw 199
    t dw 3
    x dd ?
    w dd ?
    z dw ?
.code
 begin:
         mov ax,@data
         mov ds,ax
         mov ax,e
         cmp ax,0
         jz m
         mul t
         mov bx,dx
         sal bx,16
         mov bx,ax
         mov x,ebx
         mov ax,c
         sal ax,1
         sub ax,d
         mul ax
         mov bx,dx
         sal bx,16
         mov bx,ax
         mov ax,b
         cwde
         mul ebx
         mov ebx,edx
         mov ecx,eax
         mov ax,a
         cwde
         mul eax
         adc eax,ecx
         adc edx,ebx
         div x
m: mov ax,4c00h
     int 21h
end begin

Решение задачи: «Вычислить значение выражения: (a^2+b(2c-d)^2)/3e»

textual
Листинг программы
.model small
.stack 100h
.data
    a dw 2
    b dw 2
    c dw 4
    d dw 3
    e dw 199
.code
begin:
    mov ax,@data
    mov ds,ax
    mov ax,e
    test ax,ax
    jz m
            ;умножение на 3 заменим сложение с удвоенным числом
    mov bp,ax   ;bp=ax=e
    shl ax,1    ;ax=ax*2=e*2
    add bp,ax   ;bp=ax*3=e*3
            ;найдем b(2c-d)^2
    mov ax,c    ;ax=c
    shl ax,1    ;ax=2c
    sub ax,d    ;ax=2c-d
    mul ax      ;dx:ax=(2c-d)^2
    mov bx,dx   ;сохраним множимое для умножения на b
    mov cx,ax   ;bx:cx=(2c-d)^2
            ;умножим bx:cx * b в столбик
            ;сначала умножаем младшее слово множимого на b, сохраняем, как двойное слово
            ;затем умножаем старшее слово на b, добавляем младшее слово до предыдущего старшего
            ;старшее слово игнорируем. Считаем, что числа помещаются в слово!
    mul b       ;dx:ax = cx*b
    xchg ax,cx  ;обменяем местами множимое и результат умножения младшего слова множимого на множитель
    xchg dx,bx
    mov ax,b    ;множитель
    mul dx      ;умножаем старшее слово множимого на множитель
    add bx,ax   ;добавляем младшее слово произведения к старшему слову результата
            ;старшее слово результата игнорируем, считаем, что оно = 0, т.е. результат умножения помещается в слово
            ;найдем a^2
    mov ax,a
    mul ax      ;dx:ax=a^2
    add ax,cx   ;dx:ax=a^2+(2c-d)^2
    adc dx,bx
    
    div bp      ;ax=a^2+(2c-d)^2 / 3e
    
m:  mov ax,4c00h
    int 21h
end begin

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

Код выполняет следующие действия:

  1. Устанавливает модель памяти на small.
  2. Определяет сегменты данных и кода.
  3. Инициализирует переменные a, b, c, d и e.
  4. Проверяет, равно ли значение переменной e нулю. Если да, то выполняет последовательность операций, которая заменяет умножение на сложение с удвоенным числом.
  5. Находит значение (2c-d)^2.
  6. Умножает (2c-d)^2 на b.
  7. Находит значение a^2.
  8. Находит значение выражения a^2 + (2c-d)^2.
  9. Делит значение выражения на 3e.
  10. Если значение переменной e не равно нулю, выполняет последовательность операций, которая выводит на экран сообщение 4c00h.
  11. Если значение переменной e равно нулю, выполняет последовательность операций, которая выводит на экран сообщение 4c00h.

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


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

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

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