А почему бы просто не сравнить с нулем?
Насколько я помню ASM, есть команды проверки флагов для беззнакового сравнения (jb [Jump if Below], ja [Jump if Above]) и для знакового сравнения (jl [Jump if Less], jg [Jump if Greater])
Т.е. фрагмент может выглядеть так:
Код: Выделить всё
Cmp eax, 0
jl SF1 ; переход, если eax меньше 0
loop @loop ; возвращаемся на метку @loop
SF1:
mov byte ptr[edi],zero ; заменяем отрицательное число нулем
А если есть свободный регистр, то перед циклом его можно обнулить, и проводить сравнение не с константой 0, а с этим регистром. Кажется, это будет, типа, оптимальнее в смысле быстродействия
Код: Выделить всё
Xor edx, edx ; обнуляем регистр edx
Cmp eax, edx
jl SF1 ; переход, если eax меньше 0
loop @loop ;возвращаемся на метку @loop
SF1:
mov byte ptr[edi],zero ;заменяем отрицательное число нулем