Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Переворот строки


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

.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 кол-во байтов(отталкивается от типа переменной). Всё не занятое место как бы зарезервировано, но забито нулями..омг..я ответил сам на свой вопрос? =)


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

Автор: dumb 20.6.2007, 01:57
Цитата(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 Найти цитируемый пост)
В памяти хранится всё вправа на лево.так что порой нужно.

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

Автор: klyxa 20.6.2007, 10:33
dumb, ты мегущь. спасиба =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)