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

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

  1. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Подскажите пожалуйста по процедурам - когда надо делать уравнивание стека, вида

    push ebp
    mov ebp,esp
    ..тело процедуры
    leave
    ret 16 ,
    a)Когда процедура имеет параметры, которые ей передаются;
    б)Когда в ней есть локальные переменные;
    в)это не обязательно.

    Не могу разобраться уже целый день, для чего и когда делают это.
     
  2. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    в разных ситуациях по разному.Если какие либо объекты в стеке тебе отслужили и больше не нужны-надо выровнять его.Выравнивать также следует например при вызове сишных функций.бывают разные аспекты короче говоря.
     
  3. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Не компилятся ресурсы

    Не знал куда писать, но решил все-таки сюда ибо пишу rc для проги на асм.
    Проблема такая: не компилятся ресурсы. Вылетает с такой ошибкой:
    undefined keyword or key name: DS_CENTER.
    если убираю DS_CENTER, пишет что не найдет следующий идентификатор и тд.... не могу понять в чем проблема, так как я уже даже копировал код с туториалов iczelliona - то же самое(
    вот собственно исходник ресурсов:
    Code:
    #define IDC_EDIT 3000
    #define IDC_BUTTON 3001
    #define IDC_EXIT 3002
    #define IDM_GETTEXT 32000
    #define IDM_CLEAR 32001
    #define IDM_EXIT 32003
    MyDialog DIALOG 10, 10, 205, 60
    STYLE 0x0004|DS_CENTER|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU|WS_VISIBLE|WS_OVERLAPPED|DS_MODALFRAME|DS_3DLOOK
    CAPTION "Out first Dialog Box"
    CLASS "DLGCLASS"
    {
      EDITTEXT IDC_EDIT, 15, 17, 111, 13, ES_AUTOHSCROLL|ES_LEFT
      DEFPUSHBUTTON "Say hello", IDC_BUTTON, 141, 10, 52, 13
      PUSHBUTTON "Exit", IDC_EXIT, 141, 26, 52, 13, WS_GROUP
    }
    MyMenu MENU
    {
      POPUP "Test Controls"
      {
        MENUITEM "Get text", IDM_GETTEXT
        MENUITEM "Clear text", IDM_CLEAR
        MENUITEM "", 0x0800 /*MFT_SEPARATOR*/
        MENUITEM "Exit", IDM_EXIT
      }
    }
    
     
  4. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    #include "\masm32\include\resource.h"
     
  5. wildshaman

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

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    Требуется написание небольшой программы на ассемблере (поиск числа вхождений символа в строке). Бюджет до 30$

    Заполнить строку текстом ФАМИЛИЯ_ИМЯ_ОТЧЕСТВО_, длина строки должна выйти 2200 символов.
    Найти число вхождений символа "о" в данную строку и занести его в регистр ax

    Работать надо с "цепочечными командами"



    Пример оформлеия программы (пример решения задачи на нахождение вхождения символа "а" в строку):
    Code:
    MASM
    MODEL	small
    STACK	256
    .data
    fnd	db	0ah,0dh,'‘Символ найден*! ','$'
    nochar	db	0ah,0dh,'‘Символ не найден.','$'
    string	db	'Поиск символа в этой строке.',0ah,0dh,'$'
    .code
    ASSUME ds:@data,es:@data
    main:
    	mov	ax,@data
    	mov	ds,ax
    	mov	es,ax
    	mov	ah,09h
    	lea	dx,string
    	int	21h
    	mov	al,'а'
    	cld
    	lea	di,string
    	mov	cx,28
    repne	scas	string
    	je	found
    failed:
    	mov	ah,09h
    	lea	dx,nochar
    	int	21h
    	jmp	exit
    found:
    	mov	ah,09h
    	lea	dx,fnd
    	int	21h
    exit:
    	mov	ax,4c00h
    	int	21h
    end	main
    
     
  6. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Вот непойму в чем трабла.Есть код:
    Code:
    invoke lstrcat,addr get,addr ID
    invoke lstrcat,addr get,addr get1
    invoke MessageBox,0,addr get,0,0
    
    Мы спепляем с get переменную Id,дальше c get переменную get1 и получается какая то фигня.
     
  7. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    у меня два варианта:
    1)это не строки
    2)буфер слишком мал.
    но т.к. я не экстрасенс то опиши в чем проблема.
     
  8. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Все ясно.Разорался, дело в буфере.Спасибо.
    Вот еще хотел спросить.написал я 2 функциии к примеру:
    Code:
    func1 proc
    invoke MessageBox,0,0,0,0
    func endp
    func2 proc
    invoke Sleep,1000  
    func2 endp
    И после их вызова,я хочу вызвать любую функцию и не выходит.
    Code:
    call func1
    call func2
    invoke MessageBox,0,0,0,0
    
    Программа завершается после 2 моих функций.
     
    #1208 MTV, 21 Jan 2012
    Last edited: 21 Jan 2012
  9. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Вот так у меня:
    Code:
    .386
    .model Flat, StdCall
    option casemap:none
    ;######################################
    include \masm32\include\kernel32.inc
    include \masm32\include\windows.inc
    includelib \masm32\lib\user32.lib
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    ;######################################
    .code
    start:
    call func1
    
    
    
    func1 proc
    invoke MessageBox,0,0,0,0
    func1 endp
    func2 proc
    invoke Sleep,1000  
    func2 endp
    invoke ExitProcess,0
    end start
    Пробовал вот так:
    Code:
    .386
    .model Flat, StdCall
    option casemap:none
    ;######################################
    include \masm32\include\kernel32.inc
    include \masm32\include\windows.inc
    includelib \masm32\lib\user32.lib
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    ;######################################
    .code
    start:
    call func1
    
    
    invoke ExitProcess,0
    func1 proc
    invoke MessageBox,0,0,0,0
    func1 endp
    func2 proc
    invoke Sleep,1000  
    func2 endp
    end start
    
    Но в коцне ошибка...
     
  10. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    вот так все работает.
    Code:
    call func1
    call func2
    invoke MessageBox,0,0,0,0
    invoke ExitProcess,0
    соотв. функции размещаются ПОСЛЕ exitprocess
     
    1 person likes this.
  11. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Code:
    .386
    .model Flat, StdCall
    option casemap:none
    ;######################################
    include \masm32\include\kernel32.inc
    include \masm32\include\windows.inc
    includelib \masm32\lib\user32.lib
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    ;######################################
    .code
    start:
    
    call func1
    call func2
    invoke MessageBox,0,0,0,0
    invoke ExitProcess,0
    
    func1 proc
    invoke MessageBox,0,0,0,0
    func1 endp
    
    func2 proc
    invoke Sleep,1000  
    func2 endp
    
    end start
    После исполнения 2 моих функций вылетает ошибка:
    [​IMG]
     
  12. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    не знаю,у меня все работает.дебаж тогда.
     
  13. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Не могу изменить пароль пользователя. Функция возвращает какую-то ахинею error_io_pending , в мсдн в ее описании такого и близко нет. Как я понял, это значит, что функция еще не отработала свое, т.е. асинхронный ввод вывод? Или что?

    Masm
     
  14. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Есть код:
    Code:
    .data
    sendgb db 100 dup(?)
    sends db 'send ',0
    prob db ' ',0
    upload db 'asdasdasd',0
    .code
    invoke lstrcat,addr sendftp,addr sends
    invoke lstrcat,addr sendftp,addr upload
    invoke lstrcat,addr sendftp,addr prob
    invoke lstrcat,addr sendftp,addr upload
    invoke CreateFile,addr kom,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov handle,eax
    invoke WriteFile,handle,addr sendgb,sizeof sendgb,addr check,0
    invoke CloseHandle,handle
    
    В фаил записывается send asdasdasd asdasdasd и еще всякие нули...Как сделать что бы эти нули не записывались?И переменная upload всегда разная...
     
  15. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Передавать в WriteFile не размер буфера, а размер "печатаемой" информации в нем. То бишь делать lstrlen предварительно.
     
    _________________________
  16. Киев

    Киев Banned

    Joined:
    9 Aug 2011
    Messages:
    19
    Likes Received:
    8
    Reputations:
    4
    я вообще по 0 в асемблере , нужно вот это написать

    y=10 если x>5 или x=c

    y= 12 в других случаях
     
  17. Юго

    Юго Member

    Joined:
    2 Feb 2011
    Messages:
    0
    Likes Received:
    77
    Reputations:
    17
    cmp x, 5
    jbe ELSE
    cmp x, c
    jne ELSE
    mov y, 10
    jmp CONT
    ELSE: mov y, 12
    CONT: ...
     
  18. totenkopf

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

    Joined:
    19 Jul 2010
    Messages:
    92
    Likes Received:
    64
    Reputations:
    19
    2 Flisk:

    Не все так просто.

    Параметры NetUserChangePassword нужные Вам

    1. NULL
    2. имя пользователя
    3. Старый пароль
    4. Новый пароль

    ! Все параметры в UNICODE !

    Code:
    include netapi32.inc
    includelib netapi32.lib
    
    data
      login dw "t","o","o","r",0
      oldpass dw "r","o","o","t",0
      newpass dw "f","u","c","k",0   
    .code
    start:
    invoke NetUserChangePassword,NULL,addr login,addr oldpass,addr newpass
    .if eax!=NERR_Success
    	invoke MessageBoxW,0,addr newpass,0,MB_OK ;Ошибка!
    .endif
     
    #1218 totenkopf, 17 Feb 2012
    Last edited: 17 Feb 2012
  19. Киев

    Киев Banned

    Joined:
    9 Aug 2011
    Messages:
    19
    Likes Received:
    8
    Reputations:
    4
    а как *.asm превратить в шеллкод ?
     
  20. Юго

    Юго Member

    Joined:
    2 Feb 2011
    Messages:
    0
    Likes Received:
    77
    Reputations:
    17
    компельнуть в bin файл =))