Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переворот строки 
:(
    Опции темы
klyxa
Дата 19.6.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 13.8.2006

Репутация: нет
Всего: нет



Народ, кто каким образом "переворачивает" строку. В памяти хранится всё вправа на лево.так что порой нужно. Я вот доизвращался до таково вот..=)
Код

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib            

.data
string db "covertIT",0
lenght equ $-string-1
path db "C:\\file1.txt",0

.data?
tmp db ?
flDescript dd ?
middleval dd ?


.code
 start:
 
invoke CreateFile,\
     ADDR path,\
     GENERIC_WRITE,\
     0,\
     0,\
     CREATE_ALWAYS,\
     FILE_ATTRIBUTE_HIDDEN,\
     0
    mov flDescript,eax 

   xor eax,eax
   xor ebx,ebx
   xor edx,edx
   xor ecx,ecx

      mov     eax,lenght
      mov     ebx,2          
      idiv    ebx 
      mov middleval,eax
      
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;Если кол-во символов чётное( При нечётном еще не реализовал)
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
      .IF edx == 0
         xor eax,eax
         xor ebx,ebx
         xor edx,edx
         xor ecx,ecx
         xor esi,esi
         xor edi,edi
         
         mov esi, lenght-1
         mov edi, 0
         mov ecx, middleval
       convert:
         .IF edi != middleval
    
           mov bl, byte ptr [string+edi]   ;string+edi                  
           mov al, byte ptr [string+esi]   ;string+esi

           mov byte ptr [string+edi],al
           mov byte ptr [string+esi],bl

           dec esi
           inc edi
           dec ecx         
           jmp convert
         .ELSE 
           jmp exit    
         .ENDIF     
      .ELSE 
        jmp exit          
      .ENDIF
  exit:
  invoke WriteFile,flDescript,addr string,SIZEOF string,ADDR tmp,0
  invoke ExitProcess,0
   
 end start


Мб. местами немножко кривовато..но всё таки только учимся еще..)))


Кстате. Офтопный вопрос по строкам..
Вот например у нас
Код

****
.data
str1 db "fist string",0
str2 db "second string",0
****


Мы делаем типо
Код

mov edi,kakoeto_smesenie_zalzausee_na_str2
mov byte ptr [str1+edi],al


И у нас получается,что мы затираем строку 2..ну один байт.

У мну вопрос. В языках выского уровня, там жешь типы данных, например, string, т.е. N кол-во байтов
И в памяти сразу выделяется N кол-во байтов(отталкивается от типа переменной). Всё не занятое место как бы зарезервировано, но забито нулями..омг..я ответил сам на свой вопрос? =)


PM MAIL   Вверх
W4FhLF
Дата 19.6.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



в ЯВУ для типов string память выделяется по мере надобности и по мере надобности освобождается, т.е. при каждой модификации переменной такого типа компилятор сам вставляет вызовы соответствующих пройедур, которые осуществялют проверку надобности выделения доп. памяти под строку. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
dumb
Дата 20.6.2007, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(klyxa @  19.6.2007,  18:03 Найти цитируемый пост)
Народ, кто каким образом "переворачивает" строку. 


для примера, можно как-нибудь так:
Код

.386
.model flat, stdcall
option      casemap:none

strrev      proto pStr:ptr byte
strlen      proto pStr:ptr byte

.data
    mes       db "0123456789",0
    
.code
start:
    invoke  strrev, addr mes
    ret

strrev      proc pStr:ptr byte
    mov     edx, pStr
    mov     ecx, edx
    invoke  strlen, edx
    or      eax, eax
    jz      exit
    add     ecx, eax
    dec     ecx
@@:
    mov     al, [ecx]
    xchg    al, [edx]
    mov     [ecx], al
    inc     edx
    dec     ecx
    cmp     edx, ecx
    jb      @B
exit:
    ret
strrev      endp
    
strlen      proc pStr:ptr byte
    push    edi
    push    ecx
    mov     edi, pStr
    cld
    or      ecx, -1
    xor     eax, eax
    repne   scasb
    not     ecx
    dec     ecx
    mov     eax, ecx
    pop     ecx
    pop     edi
    ret
strlen      endp
    
end start


а если хотя бы пролистать хелп от масма32, то довольно быстро обнаруживается функция revstr, которая находится в masm32.lib:
Код

.386
.model flat, stdcall
option      casemap:none
include     \masm32\include\masm32.inc
includelib  \masm32\lib\masm32.lib

.data
    mes       db "0123456789",0
.data?
    rmes      db 100 dup (?)

.code
start:
    invoke  revstr, addr mes, addr rmes
    ret
end start


Цитата(klyxa @  19.6.2007,  18:03 Найти цитируемый пост)
В памяти хранится всё вправа на лево.так что порой нужно.

строки хранятся "прямо". и вообще, что либо "крутить" необходимость возникает крайне редко.

PM MAIL   Вверх
klyxa
Дата 20.6.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 13.8.2006

Репутация: нет
Всего: нет



dumb, ты мегущь. спасиба =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0932 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.