Вычислить значение выражения: (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
Объяснение кода листинга программы
Код выполняет следующие действия:
- Устанавливает модель памяти на
small
. - Определяет сегменты данных и кода.
- Инициализирует переменные a, b, c, d и e.
- Проверяет, равно ли значение переменной e нулю. Если да, то выполняет последовательность операций, которая заменяет умножение на сложение с удвоенным числом.
- Находит значение (2c-d)^2.
- Умножает (2c-d)^2 на b.
- Находит значение a^2.
- Находит значение выражения a^2 + (2c-d)^2.
- Делит значение выражения на 3e.
- Если значение переменной e не равно нулю, выполняет последовательность операций, которая выводит на экран сообщение
4c00h
. - Если значение переменной e равно нулю, выполняет последовательность операций, которая выводит на экран сообщение
4c00h
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д