Хелпикс

Главная

Контакты

Случайная статья





(LOad String Byte/Word/Double word operands)



(LOad String Byte/Word/Double word operands)

Загрузка строки байтов/слов/двойных слов

 

Схема команды: lods источник lodsb lodsw lodsd

Назначение: загрузка элемента из последовательности (цепочки) в регистр-аккумулятор al/ax/eax.


Алгоритм работы:

  • загрузить элемент из ячейки памяти, адресуемой парой ds: esi/si, в регистр al/ax/eax. Размер элемента определяется неявно (для команды lods) или явно в соответствии с применяемой командой (для команд lodsb, lodsw, lodsd);
  • изменить значение регистра si на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:
    • df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
    • df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.

Примеры программ

int equal_str(char *string1, char *string2)

{

int r;

int len1, len2;

len1=strlen(string1);

len2=strlen(string2);

if(len1==len2)

asm volatile (

             " movl %[str1], %%esi\n" //str1 -> esi

             " movl %[str2], %%edi\n" //str2 -> edi

             " movl %[len], %%ecx\n" //len -> ecx

             " rep cmpsb\n" //повторяем сравнение строк с уменьшением значения ecx

             " jz yes\n" //результат в zf. Если в zf=0 (то есть все элементы оказались равны)

             " movl $0, %%eax\n"

             " jmp exit\n"

             " yes: \n"

             " movl $1, %%eax \n"

             " exit: \n"

             " movl %%eax, %[res]\n"

            : [res]" =a" (r)

            : [str1]" S" (string1), [str2]" D" (string2), [len]" c" (len1)

           );

else r=0;

return r;

}

void copy_str( char* dst, char *src, int count)

{

asm (" cld\n"

    " rep movsb\n"

  : /*входные операнды отсутствуют*/

  : " S" (src), " D" (dst), " c" (count));

cout< < dst< < endl;

}



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.