Ассемблеровские вставки

Тема в разделе "WASM.BEGINNERS", создана пользователем Nachin, 9 окт 2009.

  1. Nachin

    Nachin New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2009
    Сообщения:
    12
    Помогите, пожалуйста разобраться.
    В лаб.работе дан пример использования ассемблеровских вставок.
    Нужно определить ее назначение. В принципе я понял, что это что-то типа сложения по модулю 2, но точно не уверен. Кто-нибудь подскажите, что точно делает этот код. Заранее огромное спасибо

    char *asmfunc(char *S, char c)
    {
    char *r = 0;

    L0:
    asm {
    mov SI,S;
    mov DL,c;
    }

    L1:
    asm {
    mov AL,0;
    add AL,[SI];
    je L3;
    xor AL,DL;
    je L2;

    add SI,1;
    jmp L1;
    }

    L2:
    asm mov r,SI;

    L3:
    return r;
    }
     
  2. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    char *strrchr(const char *string, char ch) ?
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Nachin
    Код (Text):
    1. char *asmfunc(char *S, char c)
    2. {
    3. char *r = 0;
    4.  
    5. L0:
    6. asm {  
    7.   mov SI,S;
    8.   mov DL,c;
    9. }
    10.  
    11. L1:
    12. asm {
    13.   mov AL,0;
    14.   add AL,[SI];<-- сравниваем содержимое по адресу в SI с нулём, скорее всего ищем конец строки
    15.   je L3;
    16.   xor AL,DL;<-- здесь какая-то билиберда посмотри исходный код внимательно
    17.   je L2;
    18.  
    19.   add SI,1;<-- переходим к следующему символу строки
    20.   jmp L1;
    21. }
    22.  
    23. L2:
    24. asm {mov r,SI;}<- здесь {} пропустил
    25.  
    26. L3:
    27. return r;
    28. }
     
  4. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    Код (Text):
    1. char *asmfunc(char *S, char c)<-возвращает указатель на первое вхождение символа c в строку S
    2. {
    3. char *r = 0;
    4.  
    5. L0:
    6. asm {  
    7.   mov SI,S;
    8.   mov DL,c;
    9. }
    10.  
    11. L1:
    12. asm {
    13.   mov AL,0;
    14.   add AL,[SI];<-- сравниваем текущий символ с 0
    15.   je L3; <-конец строки, символ не найден возвращаем 0
    16.   xor AL,DL;<-- сравниваем символ с искомым
    17.   je L2;<-- если равны - символ найден возвращаем указатель на него
    18.   add SI,1;<-- переходим к следующему символу строки
    19.   jmp L1; <- следующая итерация
    20. }
    21.  
    22. L2:
    23. asm {mov r,SI;}<- записываем указатель на первое вхождение символа в строке в переменную r
    24.  
    25. L3:
    26. return r;
    27. }
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    jakimushka
    я ступил, извини
     
  6. Nachin

    Nachin New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2009
    Сообщения:
    12
    это код скопирован прямо из лабы, как я понял он просто сравнивает символы?
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Nachin
    Можно так
    Код (Text):
    1. char *asmfunc(char *S, char c)
    2. {
    3. char *r = 0;
    4. asm {  
    5.   mov DI,S;
    6.   mov AL,c;
    7.   mov CX = 255;
    8.   repne scasb
    9.   jcxz L0
    10.   dec DI
    11.   mov r,DI
    12. L0:
    13. }
     
  8. Nachin

    Nachin New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2009
    Сообщения:
    12
    То же не дочитал, ищет первое вхождение символа В строку?
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Nachin
    поиск первого символа с в строке S
     
  10. Nachin

    Nachin New Member

    Публикаций:
    0
    Регистрация:
    9 окт 2009
    Сообщения:
    12
    Огромное спасибо, буду дальше разбираться с лабой. Появятся еще вопросы, буду просить у ВАс помощи )))