Org 100h – MASM, TASM и WASM

MASM, TASM и WASM

Главная / Ассемблер / Для чайников / Быстрый старт /

Ассемблеры MASM, TASM и WASM отличаются между собой. Однако создание простых программ для них практически не имеет отличий, за исключением самого ассемблирования и компоновки.

Итак, наша первая программа для MASM, TASM и WASM, которая выводит английскую букву «A» в текущей позиции курсора, то есть в левом верхнем углу экрана:


       .model tiny
       .code
       ORG    100h
start: MOV    AH,2
       MOV    DL,41h
       INT    21h
       INT    20h
       END    start
Этот текст можно набрать в любом простом текстовом редакторе – например в БЛОКНОТЕ (NotePad) от WINDOWS (но не в Word и не в другом «навороченном»). Однако я рекомендую «продвинутый» текстовый редактор с подсветкой синтаксиса, например, PSPad (см. раздел ВВЕДЕНИЕ). Затем сохраняем этот файл с расширением .asm, например, в папке MYPROG. Назовем файл atest. Итак, мы получили: C:\MYPROG\atest.asm.

ПРИМЕЧАНИЕ
Обратите внимание, что в первой команде мы записали 2 вместо 02h. MASM, TASM и WASM, как и Emu8086, допускают такие «вольности». Хотя можно написать 02h – ошибки не будет.

Пояснения к программе:

.model tiny – 1-ая строка. Директива .model определяет модель памяти для конкретного типа файлов. В нашем случае это файл с расширением COM, поэтому выбираем модель tiny, в которой объединены сегменты кода, данных, и стека. Модель tiny предназначена для создания файлов типа СОМ.

.code – 2-ая строка. Эта директива начинает сегмент кода.

ORG 100h – 3-ая строка. Эта команда устанавливает значение программного счетчика в 100h, потому что при загрузке СОМ-файла в память, DOS выделяет под блок данных PSP первые 256 байт (десятичное число 256 равно шестнадцатеричному 100h). Код программы располагается только после этого блока. Все программы, которые компилируются в файлы типа СОМ, должны начинаться с этой директивы.

start: MOV AH, 02h – 4-я строка. Метка start располагается перед первой командой в программе и будет использоваться в директиве END, чтобы указать, с какой команды начинается программа. Инструкция MOV помещает значение второго операнда в первый операнд. То есть значение 02h помещается в регистр АН. Для чего это делается? 02h — это ДОСовская функция, которая выводит символ на экран. Мы пишем программу для DOS, поэтому используем команды этой операционной системы (ОС). А записываем мы эту функцию (а точнее ее номер) именно в регистр АН, потому что прерывание 21h использует именно этот регистр.

MOV DL, 41h – 5-я строка. Код символа «A» заносится в регистр DL. Код символа «A» по стандарту ASCII – это число 41h.

INT 21h – 6-я строка. Это и есть то самое прерывание 21h – команда, которая вызывает системную функцию DOS, заданную в регистре АН (в нашем примере это функция 02h). Команда INT 21h – основное средство взаимодействия программ с ОС.

INT 20h – 7-я строка. Это прерывание, которое сообщает операционной системе о выходе из программы, и о передаче управления консольному приложению. В том случае, если программа уже откомпилирована и запущена из ОС, команда INT 20h вернет нас в ОС (например, в DOS).

END start – 8-я строка. Директива END завершает программу, одновременно указывая, с какой метки должно начинаться ее выполнение.

Ну вот, программу мы написали. Но хотелось бы посмотреть, как она работает. Для этого нужно сначала вызвать ассемблер, чтобы скомпилировать ее в объектный файл, а затем вызвать компоновщик, который из объектного файла создаст исполняемый файл, то есть программу типа COM. Для разных ассемблеров придётся выполнять эти действия по разному.


av-assembler.ru

Emu8086

Главная / Ассемблер / Для чайников / Быстрый старт /

Если вы скачали и установили эмулятор процессора 8086 (см. раздел ВВЕДЕНИЕ), то вы можете использовать его для создания ваших первых программ на языке ассемблера. На текущий момент (ноябрь 2011 г) доступна версия программы 4.08. Справку на русском языке вы можете найти здесь: Справка Emu8086.

Программа Emu8086 платная. Однако в течение 30 дней вы можете использовать её для ознакомления бесплатно.

Итак, вы скачали и установили программу Emu8086 на свой компьютер. Запускаем её и создаём новый файл через меню FILE – NEW – COM TEMPLATE (Файл – Новый – Шаблон файла COM). В редакторе исходного кода после этого мы увидим следующее:

Рис. 1.1. Создание нового файла в Emu8086.

Здесь надо отметить, что программы, создаваемые с помощью Ассемблеров для компьютеров под управлением Windows, бывают двух типов: COM и EXE. Отличия между этими файлами мы рассмотрим позже, а пока вам достаточно знать, что на первое время мы будем создавать исполняемые файлы с расширением COM, так как они более простые.

После создания файла в Emu8086 описанным выше способом в редакторе исходного кода вы увидите строку «add your code hear» — «добавьте ваш код здесь» (рис. 1.1). Эту строку мы удаляем и вставляем вместо неё следующий текст:


MOV AH, 02h
MOV DL, 41h
INT 21h
INT 20h
Таким образом, полный текст программы будет выглядеть так:


ORG 100h

MOV AH, 02h
MOV DL, 41h
INT 21h
INT 20h

RET
Кроме этого в верхней части ещё имеются комментарии (на рис. 1.1 – это текст зелёного цвета). Комментарий в языке Ассемблера начинается с символа ; (точка с запятой) и продолжается до конца строки. Если вы не знаете, что такое комментарии и зачем они нужны, см. книгу Как стать программистом. Как я уже говорил, здесь мы не будем растолковать азы программирования, так как книга, которую вы сейчас читаете, рассчитана на людей, знакомых с основами программирования.

Также отметим, что регистр символов в языке ассемблера роли не играет. Вы можете написать RET, ret или Ret – это будет одна и та же команда.

Вы можете сохранить этот файл куда-нибудь на диск. Но можете и не сохранять. Чтобы выполнить программу, нажмите кнопку EMULATE (с зелёным треугольником) или клавишу F5. Откроется два окна: окно эмулятора и окно исходного кода (рис. 1.2).

Рис. 1.2. Окно эмулятора Emu8086.

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

В окне эмулятора вы можете запустить вашу программу на выполнение целиком (кнопка RUN) либо в пошаговом режиме (кнопка SINGLE STEP). Пошаговый режим удобен для отладки. Ну а мы сейчас запустим программу на выполнение кнопкой RUN. После этого (если вы не сделали ошибок в тексте программы) вы увидите сообщение о завершении программы (рис. 1.3). Здесь вам сообщают о том, что программа передала управление операционной системе, то есть программа была успешно завершена. Нажмите кнопку ОК в этом окне и вы увидите, наконец, результат работы вашей первой программы на языке ассемблера (рис. 1.4).

Рис. 1.3. Сообщение о завершении программы.

Рис. 1.4. Ваша первая программа выполнена.

Как мы уже говорили, наша первая программа выводит на экран английскую букву «А». Результат оправдал наши ожидания – буква «А» выведена на экран.

Здесь стоит отметить, что Emu8086 – это ЭМУЛЯТОР, то есть он эмулирует работу компьютера с процессором 8086. Поэтому в описанном выше примере программа выполняется не операционной системой, а эмулятором. Emu8086 может создавать и реальные программы, которые могут самостоятельно выполняться на компьютере. Но описание работы с Emu8086 не входит в наши планы. Читайте справку и экспериментируйте – всё у вас получится.

В нашем случае пока не важно, как выполняется программа – эмулятором или операционной системой. Главное – разобраться с вопросом создания программ на языке ассемблера. Поэтому разберём нашу простенькую программку подробно.

#make_COM# – 1-ая строка. Эта команда – специфическая для Emu8086. Она используется для определения типа создаваемого файла. В нашем случае это файл с расширением .COM.

ORG 100h – 2-ая строка. Эта команда устанавливает значение программного счетчика в 100h, потому что при загрузке СОМ-файла в память, DOS выделяет под блок данных PSP первые 256 байт (десятичное число 256 равно шестнадцатеричному 100). Код программы располагается только после этого блока. Все программы, которые компилируются в файлы типа СОМ, должны начинаться с этой директивы.

MOV AH, 02h – 3-я строка. Инструкция (или команда) MOV помещает значение второго операнда в первый операнд. То есть значение 02h помещается в регистр АН. Для чего это делается? 02h – это ДОСовская функция, которая выводит символ на экран. Мы пишем программу для DOS, поэтому используем команды этой операционной системы (ОС). А записываем мы эту функцию (а точнее ее номер) именно в регистр АН, потому что прерывание 21h использует именно этот регистр.

MOV DL, 41h – 4-я строка. Код символа «A» заносится в регистр DL. Код символа «A» по стандарту ASCII – это 41h.

INT 21h – 5-я строка. Это и есть то самое прерывание 21h – команда, которая вызывает системную функцию DOS, заданную в регистре АН (в нашем примере это функция 02h). Команда INT 21h – основное средство взаимодействия программ с ОС.

INT 20h – 6-я строка. Это прерывание, которое сообщает операционной системе о выходе из программы и о передаче управления консольному приложению. Значит, при использовании INT 20h в нашем примере, управление будет передаваться программе Emu8086. А в том случае, если программа уже откомпилирована и запущена из ОС, то команда INT 20h вернет нас в ОС (например, в DOS). В принципе, в случае с Emu8086 эту команду можно было бы пропустить, так как эту же функцию выполняет команда RET, которая вставляется в исходный текст автоматически при создании нового файла по шаблону (как это сделали мы ранее). Но я решил использовать INT 20h и здесь для совместимости с другими ассемблерами.

Тем, кому не все понятно из этих объяснений, рекомендую почитать книгу Как стать программистом, а также следующие главы.


av-assembler.ru

use16 org 100h jmp start

  • use16                

  • org 100h                  

  •     jmp start            

  •  

  • file_name db ‘hello.txt’,0

  • output_file_name db ‘ans.txt’,0

  • s_error   db ‘Error!’,13,10,’$’

  • endline   db 13,10,’$’

  • buffer    rb 81

  • res       db 81, 79 dup (0)        

  • char      db ‘o’

  • handle    rw 1  

  • size db 30        

  •  

  • start:

  •     mov ah,3Dh          

  •     xor al,al              

  •     mov dx,file_name      

  •     xor cx,cx              

  •     int 21h            

  •     jnc @F              

  •     call error_msg        

  •     jmp exit          

  • @@: mov [handle],ax        

  •  

  •     mov bx,ax          

  •     mov ah,3Fh          

  •     mov dx,buffer      

  •     mov cx,80              

  •     int 21h                

  •     jnc @F                

  •     call error_msg          

  •     jmp close_file          

  •  

  • @@:  

  •     push res

  •     push buffer

  •     call proc1            

  •  

  •     mov ah,3Ch              ;Функция DOS 3Ch (создание файла)

  •     mov dx,output_file_name        ;Имя файла

  •     xor cx,cx               ;Нет атрибутов — обычный файл

  •     int 21h                 ;Обращение к функции DOS

  •     jnc @F                  ;Если нет ошибки, то продолжаем

  •     call error_msg          ;Иначе вывод сообщения об ошибке

  •     jmp exit                ;Выход из программы

  • @@: mov [handle],ax         ;Сохранение дескриптора файла

  •  

  •     mov bx,ax               ;Дескриптор файла

  •     mov ah,40h              ;Функция DOS 40h (запись в файл)

  •     mov dx,res

  •     add dx, 2           ;Адрес буфера с данными

  •     movzx cx,[size]         ;Размер данных

  •     int 21h                 ;Обращение к функции DOS

  •     jnc close_file          ;Если нет ошибки, то закрыть файл

  •     call error_msg          ;Вывод сообщения об ошибке

  •  

  • close_file:

  •     mov ah,3Eh              ;Функция DOS 3Eh (закрытие файла)

  •     mov bx,[handle]         ;Дескриптор

  •     int 21h                 ;Обращение к функции DOS

  •          ;Вывод сообщения об ошибке

  •  

  • exit:              

  •     mov ax,4C00h            

  •     int 21h                

  •  

  • error_msg:

  •     mov ah,9

  •     mov dx,s_error

  •     int 21h                

  •     ret

  •  

  • proc1:

  •  

  •     push bp

  •     mov bp, sp

  •     mov di, char

  •     mov ah, [di+2]

  •     mov di, [bp+4]

  •     mov si, [bp+6]

  •     mov cl, [size]

  •     add si, 2

  • a:

  •     mov al, [di]

  •     cmp al, ‘o’

  •     je b

  •     mov [si], al

  •     add si, 1

  • b:

  •     add di, 1

  • loop a

  •     pop bp

  •     ret

  • pastebin.com

    Оставить комментарий

    Добавить комментарий

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