Сборка - подчиненная инструкция в конце цикла - PullRequest
1 голос
/ 08 марта 2012

Я прочитал книгу о сборке, в которой есть следующий код.Код скомбинирует (лексически) два массива (значение int) и возвращает 1, если первый больше, 0, если он равен, или -1 в противном случае:

Comprator:
  push ebp
  mov ebp, esp
  mov esi, [ebp+8] ; first - A
  mov edi, [ebp+12] ;Second - B
  mov ecx, [ebp+16]
  comp esi,edi,ecx
  jl less
  je equal
  mov eax, 1
  jmp end
equal:
   mov eax,0
   jmp end
less:
   mov eax, -1
   jmp end
end:
   pop ebp
   ret

%macro comp 3
    mov ecx, %3
%%l:
    mov eax,[%1]
    mov ebx,[%2]
    cmp eax,ebx
    jne %%done
    add %1, 4
    add %2, 4
    loop %%l
    sub eax,eax
%%done:
%endmacro

Я не понимаю, зачем нужна строка: sub eax,eax.Если бы у нас было два одинаковых массива, то в последнем сравнении мы получили бы, например, cmp 3,3 - тогда мы выйдем из цикла, а для линии je equal - он вернет true и переместится в конец.

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Это установить флаг Z, чтобы je equal после макроса узнало, что два массива были равны. Флаг Z будет установлен или сброшен с помощью cmp eax, ebx, и если он будет очищен в этот момент, управление перейдет на done - к сожалению, сразу после этого он выполнит пару add с, что (вероятно, ) сбросьте флаг Z еще раз, поэтому sub eax, eax необходим для его повторной установки для условных переходов после макроса.

Реальный вопрос заключается в том, зачем вам нужен mov eax, 0 на equal: - и ответ таков: вам это не нужно. Наряду с установкой флага Z, sub eax, eax также устанавливает значение eax на 0, которое может / может быть возвращено напрямую. Даже если вы по какой-то причине решили повторно загрузить значение 0, вам, вероятно, захочется использовать для этого sub eax, eax (или xor eax, eax) (код немного меньше и, по крайней мере, на некоторых процессорах, быстрее, чем хорошо).

Редактировать: Я должен добавить, что, по крайней мере, на мой взгляд, это довольно плохое использование макроса. По крайней мере, должны быть некоторые комментарии, чтобы указать интерфейс макроса, который, вероятно, ответил бы на вопрос до того, как его спросили.

1 голос
/ 08 марта 2012

Результат функции возвращается в регистр EAX.Финальный sub eax, eax устанавливает значение EAX на ноль перед возвратом, когда массивы точно соответствуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...