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

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

  1. maptime

    maptime New Member

    Joined:
    5 Jun 2009
    Messages:
    0
    Likes Received:
    3
    Reputations:
    0
    Как у скомпилированного файла asm сделать свою иконку , если компилирую MASM32
     
  2. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А кто тебе не дает подключить ресурс в исходник на стадии программирования?
    Или нет исхоника?
    ПОпробуй воспользоваться прогами типа Resource WorkShop который идет с Delphi или любой другой редактор ресурса. Или тебе нужно программно добавить иконку?
    Если программно то есть апишки для этого типа UpdateResource
     
  3. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    В примерах масма же есть.
    Создаешь например test.rc с текстом
    Code:
    #include "\masm32\include\resource.h"
    500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "icon.ico"
    
    Потом в консоле
    rc /v test.rc
    cvtres /machine:ix86 test.res

    и во время линковки
    link /SUBSYSTEM:WINDOWS obj_твоего_приложения.obj test.obj
     
    _________________________
  4. maptime

    maptime New Member

    Joined:
    5 Jun 2009
    Messages:
    0
    Likes Received:
    3
    Reputations:
    0
    Вот так компилирую.
    Code:
    ml /c /coff мой_код.asm 
    Link /SUBSYSTEM:WINDOWS мой_код.obj
    pause
    
    Хотелось бы добавить файл *.ico , подскажите плиз.
     
  5. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Code:
    rc /v test.rc
    ML /nologo -c -coff имя_асм_файла.asm
    link /SUBSYSTEM:WINDOWS имя_асм_файла.obj test.res /FILEALIGN:512 /VERSION:4.0 /ignore:4078 /RELEASE /BASE:0x400000
    
    Файл ресурсов test.rc - в сообщении Kaimi двумя постами выше.
     
  6. ИНЖЕНЕР_13

    ИНЖЕНЕР_13 New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    люди вчера увидел компилятор асм фасм (взял этот потому что не соображаю пока в асме ) но времени пока что увы времени учить нету, нужен код ,а вернее полностью прога.. под хп... 32.
    нужно дописать в файл текст и все. больше не чего, без окон без нечего, не паливно. надеюсь на помошь. буду благодарен вечным респектом и уважухой.
     
  7. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    CreateFile на запись
    SetFilePointer на конец файла
    WriteFile запишеш
    CloseFile закрыть
    Чувствую что ты хочеш записать строку в etc\hosts или я ошибаюсь?
     
  8. ИНЖЕНЕР_13

    ИНЖЕНЕР_13 New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    прогер пргера чувствует из далека, мысли читаете батюфка) именна, на делфе вышло 200 кб, на си 150 на паскале 150 на асме написал 4 кб..то что нужно) уже написал)
     
  9. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    на си тоже можно 4кб писать, достаточно в опциях компилятора выбрать использование RTL в DLL ключиком /MD
     
  10. ИНЖЕНЕР_13

    ИНЖЕНЕР_13 New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    А МОЖНО ПДРОБНЕЕ Что это будет и как
     
  11. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще можно на Си писать сверхмаленькие приложения. порой даже меньше асма. Там оптимизатор офегительный. Но для этого нужно отказаться от всех либ. Тока на WinAPI писать. Также компилить с оптимизацие, без отладочной инфы, и мерджить секции. Также и на фамсе правильно секции нужно располагать.
    ВОт пример - находит адрес hosts и дописывает туда запись. Размер килобайт. Хотя внутри можно еще дописать пару команд потому как много свободного места есть
    Code:
    format PE GUI 4.0
    entry Start
    
    include 'include\win32ax.inc'
    include 'include\encoding\win1251.inc'
    
    section '.code' code readable executable import writeable
    library kernel32,'KERNEL32.DLL'
    include 'include\apia\kernel32.inc'
    
    Start:
     invoke GetSystemDirectory, buf, 256
     invoke lstrcat, buf, filename
     invoke CreateFile, buf, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
     cmp eax, 0FFFFFFFFh
     je Exit
     mov [hFile], eax
     invoke SetFilePointer, eax, 0, 0, FILE_END
     invoke WriteFile, [hFile], hostip, hostip_stop - hostip, ReadBytes, 0
     invoke CloseHandle, [hFile]
     Exit:
     invoke ExitProcess, 0
    
     hostip db 13,10,"192.168.2.1 myLan",13,10
     hostip_stop:
     filename db "\drivers\etc\hosts"
    
     hFile dd ?
     ReadBytes dd ?
     buf db 256 dup (?)
    
     
    1 person likes this.
  12. ИНЖЕНЕР_13

    ИНЖЕНЕР_13 New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    в чем компилить это? си++? :confused:
     
  13. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Тот код который я дал - это FASM
     
  14. ИНЖЕНЕР_13

    ИНЖЕНЕР_13 New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Code:
     Buffer byte ?;
    GetWindowsDirectory(Buffer, Sizeof(Buffer));
    fname byte "%Buffer%\system32\drivers\etc\hosts",0  
    синтаксис ошибка....
     
  15. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    PHP:
    ...
    .
    data?
    Buffer db MAX_PATH dup(?)
    buffer2 db MAX_PATH dup(?)
    ...
    .
    data
    fname db 
    "\system32\drivers\etc\hosts",0
    param db 
    "%s%s"0
    ...
    .
    code
    ...
    invoke GetWindowsDirectoryaddr BufferMAX_PATH
    invoke wsprintf
    addr buffer2addr paramaddr Bufferaddr fname
     
     
  16. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    а нахрена получать папку винды если можно получить адрес папки system32 тем самым с экономив чуть )

    А также зачем юзать напряжкую функцию wsprintf?
    достаточно просто сделать lstrcat
     
    #596 slesh, 6 Sep 2009
    Last edited: 6 Sep 2009
  17. ИНЖЕНЕР_13

    ИНЖЕНЕР_13 New Member

    Joined:
    4 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    если честно чуть не понял, мне нужно просто директорию в переменную получить
    PHP:
               .386
            
    .model flat,stdcall
      option   casemap
    :none
                            
    include C:\masm32\INCLUDE\WINDOWS.INC
                            
    include C:\masm32\INCLUDE\KERNEL32.INC 
                            
    include C:\masm32\INCLUDE\USER32.INC
                            includelib c
    :\masm32\lib\user32.lib
                            includelib c
    :\masm32\lib\kernel32.lib
    ;###########################################################
    NOFDIG equ 30
    DSIZE equ 30
    BSIZE equ NOFDIG
    *DSIZE

    ;###########################################################
    ;----------------------------------------------------------------------------------------------
    .
    data 

    Buffer byte 
    ?;
    GetWindowsDirectory(Buffer256);
    fname byte "%Buffer%\system32\drivers\etc\hosts",0
    fhandle dword 
    ?
    cWritten dword ?
    digs byte  "127.0.0.1  localhost",0,13,10
    digs2 byte  
    "gdfsgsdfgdsg  localhost",0
    ;--------------------------------------------------------------------------------------------------
    .
    CODE  
    START
    :
    invoke CreateFile addr fnameGENERIC_WRITE0NULLOPEN_ALWAYSFILE_ATTRIBUTE_NORMAL0
    mov fhandle
    eax
    invoke SetFilePointer
    addr fhandle,0,0,FILE_END
    invoke WriteFile
    fhandleaddr digs,BSIZEADDR cWrittenNULL
    invoke WriteFile
    fhandleaddr digs2,BSIZEADDR cWrittenNULL
    invoke CloseHandle
    fhandle

    invoke ExitProcess
    0



    end START
     
    на масме.... ошибка тут Buffer byte ?;
    GetWindowsDirectory(Buffer, 256); , как подправить?_)
     
  18. Hiro Protagonist

    Joined:
    26 Aug 2009
    Messages:
    132
    Likes Received:
    24
    Reputations:
    -2
    омфг!

    ясно же было написано что и куда вставлять.

    Кароче вот подправленный исходник:

    PHP:
     .386 
            
    .model flat,stdcall 
      option   casemap
    :none 
                            
    include C:\masm32\INCLUDE\WINDOWS.INC 
                            
    include C:\masm32\INCLUDE\KERNEL32.INC  
                            
    include C:\masm32\INCLUDE\USER32.INC 
                            includelib c
    :\masm32\lib\user32.lib 
                            includelib c
    :\masm32\lib\kernel32.lib 
    ;#################################################  ########## 
    NOFDIG equ 30 
    DSIZE equ 30 
    BSIZE equ NOFDIG
    *DSIZE 

    ;#################################################  ########## 
    ;---------------------------------------------------------------------------------------------- 
    .
    data

    Buffer db MAX_PATH dup(?) 
    buffer2 db MAX_PATH dup(?) 
    fhandle dd 
    cWritten dd 


    .
    data

    fname db 
    "\system32\drivers\etc\hosts",
    param db 
    "%s%s"0
    digs db  
    "127.0.0.1  localhost",0,13,10 
    digs2 db  
    "gdfsgsdfgdsg  localhost",
    ;-------------------------------------------------------------------------------------------------- 
    .
    CODE   
    START
    :

    invoke GetWindowsDirectoryaddr BufferMAX_PATH 
    invoke wsprintf
    addr buffer2addr paramaddr Bufferaddr fname 

    invoke CreateFile 
    addr buffer2GENERIC_WRITE0NULLOPEN_ALWAYSFILE_ATTRIBUTE_NORMAL
    mov fhandle
    eax 
    invoke SetFilePointer
    addr fhandle,0,0,FILE_END 
    invoke WriteFile
    fhandleaddr digs,BSIZEADDR cWrittenNULL 
    invoke WriteFile
    fhandleaddr digs2,BSIZEADDR cWrittenNULL 
    invoke CloseHandle
    fhandle 

    invoke ExitProcess




    end START 
    Для оптимизации, как сказал Слеш можно использовать GetSystemDirectory (вместо GetWindowDirectory) и lstrcat (вместо wsprintf)
     
  19. SVAROG

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

    Joined:
    13 Feb 2007
    Messages:
    424
    Likes Received:
    86
    Reputations:
    -1
    в ольке часто вижу команды типа
    PHP:
    MOV EDX,DWORD PTR SS:[EBP-14]
    MOV EDX,DWORD - эту часть я понимаю
    а вот что такое PTR SS:[EBP-14]
    объясните плз а?
    особенно ":" эти двоеточия не понимаю :confused:
     
  20. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    это сегментные регистры (cs, ss, ds, es, gs, fs. ).SS - сегмент стека. Подробнее лучше читать у Зубкова, ибо пересказывать толковую книгу смысла нету имхо.
     
    1 person likes this.