Возникли проблемы с пониманием cmpsb в следующем примере - PullRequest
1 голос
/ 26 мая 2019

Я следую учебному пособию по операционным системам и наткнулся на следующий блочный код, который проверяет имена файлов на диске по моей переменной «ImageName».

Моя путаница возникает из строки push di перед rep cmpsb.

    mov       cx, WORD [bpbRootEntries]
    mov       di, 0x0200
.LOOP:
    push      cx
    mov       cx, 0x000B
    mov       si, ImageName
    push      di
    rep  cmpsb
    pop       di
    je        LOAD_FAT
    pop       cx
    add       di, 0x0020
    loop      .LOOP
    jmp       FAILURE

Документация, которую я нашел для cmpsb состояний "Для устаревшего режима сравните байт по адресу DS: (E) SI с байтом по адресу ES: (E) DI. Флаги состояния установленысоответственно."Разве нажатие di перед этим вызовом не означает, что я всегда сравниваю пустое значение?Код работает, поэтому я явно что-то неправильно понимаю, но каждый фрагмент документации, который я могу найти, подразумевает, что этот код не должен работать.

1 Ответ

5 голосов
/ 26 мая 2019

Инструкция rep cmpsb оставит di указанным после места, где две строки различаются.Так как этот код не заботится об этой позиции (только если две строки совпадают), мы выбрасываем, где лежит разница, и просто проверяем флаг Z, чтобы увидеть, соответствуем ли мы.Если мы не совпадаем, мы продвигаемся на di достаточно далеко, чтобы перейти к следующему имени файла, которое является константой, поскольку мы сбрасываем di туда, откуда мы начали.

...