Turbo assembler (tasm) 3.0.1

Команды ассемблера и команды процессора.

Стоит пояснить, что если к вопросу подойти формально строго, то команды процессора и команды ассемблера — это не одно и то же. Ассеммблер — хоть и низкоуровневый язык программирования, но иногда он без спроса программиста «корректирует код под себя». Причём у каждого ассемблера (masm, tasm, fasm) это может быть по-разному. Самый яркий пример — команда  ret. В ассемблерном коде мы запишем ret, а реальный ассемблер ассемблирует её как retf или retn 8. Может также изменяться код, добавлением в качестве выравнивания кода команды процессора nop (об этом ниже в статье) и т.п. Чтобы не усложнять суть вопроса, под понятиями  команды процессора и команды ассемблера мы будем подразумевать одно и то же.

Команды процессора (команды ассемблера) в большинстве своём работают с аргументами, которые в ассемблере называются операндами. Система машинного кода процессоров Intel содержит более 300 команд (команды процессора, сопроцессора, MMX-расширения, XMM-расширения). С каждым новым процессором их количество растёт. Для того, чтобы профессионально программировать, не надо зубрить и разбирать все команды процессора. При необходимости можно воспользоваться справочником. В процессе чтения статей, вы поймёте, что основная суть знания ассемблера состоит не в доскональном знании всех команд, а в понимании работы системы.

Не следует забывать, что команды процессор видит в виде цифр, которые можно рассматривать как данные. Например, команда NOP занимает один байт и её машинный код — 90h.

Начиная изучать язык низкого уровня, мы будем иметь дело с ограниченным набором старых-добрых команд процессора. Иные команды ассемблера понадобятся специалистам, заинтересованным в оптимизацией кода, связанного со сложными математическими расчетами данных большого объёма.

Основные (т.н. целочисленные) команды ассемблера позволяют написать практически любую программу для операционных систем MS-DOS и Windows. Количество команд ассемблера, которыми вы будете пользоваться будет расти со временем прохождения курса. Для более детального понимания, в последствии можете обратиться к справочнику команд.

Registers and Pseudo-Registers in MASM Expressions

You can use registers and pseudo-registers within MASM expressions. You can add an at sign (@) before all registers and pseudo-registers. The at sign causes the debugger to access the value more quickly. This at sign is unnecessary for the most common x86-based registers. For other registers and pseudo-registers, we recommend that you add the at sign, but it is not actually required. If you omit the at sign for the less common registers, the debugger tries to parse the text as a hexadecimal number, then as a symbol, and finally as a register.

You can also use a period (.) to indicate the current instruction pointer. You should not add an at sign before this period, and you cannot use a period as the first parameter of the r command. This period has the same meaning as the $ip pseudo-register.

For more information about registers and pseudo-registers, see Register Syntax and Pseudo-Register Syntax.

ПримечанияRemarks

Ассемблер IL весьма полезен разработчикам ПО для создания и внедрения генераторов IL.The IL Assembler helps tool vendors design and implement IL generators. Используя программу Ilasm.exe, компилятор и другие средства, разработчики могут сосредоточить свои усилия на работе с IL и создании метаданных, а не на преобразовании IL в формат PE-файла.Using Ilasm.exe, tool and compiler developers can concentrate on IL and metadata generation without being concerned with emitting IL in the PE file format.

Аналогично таким компиляторам для среды выполнения, как C# и Visual Basic, программа Ilasm.exe не создает промежуточные объектные файлы и при создании PE-файла позволяет пропустить этап связывания.Similar to other compilers that target the runtime, such as C# and Visual Basic, Ilasm.exe does not produce intermediate object files and does not require a linking stage to form a PE file.

Ассемблер IL может выразить все существующие метаданные и возможности IL языков программирования, предназначенные для взаимодействия со средой выполнения.The IL Assembler can express all the existing metadata and IL features of the programming languages that target the runtime. С его помощью можно адекватно выразить на ассемблере IL и скомпилировать с помощью программы Ilasm.exe управляемый код, написанный на любом из этих языков.This allows managed code written in any of these programming languages to be adequately expressed in IL Assembler and compiled with Ilasm.exe.

Примечание

Компиляция может завершиться ошибкой, если последняя строка кода в исходном IL-файле не имеет конечного пробела или символа конца строки.Compilation might fail if the last line of code in the .il source file does not have either trailing white space or an end-of-line character.

Программа Ilasm.exe может применяться совместно с сопутствующей программой — Ildasm.exe.You can use Ilasm.exe in conjunction with its companion tool, Ildasm.exe. Программа Ildasm.exe анализирует PE-файл, содержащий IL-код, и создает текстовый файл, подходящий для обработки программой Ildasm.exe.Ildasm.exe takes a PE file that contains IL code and creates a text file suitable as input to Ilasm.exe. Это полезно, к примеру, при компиляции кода на языке программирования, не поддерживающем все атрибуты метаданных среды выполнения.This is useful, for example, when compiling code in a programming language that does not support all the runtime metadata attributes. После компиляции кода и обработки результатов с помощью программы Ildasm.exe можно вручную добавить недостающие атрибуты в полученный текстовый IL-файл.After compiling the code and running the output through Ildasm.exe, the resulting IL text file can be hand-edited to add the missing attributes. Чтобы создать итоговый исполняемый файл, этот текстовый файл следует обработать с помощью программы Ilasm.exe.You can then run this text file through the Ilasm.exe to produce a final executable file.

Эту технологию можно также использовать для создания одного PE-файла из нескольких PE-файлов, созданных различными компиляторами.You can also use this technique to produce a single PE file from several PE files originally generated by different compilers.

Примечание

На данный момент такая технология не применяется к PE-файлам, содержащим встроенный машинный код (например, к PE-файлам, созданным компилятором Microsoft Visual C++).Currently, you cannot use this technique with PE files that contain embedded native code (for example, PE files produced by Visual C++).

Чтобы обеспечить наибольшую точность совместной работы программ Ildasm.exe и Ilasm.exe, по умолчанию ассемблер не заменяет короткие коды на длинные, которые могут быть в источниках IL (или созданы другим компилятором).To make this combined use of Ildasm.exe and Ilasm.exe as accurate as possible, by default the assembler does not substitute short encodings for long ones you might have written in your IL sources (or that might be emitted by another compiler). С помощью параметра /optimize можно заменить короткие коды там, где это возможно.Use the /optimize option to substitute short encodings wherever possible.

Примечание

Программа Ildasm.exe работает только с файлами, расположенными на жестком диске.Ildasm.exe only operates on files on disk. Программа не обрабатывает файлы, установленные в глобальном кэше сборок.It does not operate on files installed in the global assembly cache.

Дополнительные сведения о грамматике IL см. в файле asmparse.grammar в составе Windows SDK.For more information about the grammar of IL, see the asmparse.grammar file in the Windows SDK.

Версии MASM

Хотя MASM больше не является коммерческим продуктом, Microsoft продолжает поддерживать исходный код, используемый и в других продуктах Microsoft. С тех пор как Microsoft прекратила продавать MASM отдельно, было выпущено несколько обновлений к производственной линии MASM 6.x (последнее обновление — версия 6.15, которая была включена в Visual C++ 6.0), а после этого — MASM 7.0 в составе Visual C++ .NET 2002, MASM 7.1 в составе Visual C++ .NET 2003, MASM 8.0 в составе Visual C++ 2005 и MASM 9.0 в составе Visual C++ 2008, поддерживающие платформу x64. С версии 11 MASM снова выходит как независимый продукт, имеется 2 среды разработки обычный (qedit) и для юникода (uniedit).

TASM


1 |

Шаг 1 — Где взять и установка. (26.11.2001 — 32 Kb)Шаг 2 — Первая программа. (26.11.2001 — 32 Kb)Шаг 3 — Программа HelloWord. (26.11.2001 — 8 Kb)Шаг 4 — Что такое прерывание. (26.11.2001 — 2 Kb)Шаг 5 — Функция прерывания. (26.11.2001 — 2 Kb)Шаг 6 — Что такое регистры. (27.11.2001 — 4 Kb)Шаг 7 — Команда MOV. (27.11.2001 — 7 Kb)Шаг 8 — Регистр DS. (27.11.2001 — 9 Kb)Шаг 9 — Указатель на данные.(27.11.2001 — 13 Kb)Шаг 10 — Turbo Debugger для DOS.(27.11.2001 — 35 Kb)Шаг 11 — JMP или прыжок.(28.11.2001 — 12 Kb)Шаг 12 — Что такое стек.(28.11.2001 — 14 Kb)Шаг 13 — Организация цикла.(28.11.2001 — 7 Kb)Шаг 14 — Размер стека.(28.11.2001 — 10 Kb)Шаг 15 — Что такое IOCTL.(28.11.2001 — 5 Kb)Шаг 16 — Функция 09h вывод строк.(29.11.2001 — 6 Kb)Шаг 17 — Команда сравнения CMP.(29.11.2001 — 11 Kb)Шаг 18 — Переход по условию JE.(29.11.2001 — 9 Kb)Шаг 19 — Функция 44H подфункция 08H INT 21H проверка носителя.(29.11.2001 — 8 Kb)Шаг 20 — Устройство жесткого диска.(30.11.2001 — 7 Kb)Шаг 21 — Функция абсолютного чтения с диска 25h.(30.11.2001 — 18 Kb)Шаг 22 — Сравнение битов TEST.(05.12.2001 — 6 Kb)Шаг 23 — Turbo Debugger замена команд в ходе отладки.(05.12.2001 — 20 Kb)Шаг 24 — Функция получения символа (INT 21h 01H).(05.12.2001 — 7 Kb)Шаг 25 — Как обходят пароли.(05.12.2001 — 12 Kb)Шаг 26 — Master Boot Record.(11.12.2001 — 11 Kb)Шаг 27 — Двоичная система счисления.(23.12.2001 — 5 Kb)Шаг 28 — Двоичная система счисления дальше.(23.12.2001 — 2 Kb)Шаг 29 — Что такое ASCII.(23.12.2001 — 2 Kb)Шаг 30 — Использование INCLUDE.(27.12.2001 — 3 Kb)Шаг 31 — Процедуры.(27.12.2001 — 19 Kb)Шаг 32 — Адресация сегмент — смещени.(31.12.2001 — 6 Kb)Шаг 33 — Обмен значений команда XCHG.(31.12.2001 — 12 Kb)Шаг 34 — Из EXE в ASM.(31.12.2001 — 25 Kb)Шаг 35 — Переменные в программе на ассемблере.(02.01.2002 — 14 Kb)Шаг 36 — Функция 02h Вывод символа.(02.01.2002 — 8 Kb)Шаг 37 — Создание массивов.(02.01.2002 — 8 Kb)Шаг 38 — Выделение места под массив.(02.01.2002 — 5 Kb)Шаг 39 — Доступ к элементу массива.(02.01.2002 — 5 Kb)Шаг 40 — Функция 3dh — открытие файла. (05.02.2002 — 2 Kb)Шаг 41 — Регистр флагов. (05.02.2002 — 6 Kb)Шаг 42 — Регистры флагов и условные переходы. (05.02.2002 — 2 Kb)Шаг 43 — Функция 3eh закрытия файла. (05.02.2002 — 2 Kb)Шаг 44 — Функция 3fh чтение из файла. (05.02.2002 — 8 Kb)Шаг 45 — О флаге направления подробнее. (07.01.2002 — 8 Kb)Шаг 46 — Организация цикла и LOOP. (07.01.2002 — 8 Kb)Шаг 47 — Знакомимся с LODSB. (08.01.2002 — 8 Kb)Шаг 48 — Информация для отладчика. (08.01.2002 — 8 Kb)Шаг 49 — Отдельная таблица символов. (09.01.2002 — 24 Kb)Шаг 50 — Размещение включаемых файлов. (09.01.2002 — 10 Kb)


1 |

Автор Каев Артем

NASM

Транслятор NASM (расшифровывается как NetwideAssembler – Ассемблер
Шириной Во Всю Сеть или просто Расширенный Ассемблер) вырос из идеи, поданной
на comp.lang.asm.x86 (или возможно на alt.lang.asm — сейчас точно никто и
не помнит), когда не было ни одного хорошего свободного ассемблера под x86. FASM’а тогда еще не
существовало. MASM/TASM стоили денег и работали
только под MS-DOS/Windows. Единственный более-менее
работающий транслятор под UNIX –
GAS (GNUAssembler) завязан на
компилятор GCC и имеет
такой ужасный синтаксис, что писать на нем могут только мазохисты (и ведь
примеров программ, запрограммированных на GAS’е практически нет!). Остальные ассемблеры (типа A86, AS86) не позволяют писать 16/32
разрядный код или раздаются практически без документации.

Кончилось это
дело тем, что группа программистов во главе с Петром Анвином (Peter Anvin) решила
разработать собственный ассемблер и это у нее получилось! MASM-подобный синтаксис, достаточно мощная
макросистема (впрочем, несовместимая с MASM’ом и ничего не знающая об union’ах вместе с кучей других
полезных фич), поддержка всей линейки x86 процессоров вплоть до IA64 в x86-режиме,
богатство выходных файлов (bin, aout, aoutb, coff, elf, as86, obj, win32, rdf,
ieee), генерация отладочной информации в форматах Borland, STABS и DWARF2 вкупе
с портами под MS-DOS, Windows, Linux и BSD обеспечили NASM’у неслабую популярность, однако,
без ярко выраженного фанатизма, характерного для FASM’а. Количество ошибок в трансляторе довольно
велико, причем в отличии от _работающих_ продуктов (MASM/TASM) при «хитрых ошибках» NASM не падает, а генерирует ошибочный
(по структуре) объектный файл. Вот и ищи как он его сгенерировал чем хочешь
(даже матерым хакерам это сложно, а нормальный программист может даже и не
пытаться). И, как это принято в OpenSource-community, полное игнорирование
баг-репортов «неудобных» для авторов (разработки даже утверждают, что
ошибок в их трансляторе вообще нет, в смысле им не известен ни один). Тем не
менее, в последней версии NASM’а,
в зависимости от значения ключа -On, код может сгенерироваться в 2х или более
экземплярах, или может пропасть весь экспорт (pubdef’ы).

К минусам NASM’а можно отнести
отсутствие поддержки уникода, платформы AMD x86-64, формата отладочной информации CodeView и некоторые странности синтаксиса.
В частности, команда «mov eax, 1» не оптимизируется и транслятор
умышленно оставляет место для 32-разрядного операнда. Если же мы хотим получить
«короткий» вариант, размер операнда необходимо специфицировать явно:
«mov eax, byte 1», что очень сильно
напрягает или… использовать опцию «-On» для автоматической
оптимизации.

Также
необходимо принудительно указывать длину переходов short или near, иначе очень легко нарваться на
ругательство «shortjumpoutofrange».
Впрочем, опять-таки, существует возможность настроить транслятор на генерацию near-переходов по умолчанию.

Гораздо хуже,
что NASM не помнит типы
объявляемых переменных и не имеет нормальной поддержки структур (впрочем, самое
понятие «нормальности» структур в ассемблере весьма растяжимо и
каждый волен трактовать его по своему).

Из мелких
недочетов можно называть невозможность автоматического генерации короткого
варианта инструкции «push imm8» и отсутствие контроля за
соответствием транслируемых инструкций типу указанного процессора (команда
«cpuid» под «.486» ассемблируется вполне нормально, а ведь
не должна).

Непосредственная
трансляция примеров из SDK/DDK под NASM’ом невозможна, так что
разрабатывать на нем драйвера под Windows может только очень крутой поклонник или извращен. NASM — один из лучших
ассемблеров под Liux/BSD, а вот под Windows его позиции уже не
так сильны (в основном из-за неполной совместимости с MASM’ом).

История

В начале 1990-х годов альтернативные ассемблеры, вроде Borland TASM и свободного ассемблера NASM, начали отбирать часть доли рынка MASM. Однако, два события в конце 1990-х позволили MASM сохранить большую часть своей доли: сначала Microsoft прекратила продавать MASM как коммерческий продукт и начала распространять его бесплатно как часть DDK (англ. Device Driver Kit — набор для создания драйверов). Во-вторых, благодаря пакету MASM32 и обучающим программам Iczelion’а Win32 оказалось, что программирование на MASM возможно и в среде Microsoft Windows. В 2000 году MASM 6.15 был выпущен как часть пакета разработки Visual C++ и все версии Visual C++ после 6.0 включали в себя версию MASM, равную версии Visual C++. Позже в Visual C++ 2005 появилась 64-разрядная версия MASM. Вместе с большим сообществом программистов MASM эти события помогли остановить снижение популярности MASM по сравнению с другими ассемблерами. Сегодня MASM продолжает использоваться на платформе Win32, несмотря на конкуренцию с новыми продуктами, такими как NASM, fasm, TASM, HLASM.

Symbols in MASM Expressions

In MASM expressions, the numeric value of any symbol is its memory address. Depending on what the symbol refers to, this address is the address of a global variable, local variable, function, segment, module, or any other recognized label.

To specify which module the address is associated with, include the module name and an exclamation point (!) before the name of the symbol. If the symbol could be interpreted as a hexadecimal number, include the module name and an exclamation point, or just an exclamation point, before the symbol name. For more information about symbol recognition, see Symbol Syntax and Symbol Matching.

Use two colons (::) or two underscores (__) to indicate the members of a class.

Use a grave accent (`) or an apostrophe (‘) in a symbol name only if you add a module name and exclamation point before the symbol.

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

Программа Hello World на MASM32, которая выводит это сообщение и завершается.

    .386
    .model flat, stdcall
    option casemap none
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\kernel32.lib
    .code
    start:
      print "Hello world"
      exit
    end start

Пример той же программы на языке MASM версии 4.0 для процессора Intel 8086.

include io.asm
   data segment
        x db 'Hello world!', '$'
   data ends
  stack segment stack
        db 128 dup (?)
  stack ends
   code segment 
        assume cs code, ds data, ss stack
 start: mov ax, data
        mov ds, ax
        lea dx, x
        outstr
        finish
   code ends
        end start

Пример той же программы для MS-DOS на языке MASM версии 6.1 для процессора Intel 8086.

    .model tiny
    .code
    .startup
    mov dx, offset Hello
    mov ah, 9
    int 21h
    .exit
    Hello db 'Hello world!$'
    end
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector