Top.Mail.Ru
Ответы

Ассемблерная вставка с++, одномерный массив

Дали задание на ассемблер. найти максимум и все отрицательные числа поделить на нуль. Максимум находит нормально, но делит криво, всегда ответ выше десяти тысяч со знаком +. В ассемблере не сильно разбираюсь
#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, а на макс

По дате
По рейтингу
Аватар пользователя
Мыслитель
7лет

поделить на нуль ? (делить на ноль НЕЛЬЗЯ)

Аватар пользователя
Просветленный
7лет

__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
}

Аватар пользователя
Мыслитель
7лет

Я конечно оч извиняюсь, но Вам так задание и дали?
Сделать это на 32битном, интелловском ассемблере, со вставкой в Visual C++?
Потому как на g++ том же код будет СОВЕРШЕННО иным (даже если поставить флаг совместимости с MASM'ом).

Если задание именно таким образом и было дано, то лучше сваливать с этих курсов в ужасе.

Аватар пользователя
Мастер
7лет

>> все отрицательные числа поделить на нуль
Вы серьезно?