Написание программ на ассемблере под 64 битную. Пирогов владислав юрьевич. Регистры общего назначения

Первой вопрос, который, я хочу рассмотреть и который, мне кажется, сейчас очень важным, это 64-битовое программирование. Естественно речь пойдет об ассемблере. В качестве такового возьмем fasm. Во-первых, поддерживает 64-битовое программирование, во-вторых, этот ассемблер является кроссплатформенным. Для того, чтобы начать писать 64-битовые программы достаточно 1. Узнать структуру программы; 2. Использовать правильное соглашение вызова системных и вообще функций.
Программирование в Windows.
В 64-битовых Windows принята следующая конвенция вызова функций (в том числе вызов функций API).
1. Первые четыре параметра передаются в функцию через регистры: rcx, rdx, r8, r9. Остальные параметры (если они есть) передаются через стек.
2. Перед вызовом функции резервируется область в стеке, на случай, если вызываемая функция "захочет" временно сохранить параметры в стеке. Таким образом, параметры, которые передаются через стек, помещаются туда после резервируемой области.
3. При передаче параметров, размер которых меньше 64 бит, передаются как 64-битовые параметры. При этом следует обнулить старшие биты. Параметры, большие 64-бит передаются по ссылке.
4. Данные возвращаются через регистр rax. Если возвращаемое значение имеет размер больший 64 бит, то данное передается через область памяти, адрес которой передается в первом параметре. Для возвращения может также использоваться регистр xmm0.
5. Все регистры при вызове функций сохраняются за исключением rax, rcx, rdx, r8, r9, r10, r11, сохранность которых не гарантируется.
6. Граница стека должна быть выровнена по адресу кратному 16.
Рассмотрим в общих чертах схему вызова функции API с пятью параметрами.
...
sub rsp,40 ; резервируем стек
mov qword ptr ,par5
mov r9,par4
mov r8,par3,
mov rdx,par2
mov rcx,par1
call f_api64
...
add rsp,40 ;восстанавливаем стек
...

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

sub rsp,40 ; резервируем стек
mov r9,par4
mov r8,par3,
mov rdx,par2
mov rcx,par1
call f_api64
...
add rsp,40 ;восстанавливаем стек

Рассмотрим следующую программу

format PE64 GUI
entry start
section ".text" code readable executable
start:
sub rsp,8*5
mov r9,0
lea r8,[_caption]
lea rdx,[_message]
mov rcx,0
call
add rsp,40
sub rsp,16
mov ecx,eax
call
section ".data" data readable writeable
_caption db "Win64 assembly program",0
_message db "Hello World!",0
section ".idata" import data readable writeable
dd 0,0,0,RVA kernel_name,RVA kernel_table
dd 0,0,0,RVA user_name,RVA user_table
dd 0,0,0,0,0
kernel_table:
ExitProcess dq RVA _ExitProcess
dq 0
user_table:
MessageBoxA dq RVA _MessageBoxA
dq 0
kernel_name db "KERNEL32.DLL",0
user_name db "USER32.DLL",0
_ExitProcess dw 0
db "ExitProcess",0
_MessageBoxA dw 0
db "MessageBoxA",0

Если имя программы prog.asm, то компилируется она просто командой
fasm prog.asm

Как видите, в Windows все просто.

Пирогов В.Ю , (

Хотя и написано 7 у меня получалось установить на XP. Во время установки там будет предложено выбрать устанавливаемые компоненты, и если для установки выбрать только C++ компиляторы то потребуется 157 Мб трафика. Также если у вас не установлен .NET Framework 4.0 , то и его нужно будет установить.
После установки 64-битный ассемблер будет находится в папках C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64 и C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 , где C:\ это системный диск, обычно с папкой Windows . link я использую 64-битный из папки amd64, а ml64 уже 32-битный из папки x86_amd64. В папке amd64 есть 64-битная версия ml64 , но при работе с большим количеством макросов он почему-то зависает или просто медленно работает.

Генерация заголовочных файлов
В архиве masm64.zip находится много заголовочных файлов, сделанных для Windows XP. Для их создания я использовал утилиту dll2asmblank.zip , исходник прилагается. Вообще-то сначала я её делал как утилиту генерирующую исходники подложных (фэйковых) библиотек (*.dll), что и неплохо получилось. При запуске подложная библиотека загружает оригинальный, но уже переименованный модуль, и все экспортируемые функции оказываются перехваченными. Этот метод лучше подходит для виртуальных машин, когда можно сравнительно легко переименовывать и подменять системные библиотеки. В дальнйшем эту утилиту не сложно было использовать для получения отсутствующих инлайн файлов (*.lib)
Если вам нужно будет создать более полный комплект заголовочных файлов для своей 64-битной ОС, то для этого следует в папке с dll2asmblank.exe создать файл коммандной строки (*.bat), со следующим содержимым.

@echo off
dll2asmblank "%Папка с Windows%\system32\*.dll" /OUTDIR: /PATTERN:"pattern1.asm"
dll2asmblank "%Папка с Windows%\system32\*.exe" /OUTDIR:"Папка для сохранения заголовочных файлов" /PATTERN:"pattern2.asm"
pause

Файлы pattern1.asm и pattern2.asm, находятся в одной папке с dll2asmblank.exe. Там следует обратить внимание на последние 4 строки в обоих файлах.

PatternBat PATTERN
ML64 /c /Cp /I"C:\masm64\include" %s.asm
LINK %s.obj /LIBPATH:"C:\masm64\lib" /SUBSYSTEM:WINDOWS /ENTRY:DllEntryPoint /DLL /DEF:%s.def
ENDPATTERN

Вместо ML64 и LINK должны быть полные пути к этим файлам, взятые в двойный кавычки. Вместо "C:\masm64\include" ваш путь к заголовочным файлам. Вместо "C:\masm64\lib" ваш путь к инлайн файлам (*.lib). После определения путей нужно будет запустить этот коммандный файл.
Когда коммандный файл завершит работу в будет находится коммандный файл build.bat. Выполняться он может очень долго, и когда он завершит работу в "Папка для сохранения заголовочных файлов" будут находится также и все инлайн файлы (*.lib). Дальше останется только разместсить *.inc и *.lib по своему усмотрению.
Для получения заголовочного файла одной библиотеки в коммандном файле должно быть.

@echo off
dll2asmblank "имя библиотеки.dll" /OUTDIR:"Папка для сохранения заголовочных файлов" /PATTERN:"pattern1.asm"
pause

Для получения заголовочного файла исполняемого модуля.

@echo off
dll2asmblank "имя исполняемого модуля.exe" /OUTDIR:"Папка для сохранения заголовочных файлов" /PATTERN:"pattern2.asm"
pause

Для создания подложных библитек и модулей нужно использовать аналогичные коммандные файлы, но вместо pattern1.asm нужно использовать pattern3.asm, и вместо pattern2.asm pattern4.asm соответственно. pattern3.asm и pattern4.asm тоже находятся в одной папке с dll2asmblank.exe.
32-битные модули могут быть обработаны, но для них потребуются другие pattern файлы.

Новые макросы
Использовать windows.inc из пакета masm32 не получилось. От туда время от времени копирую недостающие константы, а структуры приходиться объявлять в ручную. В архиве masm64.zip /include есть заголовочный файл с комплектом макросов temphls.inc. Это прежде всего invoke , .if , .elseif , .else , .endif , .while , .repeat и другие.
Cтиль синтаксиса я в них определил довольно своеобразный. Ниже краткие правила.

Логический оператор Значение
== равно
{} или ~= не равно
} больше
}= больше или равно
{ меньше
{= или ={ меньше или равно
& тестирование битов
| установка битов
&& логическое И
|| логическое ИЛИ
CARRY? CF флаг займа/переноса
OVERFLOW? OV флаг переполнения
PARITY? PF флаг четности бит
SIGN? SF флаг знака
ZERO? ZF флаг равенства нулю
CARRY?|ZERO? некоторые сочетания флагов
~ZERO?&(SIGN?==OVERFLOW?)
SIGN?==OVERFLOW?
SIGN?{}OVERFLOW?
ZERO?|(SIGN?{}OVERFLOW?)

Конечно лучше-бы это были встроеные макросы, как это обстоит с 32-битной версией ассемблерного транслятора. Знаки переменных SWORD /SDWORD не учитываются. Обычные макросы не принимают уголки <>. Но и в таких макросах есть свои положительные стороны. С синтаксисом теперь можно эксперементировать.

Я сделал пару новых макросов. Первый это .skip для перехода на начало тела цикла. .continue осуществляет переход на проверку условия продолжения цикла т. е. если остатот цикла нужно вместе с проверкой условия пропустить то можно использовать .skip/ .skip .if .

Пример использования

While TRUE
inc eax
.skip .if edx==eax
dec edx
.endw

While TRUE
.repeat
inc eax
.until edx~=eax
dec edx
.endw

Второй макрос это .goto label/.goto label .if для условных переходов.

Пример использования

Goto Exit .if eax==5 || esi}=edi
inc eax
Exit:

Тоже самое но с использованием только старых макросов.

If eax~=5 && esi{edi
inc eax
.endif
Exit:

Для сравнения с учётом знака можно использовать одну из четырёх текстовых макро-констант.
sxb equ
sxw equ
sxd equ
sxq equ

Пример использования

If sxq {=rax || sxd edx}=r12d || sxw r12w}sp || sxb {0
add rax,4
.endif

Новый invoke
В temphls.inc определён макрос invoke , который может обрабатывать до 14 параметров. Для вызова функций с большим количеством аргументов можно использовать макрос invoke14 . invoke отличается от invoke14 , тем что он обрабатывает повторяющиеся параметры, для загрузки параметров использует rbp или rsp регистр в зависимости от количества памяти выделеной под локальные переменные, использует типизированные по размеру константы, и вместо addr при загрузке указателей может использоваться знак амперсанда (&, почти как в C/C++).

Исходник пустого окна
OPTION DOTNAME
option casemap:none
include temphls.inc
include win64.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
OPTION PROLOGUE:rbpFramePrologue
OPTION EPILOGUE:rbpFrameEpilogue
.const
wcex label WNDCLASSEX
cbSize dd sizeof WNDCLASSEX
style dd 0
lpfnWndProc dq offset WndProc
cbClsExtra dd 0
cbWndExtra dd 0
hInstance dq 100400000h
hIcon dq 10003h
hCursor dq 10003h
hbrBackground dq COLOR_WINDOW
lpszMenuName dq 0
lpszClassName dq offset ClassName
hIconSm dq 10003h
ClassName db "Asm64 window",0
AppName db "The window",0
.code
WinMain proc <12> ;parmarea 12*8 bytes
LOCAL msg:MSG
invoke RegisterClassEx ,&wcex ;можно написать по старому addr wcex
mov r10d,CW_USEDEFAULT
invoke CreateWindowEx ,0,addr ClassName,addr AppName,WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
dptr CW_USEDEFAULT,dptr CW_USEDEFAULT,dptr CW_USEDEFAULT,dptr CW_USEDEFAULT,\
0,0,hInstance,0
lea rdi,msg
.while TRUE
invoke GetMessage ,rdi,0,0,0
.break .if ~eax
invoke TranslateMessage ,rdi
invoke DispatchMessage ,rdi
.endw
invoke ExitProcess,
WinMain endp
WndProc proc <4> hWnd:QWORD,uMsg:QWORD,wParam:WPARAM,lParam:LPARAM
.if edx==WM_DESTROY
invoke PostQuitMessage ,NULL
.else
leavef
jmp DefWindowProc
.endif
xor eax,eax
ret
WndProc endp
end

Ассемблирование и линковка
@echo off
ML64 /I"masm64\include" /I"\masm64\include" /c /Cp "window.asm"
LINK /LIBPATH:"\masm64\lib" /BASE:0x100400000 /ENTRY:WinMain /SUBSYSTEM:WINDOWS window.obj user32.lib kernel32.lib
pause

invoke с CreateWindowEx разворачивается в следующую последовательность инструкций

0000000100401011:33C9 xor ecx,ecx ;dwExStyle=0
0000000100401013:48894DB0 mov ,rcx ;hWndParent=0
0000000100401017:48894DB8 mov ,rcx ;hMenu=0
000000010040101B:48894DC8 mov ,rcx ;lpParam=0
000000010040101F:488D157A100000 lea rdx, ;lpClassName=1004020A0h
0000000100401026:4C8D0580100000 lea r8, ;lpWindowName=1004020ADh
000000010040102D:41B90000CF10 mov r9d,10CF0000h ;dwStyle=10CF0000h
0000000100401033:B800000080 mov eax,80000000h ;eax=80000000h
0000000100401038:894590 mov ,eax ;x=eax
000000010040103B:894598 mov ,eax ;y=eax
000000010040103E:8945A0 mov ,eax ;nWidth=eax
0000000100401041:8945A8 mov ,eax ;nHeight=eax
0000000100401044:488B051D100000 mov rax, ;rax=
000000010040104B:488945C0 mov ,rax ;hInstance=rax
000000010040104F:FF15EB0F0000 call qword ptr ;call CreateWindowEx

Загрузка параметров происходит не последовательно, а с учётом повторяющихся параметров. Если ecx равен нулю, то вместо and qword ptr ,0 будет mov ,rcx что компактнее. Подобные вещи обычно делают оптимизирующие компиляторы. Константа dptr CW_USEDEFAULT, является типизированной. Так как invoke не использует прототипы функций, то размер аргумента должен быть так или иначе задан, по умолчанию размер аргумента 8 байт. dptr перед CW_USEDEFAULT делает подсказку, что это DWORD а не QWORD и вместо mov ,rax ставится более компактное mov ,eax .

Пролог и Эпилог
В temphls.inc есть пролог и эпилог. Для их использования код должен начинаться со строк.
OPTION PROLOGUE:rbpFramePrologue
OPTION EPILOGUE:rbpFrameEpilogue
Для аддрессации к локальным переменным используется регистр rbp, только потому-что так проще. На x64 системах регистры rax, rbx, rcx, rdx, rsp, rsi, rdi для этой цели тоже подходят не меньше чем rbp. Регистры r8..r15 требуют REX префикса, но тоже подходят. На x86 выбор только между ebp и esp, с eax, ebx, ecx, edx, esi, edi в редких случаях возможны проблемы из-за сегментации. Директиву uses можно использовать как и раньше в 32-битном коде, только там нужно указывать имена 64-битных регистров, а не 32-битных.
Если в процедуре под локальные переменные выделяется больше 4 кб, то по возможности используется функция __chkstk. Эта функция находится в библиотеке kernel32.dll поэтому в исходнике должны быть две строки.
include kernel32.inc
includelib kernel32.lib
Выделение стэковой памяти происходит таким образом, что стэк выравнивается на границу 16 байт. Пролог работает по принципу "Если для меня стэк выравняли, то и я это сделаю". При вызове функций можно использовать макрос invoke, если вы хотите в ручную загрузить аргументы, то для этого нужно использовать регистры rcx, rdx, r8, r9 для первых 4 аргументов и для остальных макро-определения rbpArg5..rbpArg14 с аддрессацией через rbp регистр или rspArg5..rspArg14 с аддрессацией через rsp. Объявления этих макро-определений находятся в temphls.inc. На x86 для загрузки аргументов обычно используются последоватьльности из push`ей, но для x64 это не целесообразно, потому-что стэк перед вызовом WINAPI функции должен быть выровнен на границу 16-байт и выравненное значение rsp лучше лишний раз не менять.
Пролог в уголках <> может принимать до 5 параметров.
Пример:
WndProc proc <12,8,4,8,8>

Ret
WndProc endp
Первый параметр 12 - означает что в процедуре можно вызывать функции которым передаётся не более 12 аргументов. Для большей части WINAPI функций этот параметр должен принимать значения от 4 до 14. Этот параметр не должен быть меньше 4, даже если в процедуре вызываются только WINAPI функции которым передаётся 3 и менее 3 аргументов, в противном случае могут возникнуть трудно отслеживаемые баги. Однако этот параметр может быть равен нулю если процедура не вызывает ни одной функции. Если уголки вообще не использовать для определения параметров, то по умолчанию пролог выделяет в стэке место для 7 аргументов.
Остальные четыре числа 8,4,8,8 это размеры в байтах, первых четырёх аргументов которые в начале находятся в регистрах rcx, rdx, r8, r9. Эти параметры могут быть равны 1, 2, 4 или 8. Если эти параметры не указывать то аргументы из регистров rcx, rdx, r8, r9 не будут сохраняться в отведённое для них место в стэке, но это можно будет сделать в ручную.
Сохранение первых 4 аргументов в ручную:
WndProc proc <12> hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
mov hWnd,rcx
mov uMsg,edx
mov wParam,r8
mov lParam,r9

Ret
WndProc endp
Макрос leavef удаляет фрэйм выделенный в прологе, ret отличается от leavef только тем, что он оканчивается инструкцией retn для возврата к вызвавшей процедуре.

Макрос v
Макрос v (сокращенно от eval, находится в masm64 \include\temphls.inc) раскрывает выражения, помогая более понятно оформлять код. Макрос не обрабатывает деление. Сколько я макрос не использовал необходимости в этом действии просто не возникло.
Поддерживаемые операторы в порядке увеличения приоритета


Из-за логических сдвигов может быть изменено значение регистра cl, далеко не всегда, но это нужно учитывать. При умножении последний множитель должен завершать строку выражения или он должен быть отделён скобками.
Можно написать так
v r9=rax*r8*rsi*r15
Вот так
v r9=(rax*r8*rsi*r15)|qword ptr
Но только не так
v r9=rax*r8*rsi*r15|qword ptr

Макрос v не на столько высокоуровневый, чтобы можно было забыть про то что у процессора нет инструкций где оба операнда память. Нельзя копировать из памяти в память, нельзя умножить память на память и. т. д.
Можно написать так
v qword ptr =rax-rdi
Вот так
v rax=qword ptr +qword ptr
Но только не так
v qword ptr =rax+qword ptr

Размеры операндов должны быть одинаковыми. Это могут быть регистры, память или непосредственные значения. Исключение возможно при сдвигах.
Можно написать так
v edi=dword ptr {{(al+bl)
Макрос развернется в последовательность
mov edi,dword ptr
mov cl,al
add cl,bl
shl edi,cl

С помощью амперсанда доступно масштабирование с инструкцией lea, но место назначения должно быть регистром.
Можно написать так
v edi=&-dword ptr
Вот так
v edi=dword ptr +&
Но только не так
v dword ptr =edi+&

При написании макроса возникло много проблем связаных с ограничениями макросистемы. Уровень вложености при ветвлении IF/ENDIF ограничен всего 20 уровнями. Само по себе это не было-б проблемой, 20 уровней для.if/.endif мне всегда хватало, но похоже что уровни при рекурсии суммируются, а макрос v как раз рекурсивный. В некоторых местах выходило так что ключевое слово ELSE тихо игнорировалось и приходилось использовать директиву GOTO, в паре с объявлением макрометки.

Тестирование отдельных битов test vs bt
В макросах masm64.zip /Include/temphls.inc внесено немного изменений. Ранее в макросах для проверки битов использовалась только инструкция test, ей соответствовал логический оператор амперсанд &, но опкод инструкции bt более компактный, а также с bt можно еще проверять старшие 32 бита в 64-битных регистрах и переменных.

Например такой записи раньше не допускалось.

If rax&(1 shl 55)
inc edi
.endif

Развернется как

Bt rax,55
jnc labelxx
inc edi
labelxx:

Раньше происходила-б ошибка

Test rax,(1 shl 55) ;в опкоде test есть только 4 байта для чисел, число (1 shl 55) не уместится
jz labelxx
inc edi
labelxx:

При тестировании самого старшего бита в WORD`е, DWORD`е или QWORD`е все-же используется инструкция test, потому-что старший бит копируется в SF флаг основного регистра флагов RFLAGS.

If rbx&(1 shl 63)
inc edi
.endif

Развернется как

Test rbx,rbx
jns labelxx ;проверка SF флага
inc edi
labelxx:

Знаковый бит можно еще тестировать используя ключевое слово SIGN?

If rbx&SIGN?
inc edi
.endif

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

UASM is a free MASM-compatible assembler based on JWasm with these features (old HJWasm):

native support for output formats Intel OMF, MS Coff (32/64-bit), Elf (32/64-bit), Binary, Windows PE (32/64-bit) and DOS MZ.
precompiled UASM binaries are available for Windows, Linux and OSX.
Instructions up to AVX2 and AVX512F are supported including all new extensions for VMX, MPX, AES, BND, F16C etc.
Support for MS Vectorcall on x64.
Support for Borland Register Calling Convention.
Full support for SystemV Calling Convention.
Integrated Macro Library with OO support.
Numerous new HLL features (as described in the extended manual).
UASM is written in C. The source is portable and has successfully been tested with Open Watcom, MS VC, GCC and more.
As far as programming for MS Windows is concerned, UASM can be used with both WinInc (32/64-bit) and Masm32 (32-bit).
C header files can be converted to include files for UASM with h2incX.
UASM"s source code is released under the Sybase Open Watcom Public License, which allows free commercial and non-commercial use.
There"s a bunch of source samples available - they are supplied with the precompiled binary packages.
JWasm started as a fork of Open Watcom"s Wasm in March 2008. Today, the part of Wasm source lines still contained in JWasm is approximately 15%.
UASM is a continued evolution of JWasm.

Updated

  1. UASM 2 . 47 (32bit) 17 / 11 / 2018 uasm247_x86. zip 32bit Binary Package (Windows)
  2. UASM 2 . 47 (64bit) 17 / 11 / 2018 uasm247_x64. zip 64bit Binary Package (Windows)
  3. UASM 2 . 47 (Linux 64bit) 17 / 11 / 2018 uasm247_linux64. zip 64bit Linux Executable (GCC)
  4. UASM 2 . 47 (OSX Universal) 17 / 11 / 2018 uasm247_osx. zip 64bit OSX Executable (GCC)

--> 32bit <-- , --> 64bit <-- , --> Linux 64bit <-- , --> OSX <--

Full SDK 10.0 translate for 64 and 32 bits --> Link <--
--> Site <--
Примеры с этими хидерами - --> Link <--

NOTES:
Adapting constants switchs to your system,use this tool:
sdkrc81\Before_use_me.exe.He will give you the correct swiths for your system.
Modify translate.inc with this switchs.The defaut system is windows 10.0

With a correct alignment,all translated structures,can be used as they are.
There is no need of any modifie.

Easy Code IDE 32/64-bit

Easy Code - Visual assembler
(Updated on February 4, 2018)

(Windows 95/98/ME/NT40/2000/XP/2003/2008/Vista/7/8/8.1/10)
- Version 2.x Fasm, GoAsm, JWasm, UASM (HJWasm) , Masm and PoAsm, using different tools for the various assemblers
--> Easy Code 2.02.0.0007 <--

RadASM 32/64-bit

Current version: 2.2.2.3 - Last updated: 08/01/2018

  1. Downloads
  2. 1 . 74 MB Assembly. zip
  3. 1 . 14 MB HighLevel. zip
  4. 203 KB Language. zip
  5. 4 . 6 MB RadASM- 2 . 2 . 2 . 2 - FullPackage. zip
  6. 1 . 03 MB RadASM- 2 . 2 . 2 . 2 - IDEOnly. zip
  7. 549 KB RAHelp. zip
  8. Source code (zip)
  9. Source code (tar. gz)

RadASM is a lightweight IDE tool for all kinds of programmers who are looking for a straightforward application in which to edit their code.

It supports a wide variety of programming languages and assemblers such has MASM, NASM, FASM, TASM, Borland C, C++, Bcet Basic, VC6 C/C++, Free Pascal and FreeBASIC.

It was created by Ketil Olsen aka KetilO

This is a fork from the original RadASM v2.x source located on SourceForge here

I have made some very minor adjustments, which are detailed in the WhatsNew.txt

Features

User friendly interface.
Project browsing and properties.
Inbuilt programmer tools: ‘Ascii Table’, ‘Colref’, ‘Toolbar Creator’ etc.
Multiple Undo/Redo.
Find & Replace keywords.
Block indents, outdents and comments.
Bookmarks.
Syntax highlighting.
Custom controls.
Automatic code completion.
Record macros for ease of use.
Addins to extend its functionality.
Template system for automatic code generation.
Supports various programming languages.
Setup

Visit the wiki entry Setting up the RadASM environment for more details.

Credits

  1. Written and Programmed by KetilO
  2. Minor updates including Multilingual installer by fearless

Source Code Pro Font

Source Code Pro is a set of OpenType fonts that have been designed to work well in user interface (UI) environments. In addition to a functional OpenType font, this open source project provides all of the source files that were used to build this OpenType font by using the AFDKO makeotf tool.

Download the fonts (OTF, TTF, WOFF, WOFF2, EOT)

Latest release
All releases
Font installation instructions

macOS
Windows
Linux/Unix-based systems

Актуальные книги программисту на X64 ассемблере - --> Link <--
P a s s - Assembler64

  1. AMD64 Architecture Programmer"s Manual\
  2. Russinovich M. - Windows Internals, Part 1 , 6th Edition - 2012 \
  3. Russinovich M. E. , Solomon D. A. , Ionescu A. - Windows Internals, 6th ed. - 2012 \
  4. Windows 7 Device Driver\
  5. Randall Hyde The Art of Assembly Language. epub
  6. Andrew Whitechapel, Sean McKenna- Windows Phone 8 Development Internals- Microsoft Press (2013 ) . pdf
  7. Ata Elahi, Trevor Arjeski auth. ARM Assembly Language with Hardware Experiments. pdf
  8. coder32. pdf
  9. coder64. pdf
  10. Daniel Kusswurm Modern X86 Assembly Language Programming 32 - bit, 64 - bit, SSE, and AVX. pdf
  11. Dmitry Vostokov- Memory Dump Analysis Anthology. 7 - Opentask (2014 ) . pdf
  12. Heiko Falk, Peter Marwedel auth. Source Code Optimization Techniques for Data Flow Dominated Embedded Software. pdf
  13. Jeff Duntemann Assembly Language Step- by- Step Programming with Linux. pdf
  14. Joseph Cavanagh X86 Assembly Language and C Fundamentals. pdf
  15. Kip Irvine Assembly Language for x86 Processors 6th Edition. pdf
  16. Larry D. Pyeatt Modern Assembly Language Programming with the ARM Processor. pdf
  17. Manuel Sojer auth. Reusing Open Source Code Value Creation and Value Appropriation Perspectives on Knowledge Reuse. pdf
  18. Margush, Timothy S Some Assembly Required Assembly Language Programming with the AVR Microcontroller . pdf
  19. Mark E. Russinovich, David A. Solomon, Alex Ionescu- Windows Internals, 5th Edition- Microsoft Press (2009 ) . pdf
  20. Mastering CMake. Ken Martin. 2009 . pdf
  21. Modern X86 Assembly Language Programming 32 - bit, 64 - bit, SSE, and AVX. pdf
  22. Muhammad Ali Mazidi, Sarmad Naimi, Sepehr Naimi, Janice Mazidi ARM Assembly Language Programming and Architecture. pdf
  23. Professor James T. Streib auth. Guide to Assembly Language A Concise Introduction. pdf
  24. Randall Hyde The Art of Assembly Language. pdf
  25. Ray Seyfarth Introduction to 64 Bit Intel Assembly Language Programming for Linux. pdf
  26. Susan Elliott Sim auth. , Susan Elliott Sim, Rosalva E. Gallardo- Valencia eds. Finding Source Code on the Web for Remix and Reuse. pdf
  27. Vincent Mahout Assembly Language Programming ARM Cortex- M3. pdf
  28. Windows Driver Foundation. pdf
  29. Yury Magda Visual C+ + optimization with assembly code . pdf
  30. М. Руссинович, Д. Соломон - Внутреннее устройство Microsoft Windows 6 - е издание (2013 ) . pdf
  31. Род Стивенс - Алгоритмы. Теория и практическое применение. pdf
  32. Руссинович М. , Соломон Д. - Внутреннее устройство Microsoft Windows. Часть 2 . Основные подсистемы ОС. 6 - е издание - 2014 . pdf
  33. KIP R. IRVINE- Assembly Language for x86 Processors- Pearson (2014 )
  34. + IRVINE Src

Что нужно иметь ещё ?! -
1. PoLink или лучше всю папку bin от --> Pelles C <-- для x64
2. ml64 linker и подобное от MS от Visual Studio 2017, можно без оптимизации тоже скопировать всю папку, сегодня места хватает на всё.
3. Возможно конвертёр.H файлов headinc.exe, который поставляется вместе с одной IDE под названием EditMasm от автора хидер файлов, синтаксис одинаковый. Отдельно здесь - --> Link <--
4. Обновлённые макросы для x64 систем - --> Link <--
5. Мини Пакет разработки драйверов совместно с Full SDK 10.0 -

| Сообщение посчитали полезным: zds, plutos, VOLKOFF, elch, Gideon Vi, VodoleY, Vintersorg, HandMill, Orlyonok, DenCoder, Isaev, BlackCode, 4kusNick