Сборка - перебирать строки, используя rep - PullRequest
0 голосов
/ 10 марта 2012

Я прочитал книгу о сборке, и она имеет следующий код:

.DATA
    string1 db ’abcdfghi’,0
    strLen EQU $ - string1
    string2 db ’abcdefgh’,0
.CODE

.STARTUP
    mov AX,DS ; set up ES
    mov ES,AX ; to the data segment
    mov ECX,strLen
    mov ESI,string1
    mov EDI,string2
    cld ; forward direction
    repe cmpsb
leaves ESI pointing to g in string1 and EDI to f in string2. Therefore, adding
    dec ESI
    dec EDI
leaves ESI and EDI pointing to the last character that differs. Then we can use,  
ja str1Above

Написано, что нам нужно:

 dec ESI
 dec EDI

, потому что leaves ESI pointing to g in string1 and EDI to f in string2.

Но почему?Когда мы приходим к 'f' в ESI и к 'e' в EDI, условие repe не выполняется, и для этого мы должны выйти из цикла, где 'f' находится в ESI, и«е» в EDI.Почему говорят, что мы продолжаем сканировать строки еще раз?

Ответы [ 2 ]

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

Так работает повтор:

  1. ecx = 0 или Zeroflag = 0 -> out
  2. dec ecx
  3. do command
  4. увеличить (или уменьшить) esi и edi.
  5. вернуться к 1.

Таким образом, esi и edi указывают на адрес + 1 (или - 1 в случае обратного направления).

0 голосов
/ 10 марта 2012

Если флаг направления DF сброшен в регистре EFLAGS, ESI и EDI увеличиваются после , сравнение выходит .Таким образом, инструкции dec компенсируют это.Я думаю.* Строковые инструкции rep являются чем-то вроде похмелья со времен 8086 «CISC» дней.

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