[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    1 раз юзаю ассемблер))

    у меня была функция которая ксорит строчку по 1 букве.
    это была она.
    PHP:
    function encrypt(str:pcharlen,key:integer):pchar;
    var 
    i:integer;
      
    begin
        
    for i:=0 to len do
          
    begin
            str
    [i]:=Chr(Ord(str[i]) xor key);
          
    end;
        
    result:=str;
      
    end;
    а это я пытался ее переписать на асме:
    PHP:
    function encrypt(str:pcharlen,key:integer):pchar;assembler;
      
    asm
      mov ecx
    ,0
      
    @loop:
      
    mov eax,str[ecx]
      xor 
    eax,key
      mov str
    [ecx],eax
      inc ecx
      cmp ecx
    ,len
      jne 
    @loop
      
      end
    ;
    у меня вопрос - что не правильно?) я понимаю, что все, но можно конкретные ошибки выделить тут?

    //Delphi
     
  2. BlackSun

    BlackSun Banned

    Joined:
    1 Apr 2007
    Messages:
    989
    Likes Received:
    1,168
    Reputations:
    446
    Че за .. ?)))

    Чтобы прохорить байт:
    mov eax, offset
    xor byte ptr [eax], you_key
     
    1 person likes this.
  3. zl0y

    zl0y Banned

    Joined:
    13 Sep 2006
    Messages:
    371
    Likes Received:
    270
    Reputations:
    109
    procedure encrypt(str:pchar; len:integer;key:byte);
    asm
    pushad
    mov ebx,str
    mov ecx,len
    mov eax,key
    @cycle:
    xor byte[ebx],al
    inc eax
    loop @cycle
    popad
    end;
     
    1 person likes this.
  4. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    По-моему, там какая-то ботва была передаваемыми параметрами... В делфе не помню, но в BP7.0 точно надо было пиать
    типа так:
    Code:
    function ttt(a, b:integer);
    var
      a1, b1: integer;
    begin
      a1 := a;
      b1 := b;
      //а в асме уже с а1 и б1 работать...
    
     
  5. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Надо знать почему и как что возникает, попробуй скомпилировать пример своего кода:

    Code:
     function encrypt(str:pchar; len,key:integer):pchar;assembler; 
      asm 
      mov ecx,0 
      @loop: 
      mov eax,str[ecx] 
      xor eax,key 
      mov str[ecx],eax 
      inc ecx 
      cmp ecx,len 
      jne @loop 
       
      end; 
    
    И потрасировать код посмотрев на значения регистров, отладка поможет тебе определить, что правильно, что нет, используй её в будущем, и когда ты научишся грамотно использовать отладчик, и работать в нем, ты сможешь находить ответы на вопросы, а также более серьезные вещи отлаживать.
    Научись использовать отладчик. например: дельта-смещение, ну это уже вирусы...

    А под ДОС (имхо) надо программировать, и отладчик поюзать типа TASM+TD, хорошо развивает, на примере: Калашникова - уроков 10-12 и все.
     
    #325 0verbreaK, 8 Jun 2008
    Last edited: 8 Jun 2008
    1 person likes this.
  6. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а дельта-то тут причём??
     
  7. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Я кусок сообщения удалил, а это оставил.

    PS. По твоему для дельты не нужен отладчик? Я имел ввиду, что для всего оссобенно для работы со стеком нужно использовать отладчик.


    Code:
    start:
              Call    _Delta
              
    _Delta:
              sub dword ptr [esp], offset _Delta  
    
     
  8. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    mov ah,09h
    mov dx,mesag
    int 21h
    mov ah,07h
    int 21h
    mov ah,4ch
    int 21h
    int 20h

    mesag db 'OMG$'

    Мне выводит
    ♦V☺4♦4♦☺☺☺ ☻***************H♣ц*Т♣¶ ↑ Т♣**** ♣ ═!╦
    ┤ ║◄ ═!┤═!┤L═!═ OMG
    где ошибка?
     
  9. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    lea dx,mesag


    mesag db 'OMG$',0
     
    4 people like this.
  10. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    или mov dx, offset mesag :)
     
    1 person likes this.
  11. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    2 zo1b
    угу! 8)))
     
  12. Ded MustD!e

    Ded MustD!e Banned

    Joined:
    23 Aug 2007
    Messages:
    392
    Likes Received:
    694
    Reputations:
    405
    Объясните мне плиз, что делает этот кусок кода посредине программы на паскале)

    Чем подробнее, тем лучше, желательно каждую строчку)

    PHP:
    Procedure Rotate(D:integer; Var X,Y:integer);
    Var 
    C,S:integer;
        
    X1,Y1:longint;
    begin
      
    if ((X=0) and (Y=0)) or (D=0then exit;
      
    asm
        mov  AX
    ,D
        mov  BX
    ,360
        
    xor  CX,CX
    @m1:sub  AX,BX
        cmp  AX
    ,CX
        jnl  
    @m1
    @m2:add  AX,BX
        cmp  AX
    ,CX
        jl   
    @m2
        mov  BX
    ,90
    @m3:cmp  AX,BX
        jl   
    @m4
        sub  AX
    ,BX
        inc  CX
        jmp  
    @m3
    @m4:sub  BX,AX
        shl  AX
    ,1
        shl  BX
    ,1
        Test CL
    ,1
        jz   
    @m5
        xchg AX
    ,BX
    @m5:mov  SI,AX
        mov  AX
    ,word PTR TableCos[SI]
        
    mov  C,AX
        mov  AX
    ,word PTR TableCos[BX]
        
    mov  S,AX
        cmp  CL
    ,1
        jl   
    @ex
        jg   
    @m6
    @m7:neg  C
        jmp  
    @ex
    @m6:neg  S
        cmp  CL
    ,3
        jl   
    @m7
    @ex:end;
      
    X1:=longint(X);
      
    Y1:=longint(Y);
      
    X:=(X1*C-Y1*Sshr 14;
      
    Y:=(X1*S+Y1*Cshr 14;
    end;
     
  13. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    табличное определение синуса и косинуса, делается вместо вычисления ,для уменьшения количества тактов процессора для данных процедур....

    угол дается в градусах... вычитая по 360 нормируем до индекса
    Code:
        mov  AX,D  ;угол в D
        mov  BX,360
        xor  CX,CX  ;обнуление
    @m1:sub  AX,BX
        cmp  AX,CX
        jnl  @m1 
    
    в итоге в ax значение не превышающее 360 градусов
    операция не искажающая значения синуса и косинуса

    далее начинаю вычитать квадранты, видимо таблица содержит не все 360 градусов
    Code:
        mov  BX,90
    @m3:cmp  AX,BX
        jl   @m4
        sub  AX,BX
        inc  CX
        jmp  @m3 
    
    в cx счетчик квадрантов
    ... далее получение индексов для таблицы и взятие значений.

    ... само взятие и запоминание в переменных
    Code:
        mov  AX,word PTR TableCos[SI]
        mov  C,AX
        mov  AX,word PTR TableCos[BX]
        mov  S,AX 
     
    #333 Delimiter, 15 Jun 2008
    Last edited: 15 Jun 2008
    3 people like this.
  14. Ded MustD!e

    Ded MustD!e Banned

    Joined:
    23 Aug 2007
    Messages:
    392
    Likes Received:
    694
    Reputations:
    405
    поясни пожалуйста строчку "вычитая по 360 нормируем до индекса", и что такое квадранты?
     
  15. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    ну к примеру 760 градусов .... вначале вычитаю
    400=760-360
    операция не изменяет значение синусов и косинусов
    -40=400-360
    а вот угол -40 уже устраивает нас

    квадрант - это область получающаяся при делении плоскости прямыми X и Y.... их 4-ре штуки

    в угловом эквиваленте квадрант = 90 градусов

    ... суть сводится к тому что таблица одна .... а используется так же и для получения синуов на правилах тригонометрии


    /// если предстоит защита то посмотри матрицу поворота в инете полно описаний
     
    #335 Delimiter, 15 Jun 2008
    Last edited: 15 Jun 2008
  16. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    mov dx,stroka+100h ;fasm не знает что такое lea/offset
    xor bx,bx
    mov ah,09h
    int 21h ;нормально выводит строку
    xor ax,ax

    mov cx,5 ;первые 5 букв
    mov si,stroka+100h

    @cy:lodsb ;буква из stroka -> аккумулятор
    mov [string+100h],al ; тут он пытается записать букву из stroka в string
    loop @cy

    xor ax,ax
    mov dx,string+100h
    mov ah,09h
    int 21h ;тут он выводит бред
    int 20h

    stroka db 'aldaskjfahslkdjahlsjdh',13,10,'$',0
    string db 80 DUP(?)

    Программа должна вывести сначал переменную stroka, она ее выводит, а затем должна перегнать ее в переменную string и вывести, но похоже прогша ее тупо не записывает в string.
    Возможно ли через stosb?

    //fasm

    получилось так:

    mov cx,5
    mov si,stroka+100h
    mov di,string+100h

    @cy:lodsb
    stosb
    loop @cy

    ...................

    string db '0000000000000000000000',13,10,'$',0

    вопрос: как правильно будет через string dup (?)
     
    #336 ntldr, 15 Jun 2008
    Last edited: 15 Jun 2008
  17. FoX's

    FoX's Дохлый

    Joined:
    26 Dec 2004
    Messages:
    169
    Likes Received:
    29
    Reputations:
    0
    исп. movsb
     
  18. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Очевидно, что на stroka надо передать смещение в

    Code:
    mov dx,string+100h
    
    из руководства по fasm

    Code:
    lea dx,[bx+si+1] ; load effective address to dx
    
    ntldr в официальном мануале все функции описаны, очевидно
    проблема в не понимании именно синтаксиса фасма.

    руководство на русском
    http://www.wasm.ru/baixado.php?mode=doc&id=133
     
    2 people like this.
  19. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    Почему-то не отправляет пакет
    должен по идее отправлять на 127.0.0.1:80
    и еще ответ принимать

    format PE GUI 4.0
    entry start

    include 'INCLUDE\win32ax.inc'

    section '.data' data readable writeable
    sock dd ?
    wsa WSADATA ;
    sin sockaddr_in ;
    hinstance dd ?
    http db '127.0.0.1',0
    buf_sz =100h
    buf rb buf_sz
    ht db 'luboi paketeng',13,10,13,10,0

    section '.code' code readable executable
    start:
    invoke MessageBoxA,0,'asd','asd',0
    invoke WSAStartup,101h,wsa
    cmp eax,0
    jne @exit
    mov [sock],eax
    invoke inet_addr,http
    mov [sin.sin_addr],eax
    mov [sin.sin_family],AF_INET
    invoke htons,80
    mov [sin.sin_port],ax
    invoke connect,[sock],sin,10h
    test eax,eax
    jz @exit

    invoke send,[sock],ht,26,0
    invoke recv,[sock],buf,buf_sz,0
    repnz

    invoke MessageBoxA,0,'yghjk',buf,0
    @exit:
    invoke ExitProcess,0


    section '.idata' import data readable writeable
    library user32,'USER32.DLL',kernel32,'KERNEL32.DLL',wsock,'WS2_32.DLL'

    import user32,MessageBoxA,'MessageBoxA'

    import kernel32,ExitProcess,'ExitProcess'

    import wsock,WSAStartup,'WSAStartup',socket,'socket',recv,'recv',connect,'connect',send,'send',inet_addr,'inet_addr',htons,'htons'
     
  20. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    А где ты создаешь сокет

    Code:
    SOCKET socket (
    
        int af,	
        int type,	
        int protocol	
       );	
     
    

    Code:
    
    invoke socket, AF_INET, SOCK_STREAM, 0
    .if eax == INVALID_SOCKET
        invoke MessageBox 0, 'Could not create socket', 'Error', MB_ICONWARNING
        mov eax, INVALID_SOCKET ; return error
        ret
    .endif
    mov [sock], eax
    


    import user32,MessageBoxA,'MessageBox'
     
    #340 0verbreaK, 30 Jun 2008
    Last edited: 30 Jun 2008