Функция с ассемблерной вставкой выдает неправильное значение - Assembler
Формулировка задачи:
а=1, b=5
Должно выдавать 90, но выдает 216
// сама функция
Есть сомнения по поводу корректности записи в последний аргумент.
bool LeftExpr(int a, int b, long *result) { __asm{ //(a + b) ^ 3 - a ^ 3 - b ^ 3 mov eax, [ebp + 8] mov ebx, [ebp + 12] mov ecx, eax//ecx=a add ecx, ebx//ecx=a+b mov eax, ecx//eax=a+b imul ecx//eax=(a+b)^2 jo ERROR imul ecx//eax=(a+b)^3 jo ERROR mov ecx, eax//ecx=(a+b)^3 mov eax, [ebp + 8]//eax=a mov edx, eax//edx=a imul edx//eax=a^2 jo ERROR imul edx//eax=a^3 jo ERROR sub ecx, eax//ecx=(a+b)^3-a^3 mov eax, [ebp + 12]//eax=b mov edx, eax//edx=b imul edx//eax=b^2 jo ERROR imul edx//eax=b^3 jo ERROR sub ecx, eax//(a+b)^3-a^3-b^3 mov eax, [ebp + 16] mov [eax], ecx mov al, 0 jmp EXIT ERROR : mov al, 1 EXIT : } }
Решение задачи: «Функция с ассемблерной вставкой выдает неправильное значение»
textual
Листинг программы
// Watcom C bool LeftExpr(int a, int b, long *result) { __asm{ //(a + b) ^ 3 - a ^ 3 - b ^ 3 mov eax, a add eax, b mov ecx, eax //ecx=a+b imul eax,ecx imul eax,ecx // eax = (a+b)^3 jo done mov ebx, a imul ebx, ebx imul ebx, a // ebx = a^3 jo done mov ecx, b imul ecx, ecx imul ecx, b // ecx = b^3 jo done sub eax, ebx sub eax, ecx mov ebx, result mov [ebx], eax done: mov eax, 0 seto al } };
Объяснение кода листинга программы
Вот список действий, которые выполняются в этом коде:
- Переменная
a
сохраняется в регистре EAX. - Переменная
b
сохраняется в регистре EBX. - Результат выражения (a + b) сохраняется в регистре ECX.
- Результат возведения в куб (a + b) сохраняется в регистре EAX.
- Если результат возведения в куб (a + b) больше или равен 255, то выполняется переход к метке
done
. - Результат возведения в куб переменной
a
сохраняется в регистре EBX. - Если результат возведения в куб переменной
a
больше или равен 255, то выполняется переход к меткеdone
. - Результат возведения в куб переменной
b
сохраняется в регистре ECX. - Если результат возведения в куб переменной
b
больше или равен 255, то выполняется переход к меткеdone
. - Результат выражения (a + b) уменьшается на результат возведения в куб переменной
a
. - Результат выражения (a + b) уменьшается на результат возведения в куб переменной
b
. - Результат сохраняется в памяти по адресу, указанному в переменной
result
. - Результат очищается до нуля.
- Код возвращает управление в вызывающую программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д