Обратите внимание на push bx
/ ... / call func
впоследствии: это рекурсивная функция, и она передает bx+2
следующему вызову.
Я думаю, что BX используется как указатель, и есть arr
, который является массивом "слов" (2 байта), так что это почти наверняка приращение указателя.
Это выглядит очень неэффективно; он только однократно рекурсивный, поэтому его очень легко записать в виде цикла. например, do { something with *p++; } while(--cx);
в C, то есть цикл с dec cx / jnz
внизу.
Кроме того, ветвление довольно глупо: оно может проверять состояние завершения рекурсии намного раньше, перед тем, как сохранить столько регистров. И это может вывести jmp
из нормального пути через функцию, используя jna done
. Возможно, в конце функции потребуется перейти к специальному блоку, поместив 2 перехода на путь особого случая, но это все же лучше, чем 2 перехода на основной путь.
Также странно хранить / перезагружать вещи в [bp+6]
. Эта функция возвращает, изменяя один из своих аргументов в стеке? Это выглядит так на основе pop dx
сразу после звонка. Я надеюсь, что это намеренно запутано или написано в качестве отправной точки для оптимизации, потому что это выглядит чрезмерно сложным.
Основываясь на именах целей ветвления, я предполагаю, что это просто нахождение максимального слова со знаком в массиве, учитывая указатель и длину. Это тривиально и намного эффективнее с циклом.