Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.220.187.178] |
|
Сообщ.
#1
,
|
|
|
mov cx, 3 lea esi, a cicl1 : mov eax, [esi] test eax, eax jns m1 neg eax mov[esi], eax m1 : cmp esi, 11 jg metka1 add esi, 4 metka1 : loop cicl1 Массив задаётся в C++ (int a[3]), это вставка ассемблерная. Тут только у первого элемента берется модуль, у двух последующих остаётся минус. Подскажите что тут не так. |
Сообщ.
#2
,
|
|
|
Как минимум, ESI у вас - адрес, а потому надо сравнивать с 11 не адрес ("cmp ESI,11"), а некое количество (ECX?).
Вместо "mov EAX, [ESI]" можно использовать lodsd (и не надо будет прибавлять каждый раз "add ESI, 4"). |
Сообщ.
#3
,
|
|
|
Это 32-битный код? Тогда ECX, а не CX.
Как вариант (с lodsd): cld lea esi,a mov edi,esi mov ecx,3 again: lodsd test eax,eax jns m1 neg eax m1: stosd loop again test eax,eax jns m1 neg eax m1: можно упростить до: m1: neg eax jl m1 Добавлено Блок cmp esi, 11 jg metka1 add esi, 4 metka1: Но я бы не использовать ESI вообще (как и EDI, EBX), т.к. их нужно сохранять/восстанавливать. Лучше всего так (и коротко, и быстро): mov ecx,2 next: mov eax,[a+ecx*4] cdq xor eax,edx sub eax,edx ; эти 3 строки – abs(eax) без jcc-инструкций mov [a+ecx*4],eax dec ecx jns next |