Записать данный алгоритм на ассемблере - Assembler
Формулировка задачи:
Если a ^ 4 > b то
Если c * b = d / b то
Результат = a OR b
Иначе
Результат = max(a,b,c)/(a^2-b)
Иначе
Результат = с ^ 3 + b
только начал изучать асемблер помогите с объяснением как это записать, пожалуйста
Решение задачи: «Записать данный алгоритм на ассемблере»
textual
Листинг программы
; FASM dos com ;Если a ^ 4 > b то ;Если c * b = d / b то ;Результат = a OR b ;Иначе ;Результат = max(a,b,c)/(a^2-b) ;Иначе ;Результат = с ^ 3 + b org 100h finit ; init FPU fild dword [b] fild dword [a] fmul st0, st0 ; a^2 fmul st0, st0 ; a^4 fucomp ; a^4 > b ? fstsw ax sahf ; int 3 ja a4ltb ; a ^ 4 > b fild dword [d] fdiv st0, st1 ; st0 = d / b fxch fild dword [c] fmulp ; st0 = c * b, st1 = d / b fucompp ; c * b = d / b ? fstsw ax mov ebx, [a] mov ecx, [b] sahf jnz maxABC ;no ;Результат = a OR b or ebx, ecx mov [result], ebx ret ;Результат = max(a,b,c)/(a^2-b) maxABC: mov eax,[c] cmp ebx, eax ; a > c? cmova eax, ebx ; eax = a, if so cmp ecx, eax ; b > eax ? cmova eax, ecx ; eax = max(a,b,c) imul ebx, ebx ; ebx = a^2 sub ebx, ecx ; ebx = a^2-b xor edx, edx idiv ebx ; eax = max(a,b,c)/(a^2-b) mov [result], eax ret ; a^4 <= b ;Результат = с ^ 3 + b a4ltb: fild dword [c] fld st0 fmul st0, st0 ; c^2 fmulp ; st0 = c^3 faddp ; st0 = с ^ 3 + b fistp dword [result] ret a: dd 5 b: dd 10 c: dd 16 d: dd 7 result: dd ?
Объяснение кода листинга программы
Список элементов:
- Задача: Записать данный алгоритм на ассемблере
- Используемый язык: Assembler
- Органы управления: finit, fild, fmul, fcompp, fstsw, jnz, mov, ret, cmova, cmp, imul, sub, xor, idiv, fld, fmul, faddp, fistp, sahf, int 3
- Переменные: a, b, c, d, result
- Значения переменных: [a] = 5, [b] = 10, [c] = 16, [d] = 7, [result] = ?
- Условие: Если a ^ 4 > b то
- Условие: Если c * b = d / b то
- Условие: Результат = a OR b
- Условие: Результат = max(a,b,c)/(a^2-b)
- Условие: Результат = с ^ 3 + b
- Последовательность выполнения:
- инициализация FPU (finit)
- загрузка a в ST0 (fild dword [b])
- загрузка b в ST0 (fild dword [a])
- вычисление a^2 (fmul st0, st0)
- вычисление a^4 (fmul st0, st0)
- проверка условия a^4 > b (fucomp)
- загрузка d в ST0 (fild dword [d])
- вычисление d/b (fdiv st0, st1)
- загрузка c в ST0 (fild dword [c])
- проверка условия c * b = d/b (fucompp)
- если условие выполняется, то результат = a OR b (or ebx, ecx)
- иначе результат = max(a,b,c)/(a^2-b) (maxABC)
- вычисление max(a,b,c) (mov eax,[c], cmp ebx, eax, cmova eax, ebx, cmp ecx, eax, cmova eax, ecx, imul ebx, ebx, sub ebx, ecx, xor edx, edx, idiv ebx)
- вычисление a^2-b (imul ebx, ebx, sub ebx, ecx)
- сохранение результата (fistp dword [result])
- возврат (ret)
- Дополнительные комментарии:
- org 100h - установка точки входа в программу
- int 3 - прерывание и переход в защищенный режим
- sahf - сохранение состояния регистров класса AH
- ja a4ltb - переход к блоку кода для условия a^4 > b
- jnz maxABC - переход к блоку кода для условия c * b = d/b
- a ^ 4 > b - условие на сравнение a^4 и b
- c b = d/b - условие на сравнение c b и d/b
- a OR b - логическое ИЛИ для a и b
- max(a,b,c)/(a^2-b) - вычисление максимального значения из a, b и c и деление его на разность a^2 и b
- a^4 <= b - условие на сравнение a^4 и b
- c ^ 3 + b - вычисление значения по условию a^4 <= b
- fild, fmul, fcompp, fstsw, jnz, mov, ret, cmova, cmp, imul, sub, xor, idiv, fld, fmul, faddp, fistp - использование инструкций FPU для выполнения математических операций
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д