Наконец-то. Потихоньку добрался до ассемблера. Компилирую на masm. Хотел спросить. Есть что-нибудь "более низкоуровневое" чем этот код? И еще. Этот код написан на чистом ассемблере (естественно с WinAPI)? И еще. Можно ли сделать прогу, которая будет запускаться непосредственно ВМЕСТО винды? Т.е с загрузочного девайса, а не из винды. Код (Text): .686 .model flat,stdcall option casemap:none WinMain proto :DWORD,:DWORD,:DWORD,:DWORD include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data ClassName db "Windlass",0 AppName db "Win API",0 OurText db "LooooooL!",0 .data? hInstance HINSTANCE ? CommandLine LPSTR ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground, (28) mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,0 invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_SYSMENU,150,\ 150,600,500,NULL,NULL,\ hInst,NULL mov hwnd,eax INVOKE ShowWindow, hwnd,SW_SHOWNORMAL INVOKE UpdateWindow, hwnd .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke GetClientRect,hWnd, ADDR rect invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint,hWnd, ADDR ps .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
Есть микрокод процессора. Каждая инструкция описывается набором ещё более элементарных и низкоуровневых инструкций. Но ты их ассемблером описать не сможешь - они юзаются только внутри процессора. Ассемблер - условный язык процессора, фактически, условность, какое число каким словом называть, если взять за данное то, что это число будет интерпретировано как команда для какого-то элементарного действия. А ты скинул код для компилятора masm, который переведёт свои синтаксические условности в бинарник для windows; сами инструкции будут переведены именно в то, что они должны обозначать согласно условности ассемблера (в числа, т.е.). Но у тебя там и других синтаксических конструкций ведь полно (макросы .IF, директивы инклуда и т.п). Ты об этом спрашивал ... ? Собственно, открой hex-редактор и впиши в нужное место в бинарнике значения, которые будут интерпретироваться процессором как инструкции. Тогда это уже по-другому и не назовешь, наверное. Слишком общий вопрос у тебя, в общем случае надо просто сделать загрузочный образ, засунуть его куда-либо, откуда он будет читаться при загрузке и протестить на каком-нибудь qemu. И лежать это должно не в файле, есть такие вещи, как загрузочные сектора и т.д.
MMIX нет, системные вызовы. только этот подход мало годится для серьезного софта, т.к. эти интерфейсы не гарантируют совместимость с последующими версиями/билдами/апдейтами.
K10 Гарантирует, это не обязательно непосредственно сисколы. Есть есчо IOCTL, LPC и прочие механизмы. Просто для их юзания не достаточно импорта. Эта графы и прочая матчасть.
Mark, нет, твой код изобилует макросами, которые разворачиваются в последовательности инструкций - всякие там .if, invoke и прочая стандартная дребедень чистый ассемблер это только мнемоники инструкций, писать на чистом асме - можно, но утомительно - переписывать тыщу раз одни и теже банальные последовательности поэтому их упаковали в макросы иногда бывает необходимо собрать инструкцию побитово описывая каждый байт - юзают директиву db в коде можешь написать прогу которая запишет часть себя (какуюнить подпрограмму) в загрузрчный сектор какого нить устройства - попытка загрузиться с него приведет к запуску твоей подпрограммы - для этого она должна быть достаточно автономной(как правило код для реального режима процессора)