Ассемблерная вставка с++, одномерный массив
Дали задание на ассемблер. найти максимум и все отрицательные числа поделить на нуль. Максимум находит нормально, но делит криво, всегда ответ выше десяти тысяч со знаком +. В ассемблере не сильно разбираюсь
#include
int main()
{
int arr[10] = { 6, 1, 0, 9, -1, 5, 1, 3, 9, 10 };
int max;
__asm
{
mov ecx, 10
lea esi, arr
mov edi, esi
xor ebx, ebx
cyr :
lodsd
cmp eax, max
jz finishh
jnl maxum
jmp finishh
maxum :
mov max,eax
finishh :
stosd
loop cyr
mov ecx, 10
lea esi, arr
mov edi, esi
xor ebx, ebx
cyrcle :
lodsd
cmp eax, ebx
jz finish
cmp eax, 0
js lessop
jmp finish
lessop :
idiv max
finish :
stosd
loop cyrcle
}
}
std::cout << "Изменённый массив: \n";
for (int i = 0; i < int(10); i++)
{
//std::cout << std::setw(3) << a[i];
std::cout << arr[i]<<std::endl;
}
std::cout <<"max="<< max;
return 0;
}
mov ecx, 10
lea esi, arr
mov edi, esi
xor ebx, ebx
cyr :
lodsd
cmp eax, max
jg maxum
jmp finishh
maxum :
mov max,eax
finishh :
stosd
loop cyr
mov ecx, 10
lea esi, arr
mov edi, esi
xor ebx, ebx
cyrcle :
lodsd
cmp eax, 0
jng lessop
jmp finish
lessop :
idiv max
finish :
stosd
loop cyrcle
немного исправил, но ничего не дало
описался, поделить не на 0, а на макс
поделить на нуль ? (делить на ноль НЕЛЬЗЯ)
__asm {
cld
mov ecx, 10
lea esi, [arr]
lea edi, [esi + 4]
mov eax, [esi]
findmax: scasd
cmovl eax, [edi - 4]
loop findmax
mov ebx, eax // ebx = макс.
mov ecx, 10
divneg: lodsd
cmp eax, 0
jge skip
cdq
idiv ebx
mov [esi - 4], eax
skip: loop divneg
}
Я конечно оч извиняюсь, но Вам так задание и дали?
Сделать это на 32битном, интелловском ассемблере, со вставкой в Visual C++?
Потому как на g++ том же код будет СОВЕРШЕННО иным (даже если поставить флаг совместимости с MASM'ом).
Если задание именно таким образом и было дано, то лучше сваливать с этих курсов в ужасе.
>> все отрицательные числа поделить на нуль
Вы серьезно?