Flat assembler v.1.70.03

Пример программы

Пример Windows-программы «Hello, world!», которая выводит это сообщение с помощью функции и завершается:

         format  pe gui 4
         entry   start
         include 'win32a.inc'

 start:
         invoke  MessageBox,NULL,message,message,MB_OK
         invoke  ExitProcess,

 message db 'Hello, World!',

         data    import
         library kernel32,'kernel32.dll',\
                 user32,'user32.dll'
         include 'apikernel32.inc'
         include 'apiuser32.inc'
         end     data

Или так:

         include 'win32ax.inc'
 .code
 main:
         invoke  MessageBox,NULL,'Hello, World!','Fasm message box',MB_OK
         invoke  ExitProcess,
 .end main

Усложнённый вариант, с уточнением секций в PE-файле:

         format  pe gui
         entry   start
         include 'win32a.inc'

 section '.data' data readable writeable

 message db      'Hello, World!',

 section '.code' code readable executable

 start:
         invoke  MessageBox,NULL,message,message,MB_OK
         invoke  ExitProcess,

 section '.idata' import data readable writeable
         library kernel32,'kernel32.dll',\
                 user32,'user32.dll'
         import  kernel32,\
                 ExitProcess,'ExitProcess'
         import  user32,\
                 MessageBox,'MessageBoxA'

Пример простой консольной программы в формате .COM.

        org      100h

        mov      ah,9h
        mov      dx,hello
        int      21h
        mov      ah,8h
        int      21h
        int      20h

 hello  db       13,10,"Hello, World!$"

Пример простой программы в формате ELF.

format ELF executable 3
entry start

segment readable executable

start:
        mov     eax,4
        mov     ebx,1
        mov     ecx,msg
        mov     edx,msg_size
        int     0x80

        mov     eax,1
        xor     ebx,ebx
        int     0x80

segment readable writeable

msg db 'Hello world!',0xA
msg_size = $-msg

Переменные.

db — резервирование памяти для данных размером 1 байт.
Директивой db можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для чисел со знаком –128…+127;
для чисел без знака 0…255;
8-битовое относительное выражение, использующее операции HIGH и LOW;
символьную строку из одного или более символов. Строка заключается в кавычки.
В этом случае определяется столько байт, сколько символов в строке.

dw — резервирование памяти для данных размером 2 байта.
Директивой dw можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для чисел со знаком –32 768…32 767;
для чисел без знака 0…65 535;
выражение, занимающее 16 или менее бит, в качестве которого может выступать
смещение в 16-битовом сегменте или адрес сегмента;
1- или 2-байтовую строку, заключенная в кавычки.

dd — резервирование памяти для данных размером 4 байта.
Директивой dd можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для i8086:
для чисел со знаком –32 768…+32 767;
для чисел без знака 0…65 535;
для i386 и выше:
для чисел со знаком –2 147 483 648…+2 147 483 647;
для чисел без знака 0…4 294 967 295;
относительное или адресное выражение, состоящее из 16-битового адреса
сегмента и 16-битового смещения;
строку длиной до 4 символов, заключенную в кавычки.

df  — резервирование памяти для данных размером 6 байт;
dp — резервирование памяти для данных размером 6 байт.
Директивами df и dp можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для i8086:
для чисел со знаком –32 768…+32 767;
для чисел без знака 0…65 535;
для i386 и выше:
для чисел со знаком –2 147 483 648…+2 147 483 647;
для чисел без знака 0…4 294 967 295;
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или
16 или менее бит (для младших моделей микропроцессоров Intel);
адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
константу со знаком из диапазона –247…247–1;
константу без знака из диапазона 0…248-1;
строку длиной до 6 байт, заключенную в кавычки.
dq — резервирование памяти для данных размером 8 байт.
Директивой dq можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для МП i8086:
для чисел со знаком –32 768…+32 767;
для чисел без знака 0…65 535;
для МП i386 и выше:
для чисел со знаком –2 147 483 648…+2 147 483 647;
для чисел без знака 0…4 294 967 295;
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или
16 или менее бит (для младших моделей микропроцессоров Intel);
константу со знаком из диапазона –263…263–1;
константу без знака из диапазона 0…264–1;
строку длиной до 8 байт, заключенную в кавычки.
dt — резервирование памяти для данных размером 10 байт.
Директивой dt можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для МП i8086:
для чисел со знаком –32 768…+32 767;
для чисел без знака 0…65 535;
для МП i386 и выше:
для чисел со знаком –2 147 483 648…+2 147 483 647;
для чисел без знака 0…4 294 967 295;
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или
16 или менее бит (для младших моделей);
адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
константу со знаком из диапазона –279…279-1;
константу без знака из диапазона 0…280-1;
строку длиной до 10 байт, заключенную в кавычки;
упакованную десятичную константу в диапазоне 0…99 999 999 999 999 999 999.
Прототип использования:

Пример использования :Perem1 db
STR db ‘Привет всем!’
Perem2 dd 12345
Perem3 dq 134567890
Perem4 dt 123456

CreateDialogParam+DlgProc+WndProc

здесь
Код (ASM):

  1. format PE GUI
  2. include ‘win32ax.inc’
  3. ; import data code resource in the same section
  4. IDM_GETTEXT     equ
  5. IDM_CLEAR       equ 1
  6. IDM_EXIT        equ 2
  7. IDC_BUTTON      equ 3
  8. IDC_EXIT        equ 4
  9. IDC_EDIT        equ 5
  10. IDC_MENU        equ 100
  11. IDC_DIALOG      equ 200
  12. size_of_buffer  equ 96
  13.           ; +—————————+
  14.           ; | register the window class |
  15.           ; +—————————+
  16. start  xor ebx,ebx
  17.                 invoke CreateDialogParam,400000h,IDC_DIALOG,ebx,DlgProc,ebx
  18.                 sub esp,sizeof.MSG+4
  19.         mov edi,esp
  20.                 mov edi+sizeof.MSG,eax
  21. message_loop invoke GetMessage,edi,ebx,ebx,ebx
  22.                 or eax,eax
  23.                 jz exit_msg_loop
  24.                 invoke IsDialogMessage,dwordedi+sizeof.MSG,edi
  25.                 or eax,eax
  26.                 jnz message_loop
  27.                 invoke DispatchMessage,edi
  28.         jmp message_loop
  29. exit_msg_loopadd esp,sizeof.MSG+4
  30.                 retn            

Макрокоманды(макросы).

Это
такая  полезная вешь!Представьте что вам надо использовать
примерно такой код:

mov
eax,9245

mov ebx,3456

mov ecx,7654

add eax,ebx

sub eax,ecx

Вроде-бы ничего такого,но если похожий фрагмент только с другими
значениями встречается в вашей программе раз сто?Вот тут с вами и случитися апоплексический удар.

Конечно вы можете создать свою функцию:

proc Вычисления,
параметр1,параметр2,параметр3mov eax, 
      mov ebx, 
      mov ecx, 
      add eax,ebx

        sub eax,ecx       
return

endp

Вызвать её:

invoke Вычисления,
параметр1,параметр2,параметр3

И получить результат в EAX.
Но!Постоянные вызовы функций — это тактика программиста на
VisualBASIC,но не Ассемблера.Ведь это постоянные вызовы функций
командой
CALL и возвращения — RET(мы везде будем загружать процессор двумя(!)
лишними инструкциями(2×100 вызовов=200 лишних инструкций )).

А если мы сделаем так:macro Вычисленияпараметр1,параметр2,параметр3mov eax,параметр1 
    mov ebx,параметр2 
    mov ecx,параметр3 
    add eax,ebx

      sub eax,ecxТеперь
мы пишем в тексте программы:Вычисления9245,3456,7654

А копмпилятор сам пишет:
      mov eax,9245 
    mov ebx,3456 
    mov ecx,7654 
    add eax,ebx

      sub eax,ecx
Где
вместопараметр1,параметр2,параметр3  компилятор подставляет
значения,которые вы ввели(9245,3456,7654).

Надо,пишем:Вычисления5,2,6 и
т.д.Как вы
понимаете макросы — находка для лентяя.Они настолько могучи, что при их
содействии вы можете реализовать почти всё,что вам вздумается.Например
реализовать подобие директив языков высокого уровня и т.д.

Структуры

Это такая штука которая вам очень пригодиться.Вот как она выглядит:struct Чел.Вес         dd ?.Рост       dd ?.Возраст  dd ?endsВася ЧелТеперь вы можете заполннить эту структуру так:mov Вася.Вес],73mov Вася.Рост],175mov Вася.Возраст],30То
есть структура похожа на книжный шкаф.Мы знаем что в этом шкафу
детективы?Значит мы будем детиктивы искать в шкафу для детективов?Тогда
нам не стоит искать произведение Дж.Х.Чейза в шкафу где пылятся
мелодраммы.Так и здесь.Есть чел Вася.Мы храним данные о нём в структуре
по адрессу Вася.Нужно сохранить данные Пети?Петя Челmov Петя.Вес],50mov Петя.Рост],140mov Петя.Возраст],12Кроме того мы можем сделать так:struct Чел .Вес         dd ? .Рост       dd ? .Возраст  dd ? .Другое    Данныеendsstruct  Данные .Клёвый         dd ? .Плохой          dd ?endsДля заполнения данных о том насколько хорош чел Вася мы пищем:mov Вася..Другое.Клёвый],TRUEmov Вася..Другое.Плохой],FALSEСтруктуры
очень полезны и их активно используют как люди из Мелкософта,так и челы
из мира Linux(а также любой нормальный кодер).Значит ивы должны их
использовать.

Я знаю вы мало что поняли,но через пару месяцев вам эти знания
 будут нужны(так что хотя бы два раза перечитайте этот текст
когда
вам это понадобиться).И
помните:
Только практические занятия помогут вам освоить программирование под
виндовс!Тут теория — это костыль который поможет вам идти дальше, когда
вы захромаете на тяжком программерском пути(но никак не ноги которыми
вам надо будет уверенно топать к вершине программерского искуства).Вы
должны копировать нужные вам куски кода(из чужих исходняков) и из них
лепить свои проги.Со временем вы начнёите писать свои оригинальные
процедуры и вам станет намного легче реализовывать различные бредовые
идеи которые без сомнения у вас появяться если у вас есть склонность к
написанию программ.

Please download this files(If you dont loaded this files):

1.Fasmbook(Книга
о FASM:Инструкции Ассемблера,Директивы FASM,Теория)

2.Asm-ABC(Справочник
по инструкциям Ассемблера)

3.Fasm_preproc(Руководство
по построению макросов)

Вызываем printf из программы на MASM в Visual Studio 2015+

Прежде всего, оказывается, что в версиях Visual Studio начиная с 2015 функция printf и еще какие-то стандартные функции уже не экспортируются Microsoft’овской реализацией CRT, а являются встроенными (inline) и определены прямо в заголовочных файлах (например, stdio.h). Поэтому если вы напишите на ассемблере код, который вызывает printf и попробуете скомпоновать его с msvcrt.lib, то получите ошибку . Однако Microsoft оставила нам лазейку в виде ряда статически компонуемых библиотек (см. код ниже), которые экспортируют те функции, которые Microsoft сделала встроенными. Ниже приведен код, который вы можете скомпилировать компилятором ml.exe, который вы можете запустить например из командной строки Developer Command Prompt for VS, если у вас установлена Visual Studio (или можете создать и настроить проект в Visual Studio для программирования на MASM).

; MASM version of HelloWorld program using printf() function; We have to link to these libraries since Visual Studio 2015
includelib libcmt.lib
includelib libucrt.lib
includelib libvcruntime.lib
includelib legacy_stdio_definitions.lib.686P ; Pentium Pro or later.MODEL flat, stdcall.STACK 4096EXTERN printfNEAR.data
    mytext BYTE «Hello World!», 0Dh, 0Ah, .code; «PROC» directive is mandatory here, we can’t write just «main:» (don’t know why)
main PROC C
    push offset mytext
    call printf
    add esp, 4
    ret
main ENDP; it’s important that we use just «END» istead of «END main»; as we don’t want to set main as the entry point.
END

В процессе отладки вышеприведенного кода я наткнулся не только на ошибки компоновщика , но и на ошибки времени выполнения. Например, стоило мне написать в конце файла END main, а не просто END, как во время выполнения программы возникала ошибка . Дело в том, что функция main в данном случае не должна быть точкой входа (директива END задает точку входа), ею должна быть функция mainCRTStartup(), которая инициализирует стандартную библиотеку языка C. Функция mainCRTStartup() в конце концов сама вызовет нашу функцию main.
Если же я пытался не использовать директиву PROC рядом с меткой main, т. е. писал вот так:

main
    push offset mytext
    call printf
    add esp, 4
    ret

… то получал ошибку компоновки .

Вот еще несколько ресурсов по теме линковки программ со стандартной библиотекой языка C:

  • Dynamically linking with MSVCRT.DLL using Visual C++ 2005
  • Overview of potential upgrade issues (Visual C++)
  • How does the Import Library work? Details?

Регистр

Регистр — это область памяти в процессоре.

Значит так, регистры: eax/ax/ah/al,ebx/bx/bh/bl,edx/dx/dh/dl,ecx/cx/ch/cl,ebp/bp,esi/si,edi/di,esp/sp -это ячейки памяти,которые могут содержать следующее: 

  • операнды логических и арифметических операций 
  • компоненты адреса 
  • указатели на ячейки памяти

Регистры классифицируются по размерам и назначению.

Размеры регистров:

Регистры
бывают разных размеров : 8 бит, 16 бит, 32 бит (и больше ).
Вы можете использовать регистры как 8 и 16 размером бит.Некоторые
регистры являются частью других; например, если EAX содержит значение 12345678h, вот то, что содержат другие регистры.

EAX 12 34 56 78
AX 12 34 56 78
AH 12 34 56 78
AL 12 34 56 78

регистры ax, ah, al — части регистра eax. Eax это 32-битный
регистр , ax содержит младшие 16 бит (2 байта)
регистра eax, ah содержит старший байт регистра ax, и al
содержит младший байт регистра ax. Регистр ax — 16 битный,
al и ah — 8 битные. Получается:

eax = 12345678h
 (32-бит)ax = 5678h       (16-бит)ah = 56h         (8-бит )al = 78h         (8-бит )

Назначение регистров:

Универсальные регистры:
ebxeax/ax/ah/al ebx/bx/bh/bl edx/dx/dh/dl ecx/cx/ch/clmov eax,32  -mov ebx,20  -sub eax,ebx eax/ax/ah/al —ebx/bx/bh/bl edx/dx/dh/dl —ecx/cx/ch/cl

Регистры
указателя

esi (si)   -Индекс источникаedi (di)  -Индекс приемникаeip (ip)  -Указатель командыeipesi (si)edi (di)

Регистр EIP (или IP в 16-разрядных программах) содержит
указатель на команду, которую собирается выполнить процессор. Так что вы не
можете использовать регистр eip как универсальный.

Регистры
указателя стека

Сегментные
регистры

Сегментные регистры определяют сегмент(участок) памяти, которая используется.
Вероятнее всего, они вам не понадобятся в win32, потому, что windows
использует flat систему памяти. В DOS, память разделена на сегменты по 64kb,
так, что если вы хотите определить адрес памяти, вы определяете сегмент и
смещение (например 0172:0500 (сегмент:смещение)). В windows,
сегменты имеют размер 4Gb.Так что при адреассации  просто надо  указать смещение . Сегментные регистры
всегда — 16-битные.

Каждый сегментный регистр обеспечивает адресацию 64К памяти, которая
называется текущим сегментом. Как показано ранее, cегмент выравнен на
границу параграфа и его адрес в сегментном pегистре предполагает наличие
справа четырех нулевых битов.

Р е г и с т р CS. Регистр сегмента кода содержит начальный
адрес сегмента кода. Этот адрес плюс величина смещения в командном
указателе (IP) определяет адрес команды, которая должна быть выбрана
для выполнения. Для обычных программ нет необходимости делать ссылки
на регистр CS.

Р е г и с т р DS. Регистр сегмента данных содержит начальный
адрес сегмента данных. Этот адрес плюс величина смещения,
определенная в команде, указывают на конкретную ячейку в сегменте
данных.

Р е г и с т р SS. Регистр сегмента стека содержит начальный
адрес в сегменте стека.

 Р е г и с т р ES. Некоторые операции над строками используют
дополнительный сегментный регистр для управления адресацией памяти. В
данном контексте регистр ES связан с индексным регистром DI. Если
необходимо использовать регистр ES, ассемблерная программа должна его
инициализировать.

Регистры FS (только с 286+)  иGS (только с 386+) -Универсальные сегментные регистры.С чем их едят,не знаю…

32-разрядный режим адреса (переопределение размера адреса)32-Bit Address Mode (Address Size Override)

Компилятор MASM выдает переопределение размера адреса 0x67, если операнд памяти включает 32-разрядные регистры.MASM emits the 0x67 address size override if a memory operand includes 32-bit registers. Например, в следующих примерах вызывается переопределение размера адреса.For example, the following examples cause the address size override to be emitted:

В компиляторе MASM предполагается, что если 32-разрядное смещение отображается как операнд в памяти, то используется 64-разрядная адресация.MASM assumes that if a 32-bit displacement appears alone as a memory operand, 64-bit addressing is intended. В настоящее время не поддерживается 32-разрядная адресация с такими операндами.There is currently no support for 32-bit addressing with such operands.

Наконец, смешивание размеров регистров в пределах операнда памяти, как показано в следующем коде, приводит к ошибке.Finally, mixing register sizes within a memory operand, as demonstrated in the following code, generates an error.

Блог о софте

Nubia Red Magic 3: игровой смартфон с кулером «под капотом», Snapdragon 855 и ценником от $430
Если вы уже заскучали в эти долгие выходные дни — у Nubia есть, чем вас порадовать. Это презентация нового игрового смартфона Nubia Red Magic 3…

полный текст | 15:40 29 апреля

Motorola Razr на официальных рендерах: «раскладушка» с гибким дисплеем
На ресурсе Slashleaks появились официальные пресс-рендеры складного смартфона Motorola Razr. Что показали Изображения подтверждают предыдущие утечки об устройстве…

полный текст | 15:40 29 апреля

Инсайдер: Samsung Galaxy Note 10 Pro 4G получит аккумулятор на 4500 мАч с быстрой зарядкой
Несмотря на то, что до анонса Galaxy Note 10 ещё далеко в сети продолжают появляются подробности о новинке…

полный текст | 15:40 29 апреля

iPhone XI показался на новых изображениях: на этот раз вместе с iPhone XI Max
Инсайдер OnLeakes, совместно с изданием Cashkaro, продолжает публиковать качественные изображения будущих iPhone 2019. Что показал На этот раз, вместе с iPhone XI, инсайдер показал ещё iPhone XI Max…

полный текст | 15:40 29 апреля

CEO Realme: компания отправится покорять Европу и США
Наверняка, некоторые наши читатели слышали про компанию Realme. Это суббренд Oppo, который продаёт недорогие устройства, в основном на индийском рынке…

полный текст | 15:40 29 апреля

Синтаксис

Синтаксис языка ассемблера определяется системой команд конкретного процессора.

Набор команд

  • Команды пересылки данных (mov, lea и т. д.)
  • Арифметичекие команды (add, sub, imul и т. д.)
  • Логические и побитовые операции (or, and, xor, shr и т. д.)
  • Команды управления ходом выполнения программы (jmp, loop, ret и т. д.)
  • cbne — перейти, если не равно
  • dbnz — декрементировать, и если результат ненулевой, то перейти
  • cfsneq — сравнить, и если не равно, пропустить следующую команду

Инструкции

Типичный формат записи команд:
<source lang=»asm»> опкод </source>

  • Если изначально существовало два стандарта записи мнемоник (система команд была наследована от процессора другого производителя).

Например, процессор наследовал систему команд , расширил ее и поменял мнемоники (и обозначения регистров) на свой лад. Процессоры наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel. И в данный момент половина ассемблеров для Fireball работает с интеловскими мнемониками, а половина с мнемониками Zilog.

Директивы

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

  • определение данных (констант и переменных)
  • управление организацией программы в памяти и параметрами выходного файла
  • задание режима работы компилятора

Первая программа на ассемблере

Cтандартный «Hello World». Для вывода результатов я решила сразу использовать окна windows, а не консоль. По простой причине — так красивее.

.386
.model flat, stdcall
option casemap: none

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
msg_title db «Title», 0
msg_message db «Hello world», 0

.code
start:
invoke MessageBox, 0, addr msg_message, addr msg_title, MB_OK
invoke ExitProcess, 0
end start

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

.386

.model flat,stdcall

option casemapnone

includemasm32includewindows.inc

includemasm32includeuser32.inc

includemasm32includekernel32.inc

includelibmasm32libuser32.lib

includelibmasm32libkernel32.lib

.data

msg_title db»Title»,

msg_message db»Hello world»,

.code

start

invoke MessageBox,,addr msg_message,addr msg_title,MB_OK

invoke ExitProcess,

endstart

Запускаем редактор C:/masm32/qeditor.exe . Вводим текст программы. Сохраняем. При сохранении обязательно надо указать вместе с именем файла расширение «.asm» . Выбираем пункт меню «Project» -> «Build All». Если в коде нет ошибок, программа будет скомпилирована и рядом с файлом исходного кода появится симпатичный exe-файл.

TASM

Самый
популярный транслятор ассемблера времен MS-DOS,
созданный фирмой Borland
(известной в народе как Багдад), и полностью совместимый с MASM’ом вплоть до версий 6.x и поддерживающий свой
собственный режим IDEAL
с большим количеством улучшений и расширений.

Удобство
программирования, скромные системные требования и высокая скорость трансляции
обеспечивали TASM’у
лидерство на протяжении всего существования MS-DOS
(буква «T»
означает Turbo, вот
так — без ложной скромности). Но с появлением Windows популярность TASM’а стала таять буквально на глазах.
Не сумев (или не захотев) добиться совместимости с заголовочными файлами и
библиотеками, входящими в комплект SDK/DDK,
фирма Borland решила
поставлять свой собственный порт, причем далеко неидеальный. К тому же штатный
линкер tlink/tlink32 не поддерживает
возможности создания драйверов, а формат выходных файлов (MicrosoftOMF, IBMOMF, PharLap), не поддерживается текущими
версиями линкера от Microsoft(впрочем, 16-битные версии это умеют). В довершении ко
всему, формат отладочной информации не совместим с CodeView и реально поддерживается только
TurboDebugger’ом и soft-ice.

И хотя эти
проблемы в принципе разрешимы: возможность низкоуровневого ассемблерного
программирования (без включаемых файлов и макросов) осталась там же, где и
была, несовместимость форматов компенсируется наличием конверторов, но… преимущества
режима IDEAL над
стандартным синтаксисам MASM’а
день ото дня казались все менее и менее значительными, ряды поклонников редели
и в конце концов проект загнулся. Последней версией транслятора стал TASM 5.0, поддерживающая
команды вплоть до 80486 процессора. Отдельно был выпушен патч, обновляющий TASM до версии 5.3 и
поднимающий его вплоть до Pentium MMX,
однако, команды Pentium II
такие, например, как SYSENTER
как не работали, так и не работают. Поддержка уникода тоже отсутствует.

В настоящее
время Borland
прекратила распространение своего ассемблера и достать его можно только в
магазинах торгующих старыми CD-ROM или у какого-нибудь
коллекционера. Пацак по кличке !tE
выпустил пакет TASM 5+,
включающий в себя транслятор, линкер, библиотекарь, какое-то подобие
документации, несколько заголовочных файлов под Windows и пару демонстрационных
примеров. Когда будете искать это добро не перепутайте его с TASM32 фирмы Squak Valley
Software — это совершенно независимый кроссассемблер, ориентированный на
процессоры 6502,6800/6801/68HC11,
6805, TMS32010, TMS320C25, TMS7000, 8048, 8051,8080/8085, Z80, 8096/80C196KC, о которых большинство из
нас в лучшем случае просто слышало, что они есть.

Короче, TASM — это труп. Причем
вполне конкретный. Однако, для разработки прикладных приложений под Windows 16/32 и MS-DOS он все-таки подходит, особенно, если
вы уже имеете опыт работы с ним и некоторые собственные наработки (библиотеки,
макросы), с которыми жалко расставаться, а конвертировать под MASM – весьма проблематично. Возможно,
вам понравится бесплатный LazyAssembler
(автор — Половников Степан), совместимый с режимом IDEAL TASM и
поддерживающим команды из наборов MMX, SSE, SSEII, SSEIII, 3DNow!Pro.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий