Ассемблер

Тема в разделе "WASM.BEGINNERS", создана пользователем Mark, 8 мар 2012.

  1. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    Наконец-то. Потихоньку добрался до ассемблера. Компилирую на masm. Хотел спросить.
    Есть что-нибудь "более низкоуровневое" чем этот код? И еще. Этот код написан на чистом ассемблере (естественно с WinAPI)? И еще. Можно ли сделать прогу, которая будет запускаться непосредственно ВМЕСТО винды? Т.е с загрузочного девайса, а не из винды.


    Код (Text):
    1. .686
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    6.  
    7. include \masm32\include\windows.inc
    8. include \masm32\include\user32.inc
    9. include \masm32\include\kernel32.inc
    10. includelib \masm32\lib\user32.lib
    11. includelib \masm32\lib\kernel32.lib
    12. .data
    13. ClassName db "Windlass",0
    14. AppName  db "Win API",0
    15. OurText  db "LooooooL!",0
    16. .data?
    17. hInstance HINSTANCE ?
    18. CommandLine LPSTR ?
    19. .code
    20. start:
    21.     invoke GetModuleHandle, NULL
    22.     mov    hInstance,eax
    23.  
    24.     invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    25.     invoke ExitProcess,eax
    26.  
    27. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    28.     LOCAL wc:WNDCLASSEX
    29.     LOCAL msg:MSG
    30.     LOCAL hwnd:HWND
    31.     mov   wc.cbSize,SIZEOF WNDCLASSEX
    32.     mov   wc.style, CS_HREDRAW or CS_VREDRAW
    33.     mov   wc.lpfnWndProc, OFFSET WndProc
    34.     mov   wc.cbClsExtra,NULL
    35.     mov   wc.cbWndExtra,NULL
    36.     push  hInst
    37.     pop   wc.hInstance
    38.     mov   wc.hbrBackground, (28)
    39.     mov   wc.lpszMenuName,NULL
    40.     mov   wc.lpszClassName,OFFSET ClassName
    41.     invoke LoadIcon,NULL,IDI_APPLICATION
    42.     mov   wc.hIcon,eax
    43.     mov   wc.hIconSm,0
    44.     invoke LoadCursor,NULL,IDC_ARROW
    45.     mov   wc.hCursor,eax
    46.     invoke RegisterClassEx, addr wc
    47.     INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
    48.            WS_SYSMENU,150,\
    49.            150,600,500,NULL,NULL,\
    50.            hInst,NULL
    51.     mov   hwnd,eax
    52.     INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
    53.     INVOKE UpdateWindow, hwnd
    54.     .WHILE TRUE
    55.                 INVOKE GetMessage, ADDR msg,NULL,0,0
    56.                 .BREAK .IF (!eax)
    57.                 INVOKE TranslateMessage, ADDR msg
    58.                 INVOKE DispatchMessage, ADDR msg
    59.     .ENDW
    60.     mov     eax,msg.wParam
    61.     ret
    62. WinMain endp
    63.  
    64. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    65.     LOCAL hdc:HDC
    66.     LOCAL ps:PAINTSTRUCT
    67.     LOCAL rect:RECT
    68.  
    69.     .IF uMsg==WM_DESTROY
    70.         invoke PostQuitMessage,NULL
    71.  
    72.     .ELSEIF uMsg==WM_PAINT
    73.         invoke BeginPaint,hWnd, ADDR ps
    74.         mov    hdc,eax
    75.         invoke GetClientRect,hWnd, ADDR rect
    76.         invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
    77.         invoke EndPaint,hWnd, ADDR ps
    78.     .ELSE
    79.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    80.         ret
    81.     .ENDIF
    82.     xor    eax,eax
    83.     ret
    84. WndProc endp
    85. end start
     
  2. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    1. Машинные коды
    2. Ассемблер как ассемблер
    3. Можно
     
  3. Mark

    Mark Марк

    Публикаций:
    0
    Регистрация:
    15 сен 2011
    Сообщения:
    304
    K10

    1. А на машинных кодах писать можно?
    2. А на ассемблере? И расширение какое? .com?
     
  4. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Есть микрокод процессора. Каждая инструкция описывается набором ещё более элементарных и низкоуровневых инструкций. Но ты их ассемблером описать не сможешь - они юзаются только внутри процессора.

    Ассемблер - условный язык процессора, фактически, условность, какое число каким словом называть, если взять за данное то, что это число будет интерпретировано как команда для какого-то элементарного действия. А ты скинул код для компилятора masm, который переведёт свои синтаксические условности в бинарник для windows; сами инструкции будут переведены именно в то, что они должны обозначать согласно условности ассемблера (в числа, т.е.). Но у тебя там и других синтаксических конструкций ведь полно (макросы .IF, директивы инклуда и т.п). Ты об этом спрашивал ... ?

    Собственно, открой hex-редактор и впиши в нужное место в бинарнике значения, которые будут интерпретироваться процессором как инструкции. Тогда это уже по-другому и не назовешь, наверное.

    Слишком общий вопрос у тебя, в общем случае надо просто сделать загрузочный образ, засунуть его куда-либо, откуда он будет читаться при загрузке и протестить на каком-нибудь qemu. И лежать это должно не в файле, есть такие вещи, как загрузочные сектора и т.д.
     
  5. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    не нужно
    2. тоже не нужно
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Mark
    Скачай emu8086, с ним идут примеры загрузчика ос на чистом асме.
     
  7. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Mark
    Чистый код это нэйтив - родной для ядра интерфейс. Виньапи это толстый код, надстройка.
     
  8. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    Malfoy
    ntdll.dll ?
     
  9. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    MMIX
    Не обязательно.
     
  10. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    MMIX
    нет, системные вызовы.
    только этот подход мало годится для серьезного софта, т.к. эти интерфейсы не гарантируют совместимость с последующими версиями/билдами/апдейтами.
     
  11. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    K10
    Гарантирует, это не обязательно непосредственно сисколы. Есть есчо IOCTL, LPC и прочие механизмы. Просто для их юзания не достаточно импорта. Эта графы и прочая матчасть.
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Mark, нет, твой код изобилует макросами, которые разворачиваются в последовательности инструкций - всякие там .if, invoke и прочая стандартная дребедень

    чистый ассемблер это только мнемоники инструкций,
    писать на чистом асме - можно, но утомительно - переписывать тыщу раз одни и теже банальные последовательности поэтому их упаковали в макросы
    иногда бывает необходимо собрать инструкцию побитово описывая каждый байт - юзают директиву db в коде


    можешь написать прогу которая запишет часть себя (какуюнить подпрограмму) в загрузрчный сектор какого нить устройства - попытка загрузиться с него приведет к запуску твоей подпрограммы - для этого она должна быть достаточно автономной(как правило код для реального режима процессора)
     
  13. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    Malfoy
    K10

    Понял.

    Mark
    маш код не тру, труЪ -- это перемычкай как в морзянке 0 и 1 ...
     
  14. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Микрокодни нтдлльца!
     
  15. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    MMIX, TrashGen
    Ну вот, и тут покакали)