Хелпикс

Главная

Контакты

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





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 При использовании или копировании материалов прямая ссылка на сайт обязательна.