Вычислить значение выражения - Assembler (223301)
Формулировка задачи:
Доброго времени суток!
Есть выражение вида (a+b)*2. Переменные типа байт. Значение переменных а=255, b=3.
Вопрос:Если я правильно понимаю, то результатом должно быть двойное слово, правильно ли у меня написан код?
Далее нужно будет возвести результат в третью степень, но пока я борюсь с этой частью кода..
Листинг программы
- .model small
- .data
- a db 3
- b db 255
- n db 2
- .code
- .486
- mov ax,@data
- mov ds,ax ; load data segment
- mov al,a
- cbw
- mov cx,ax; cx = a(w)
- mov al,b
- cbw
- add ax,cx; ax = a(w)+b(w) ; на этом этапе флаг переноса cf=1, af=1 , что соответствует (если я правильно понимаю) ; числу 102(16) = 258(10)
- mov al,n; al=2
- cbw
- imul si; ax= (a+b) * 2; на этом этапе cf=0, значение в ax=4, но af=1. Я никак не могу понять, где число 204(16) =
- ; 516(10)
Решение задачи: «Вычислить значение выражения»
textual
Листинг программы
- mov bx, ax ;результат умножения сохраняем в bx
- imul bx ;возводим в 3 степень, результат в dx:ax
- mov cx, dx ;сохраняем старшее слово
- imul bx ;умножаем младшее слово
- push ax ;сохраняем результат
- push dx
- mov ax,cx ;умножаем старшее слово
- imul bx
- pop cx
- add ax,cx
- adc dx,0
- mov bx,dx ;теперь результат в bx:dx:ax
- mov dx,ax
- pop ax
Объяснение кода листинга программы
- mov bx, ax — результат умножения сохраняем в bx
- imul bx — возводим в 3 степень, результат в dx:ax
- mov cx, dx — сохраняем старшее слово
- imul bx — умножаем младшее слово
- push ax — сохраняем результат
- push dx
- mov ax,cx — умножаем старшее слово
- imul bx
- pop cx
- add ax,cx — складываем с предыдущим результатом
- adc dx,0 — добавляем единицу к результату (если результат младшего слова был 0)
- mov bx,dx — теперь результат в bx:dx:ax
- mov dx,ax
- pop ax — возвращаем ax в стек для дальнейших операций
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д