Как перевернуть строку?

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 1 июн 2007.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Глупый заголовок, но ничего лучше не смог придумать :)
    Проблема вот в чём:
    Код (Text):
    1. push offset buffer
    2. call gethostbyname
    3. mov eax,[eax+12]
    4. mov eax,[eax]
    5. mov eax,[eax]
    в eax'e ип в таком порядке 1.0.0.127
    Собственно - как сделать так чтоб в eax'е было 127.0.0.1
    С rol'aми уже часа 2 медитирую и ничего.
    И даже bswap не помог.
    Кстати, и функции htons\htonl тоже нафик послали :)

    Помогите люди добрые и не очень :)
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. push ebx
    2. mov ebx, dword [eax]
    3. xchg ebx, dword [eax + 12]
    4. mov ebx, dword [eax + 4]
    5. xchg ebx, dword [eax + 8]
    6. pop ebx
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Код (Text):
    1. xchg al, ah
    2. rol eax, 16
    3. xchg al, ah
    вроде правильно :)
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    Код (Text):
    1. .486
    2. mov eax,0100007Fh
    3. bswap eax   ;; eax := 7F000001h
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Не один не подошёл..
    Или могету меня руки кривые?
    вот код:
    Код (Text):
    1. start proc
    2.      local buffer1[256]:byte
    3.      local buffer2[256]:byte
    4.      
    5.        sub esp,1000h
    6.        invoke WSAStartup,00000101h,esp
    7.        add esp,1000h
    8.        
    9.        invoke gethostbyname,addr buffer1
    10.        mov eax,[eax+12]
    11.        mov eax,[eax]
    12.        mov eax,[eax]
    13.  
    14.        ;< сюда ставим код переворота :)
    15.        
    16.        mov edi,eax
    17.        invoke dwtoa,edi,addr buffer2
    18.        
    19. ; ---- проверка
    20.        invoke atodw,addr buffer2
    21.        invoke htonl,eax
    22.        invoke inet_ntoa,eax
    23.        invoke MessageBox,0,eax,eax,0
    24.        invoke WSACleanup
    25.        invoke ExitProcess,0
    26. start endp
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    не совсем понимаю, что ты делаешь. Ты в buffer1 занес имя хоста перед тем, как вызывать gethostbyname? Второй момент: в eax у тебя будет сам IP. Если надо перевернуть его, тогда bswap. Скажи, какая конечная цель тебе нужна. А то может тебе вовсе и не надо такое делать. Если просто в строку перевести ИП, тогда inet_ntoa и не надо никаких дополнительных извратов
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    MSoft
    Мне нужны циферки из invoke dwtoa,edi,addr buffer2, пишу dcc отправилку, а протокол таков:

    DCC SEND file.exe 2887615812 3445 1626250
    ip port size

    Когда писал dcc принималку, из 2887615812 получал ip с помощью
    Код (Text):
    1.        invoke atodw,$CTA0("2887615812")
    2.        invoke htonl,eax
    3.        invoke inet_ntoa,eax
    Теперь вот обратная задачка, из адреса получить эти циферки :)
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    возможно предложу более извращенный вариант, но почему бы не использовать wsprintf?
     
  9. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Для извращенцев, вот функция, разворачивающая строчку любой длины )))))
    Авось кому-то пригодится...

    Код (Text):
    1. StrRev proc lpstr1:DWORD
    2.     mov edi, lpstr1
    3.     mov esi,edi
    4. Len:
    5.     inc esi
    6.     cmp byte ptr [esi+1],0
    7.     jnz Len
    8.    
    9. Rev:
    10.     mov ah, byte ptr [esi]
    11.     mov al, byte ptr [edi]
    12.     mov byte ptr [esi],al
    13.     mov byte ptr [edi],ah
    14.     dec esi
    15.     inc edi
    16.     cmp esi,edi
    17.     jg Rev
    18.    
    19.     ret
    20. StrRev endp
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    strrev из libc не рулит? :lol:

    Вот мой код переворота строки тогда уж\=

    Код (Text):
    1.    ; переворот строки
    2.    ; edi - начало буфера
    3.    ; edx - число символов
    4.   _r:              ; цикл реверса буфера
    5.    mov  al, byte [edi+ecx-1]     ; загружаем левый байт
    6.    mov  esi, edx
    7.    sub  esi, ecx
    8.    mov  ah, byte [edi+esi]   ; загружаем правый байт
    9.  
    10.    cmp  ecx, esi         ; хватит?
    11.    jna _qq
    12.  
    13.    mov  byte [edi+ecx-1], ah     ; меняем местами
    14.    mov  byte [edi+esi], al
    15.  
    16.    loop _r
    17.   _qq:
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Теперь другая более глупая проблемка...
    После полтора часа перебора комбинаций rol'ов, всё-таки нашёл нужную.
    Конечно для более быстроты и наглядности перебора я вместо ипа задавал 1.2.3.4
    Но когда поставил реальный ип, опять левые циферки появились :dntknw:
    Код (Text):
    1. start proc
    2.      local buffer2[256]:byte
    3.        invoke inet_addr,$CTA0("1.2.3.4")
    4.        
    5.        rol ax,16
    6.        rol eax,8
    7.        xchg al,ah
    8.        rol eax,16
    9.        rol ax,16
    10.        xchg al,ah
    11.        rol eax,8
    12.        
    13.        mov edi,eax
    14.        invoke dwtoa,edi,addr buffer2
    15.        
    16. ; ---- проверка
    17.        invoke atodw,addr buffer2
    18.        invoke htonl,eax
    19.        invoke inet_ntoa,eax
    20.        invoke MessageBox,0,eax,eax,0
    21.        invoke ExitProcess,0
    22. start endp
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Например, возьмем адрес 1.2.3.4
    eax = 0102 0304

    меняем местами байты в младшем слове: xchg ah, al
    eax = 0102 0403

    меняем местами младшее и старшее слово: rol eax, 16
    eax = 0403 0102

    меняем местами байты в младшем слове: xchg ah, al
    eax = 0403 0201

    или юзай bswap

    -----
    В твоем коде rol ax,16 ничего не делает.
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Flasher
    где именно появились левые циферки? ты под отладчиком это дело гонял? или просто запустил, а messagebox'е увидел левые циферки? возьми отладчик и в нем по шагам посмотри, где и что выводится не так!