Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Как создать консольное приложение на асме?


Автор: ТарасАтавин 2.9.2013, 13:05
Как создать консольное windows x64 приложение на асме? С чего начинать?

Автор: bsa 2.9.2013, 18:09
ТарасАтавин, лично я считаю, что начать стоит с посещения психиатра... Ничего личного, просто возможно, тебе эту прогу на ассемблере писать даже не нужно.

На ассемблере пишут маленькие вставки в код имеющейся программы на языке высокого уровне. В крайнем случае (низкоуровневая системная библиотека), отдельные функции.

Автор: ТарасАтавин 3.9.2013, 05:23
Цитата(bsa @  2.9.2013,  18:09 Найти цитируемый пост)
ТарасАтавин, лично я считаю, что начать стоит с посещения психиатра
Тебе.

Добавлено @ 05:23
Цитата(bsa @  2.9.2013,  18:09 Найти цитируемый пост)
Ничего личного
Научись различать "всё" и "ничего".

Добавлено @ 05:24
Цитата(bsa @  2.9.2013,  18:09 Найти цитируемый пост)
просто возможно, тебе эту прогу на ассемблере писать даже не нужно.
Не возможно.

Добавлено @ 05:27
Цитата(bsa @  2.9.2013,  18:09 Найти цитируемый пост)
На ассемблере пишут маленькие вставки в код имеющейся программы на языке высокого уровне. В крайнем случае (низкоуровневая системная библиотека), отдельные функции. 
А ещё на асм компилируются проги с c++. В кодах пишется абсолютно всё, просто не всегда вручную, а ближайшее, что можно взять за первый шаг при разбирательстве с кодом, - это асм. Но если ограничиваться вставками и функциями, то так ни когда и не соберёшь приложение. Но твоему понимаю это не доступно. Как по-твоему пишут компиляторы и компоновщики, если даже не пытаются изучить создание "скелета" приложения на асме? Ни как что ли?

Автор: DarthTon 3.9.2013, 10:36
Ну коль таки действительно необходимо...

1. Ознакомиться с особенностями х64 - http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx
2. Выбрать диалект ассемблера c поддержкой х64 - MASM/FASM/NASM/YASM
3. Написать код. Пример для NASM:
Код

; imports
extern GetStdHandle
extern WriteFile
extern ExitProcess

;global symbols
global main

section .data
    message:
        db 'Hello, World!', 0
    message_end:

section .text
main:
    ; QWORD  bytes;    
    mov rbp, rsp
    
    ; space for register spill
    sub rsp, 38h

    ; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE )
    mov rcx, -11
    call GetStdHandle
    mov  rcx, rax    

    ; WriteFile(hstdOut, message, strlen(message), &bytes, 0);
    push 0
    lea r9, [rbp - 8]
    mov r8, (message_end - message)
    mov rdx, message
    call WriteFile
    
    
    ; ExitProcess(0)
    mov rcx, 0
    call ExitProcess
    
    ; restore stack ptr 
    add rsp, 38h
    retn 10h

4. Скомпилить и слинкать получившийся объектный файл (я использовал линкер и либы от VC++ 2012).
Код

nasm.exe -g -o main.obj -fwin64 main.asm
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64\link.exe" /NOLOGO /DEBUG /MACHINE:X64 /NODEFAULTLIB
 /SUBSYSTEM:CONSOLE /OUT:x64Console.exe /PDB:"x64Console.pdb" /ENTRY:main main.obj kernel32.lib

5. ??????
6. PROFIT

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)