Написание программ на ассемблере под 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
- UASM 2 . 47 (32bit) 17 / 11 / 2018 uasm247_x86. zip 32bit Binary Package (Windows)
- UASM 2 . 47 (64bit) 17 / 11 / 2018 uasm247_x64. zip 64bit Binary Package (Windows)
- UASM 2 . 47 (Linux 64bit) 17 / 11 / 2018 uasm247_linux64. zip 64bit Linux Executable (GCC)
- 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
- Downloads
- 1 . 74 MB Assembly. zip
- 1 . 14 MB HighLevel. zip
- 203 KB Language. zip
- 4 . 6 MB RadASM- 2 . 2 . 2 . 2 - FullPackage. zip
- 1 . 03 MB RadASM- 2 . 2 . 2 . 2 - IDEOnly. zip
- 549 KB RAHelp. zip
- Source code (zip)
- 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
- Written and Programmed by KetilO
- 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
- AMD64 Architecture Programmer"s Manual\
- Russinovich M. - Windows Internals, Part 1 , 6th Edition - 2012 \
- Russinovich M. E. , Solomon D. A. , Ionescu A. - Windows Internals, 6th ed. - 2012 \
- Windows 7 Device Driver\
- Randall Hyde The Art of Assembly Language. epub
- Andrew Whitechapel, Sean McKenna- Windows Phone 8 Development Internals- Microsoft Press (2013 ) . pdf
- Ata Elahi, Trevor Arjeski auth. ARM Assembly Language with Hardware Experiments. pdf
- coder32. pdf
- coder64. pdf
- Daniel Kusswurm Modern X86 Assembly Language Programming 32 - bit, 64 - bit, SSE, and AVX. pdf
- Dmitry Vostokov- Memory Dump Analysis Anthology. 7 - Opentask (2014 ) . pdf
- Heiko Falk, Peter Marwedel auth. Source Code Optimization Techniques for Data Flow Dominated Embedded Software. pdf
- Jeff Duntemann Assembly Language Step- by- Step Programming with Linux. pdf
- Joseph Cavanagh X86 Assembly Language and C Fundamentals. pdf
- Kip Irvine Assembly Language for x86 Processors 6th Edition. pdf
- Larry D. Pyeatt Modern Assembly Language Programming with the ARM Processor. pdf
- Manuel Sojer auth. Reusing Open Source Code Value Creation and Value Appropriation Perspectives on Knowledge Reuse. pdf
- Margush, Timothy S Some Assembly Required Assembly Language Programming with the AVR Microcontroller . pdf
- Mark E. Russinovich, David A. Solomon, Alex Ionescu- Windows Internals, 5th Edition- Microsoft Press (2009 ) . pdf
- Mastering CMake. Ken Martin. 2009 . pdf
- Modern X86 Assembly Language Programming 32 - bit, 64 - bit, SSE, and AVX. pdf
- Muhammad Ali Mazidi, Sarmad Naimi, Sepehr Naimi, Janice Mazidi ARM Assembly Language Programming and Architecture. pdf
- Professor James T. Streib auth. Guide to Assembly Language A Concise Introduction. pdf
- Randall Hyde The Art of Assembly Language. pdf
- Ray Seyfarth Introduction to 64 Bit Intel Assembly Language Programming for Linux. pdf
- Susan Elliott Sim auth. , Susan Elliott Sim, Rosalva E. Gallardo- Valencia eds. Finding Source Code on the Web for Remix and Reuse. pdf
- Vincent Mahout Assembly Language Programming ARM Cortex- M3. pdf
- Windows Driver Foundation. pdf
- Yury Magda Visual C+ + optimization with assembly code . pdf
- М. Руссинович, Д. Соломон - Внутреннее устройство Microsoft Windows 6 - е издание (2013 ) . pdf
- Род Стивенс - Алгоритмы. Теория и практическое применение. pdf
- Руссинович М. , Соломон Д. - Внутреннее устройство Microsoft Windows. Часть 2 . Основные подсистемы ОС. 6 - е издание - 2014 . pdf
- KIP R. IRVINE- Assembly Language for x86 Processors- Pearson (2014 )
- + 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