Паше.pptx
- Количество слайдов: 35
XIII Ассемблер Содержание 13. 1 Синтаксис Ассемблера Сдвиговые операции 13. 2. Структура программы. Распределение памяти 13. 5. Разветвляющиеся процессы Адресация в IBM-компьютерах Безусловные переходы Распределение в памяти Команды условного перехода и организация разветвляющихся процессов 13. 3. Регистры и их назначение 13. 4. Линейные процессы Команда пересылки MOV Команда XCHG Команды сложения и вычитания Команда изменения знака Команда умножения Команда деления Изменение размера данных Примеры умножения и деления для знаковых величин Задачи на разветвляющиеся процессы 13. 6. Циклические процессы 13. 7. Косвенная адресация 13. 8. Работа с массивами 13. 9. Параметр указания типа 13. 10. Организация ЕХЕ - программ 13. 11. Организация СОМ - программ 13. 12. Обработка программ на Ассемблере Дополнительно. Работа в машинных кодах. Асемблер –машинно-ориентированный язык, позволяющий использовать аппаратную реализацию ЭВМ и сделать программу эффективной по времени. В данной программе будет рассказано об Ассемблере семейства IBM PC, в том числе и встроенном в Паскаль.
13. 1 Синтаксис Ассемблера Язык Ассемблера, как и любой другой, имеет свой алфавит, свои слова, предложения, текст. Вот простейшая схема структуры языка: Рис. 1 Рассмотрим схему с Рис. 1 снизу вверх. Алфавит ассемблера включает в себя латинские буквы от А до Z (заглавные или строчные – роли не играет), цифры от 0 до 9 и спецсимволы: @ $ ? , ; : () [ ] “ ‘ _. Слова Слово может представлять собой: Метку КОП (код операции) Операнд Комментарий Метка – это необязательная часть оператора. Метка не должна содержать более 31 символа, начинаться должна только с буквы, точки или @. Вот пример метки: [@ Frag]. Все остальные символы могут присутствовать, но не в начале. Во встроенном в Паскаль ассемблере метка должна описываться в поле LABEL. Если же метка начинается с. или @, то описывать ее поле LABEL не надо.
Код операции – это обязательная часть любого оператора, исполняемого или неисполняемого. Как правило, состоит из 2, 3, 4 букв. Список основных КОП представлен в Таблице 1. Операнд(ы). Количество операндов зависит от машины, на которой идёт работа, а также и от кода операции. Операндов может и не быть. Например, команда RET – вернуться в верх стека – без операндов, или INC A - сложение операнда с « 1» - один операнд, или ADD AX, 5 – сложение – 2 операнда. Комментарий. Признаком комментария является точка с запятой. Все символы после точки с запятой не вырабатывают коды. Длина комментария ограничена длиной строки. Во встроенном в Паскаль ассемблере комментарий заключается в { }.
Предложение – это операторы и псевдокоманды. Поле одно от другого отделяется символом, пробелом или нажатием клавиши Tab. Максимальное количество символов – 132, но лучше работать на 80, чтобы хватило места на экране. Выравнивание производится по КОП. Исполняемый оператор – это команда процессору на исполнение. Синтаксис исполняемого оператора выглядит так: [метка] КОП [операнды] [комментарий] Неисполняемый оператор называется псевдокомандой. Неисполняемые операторы нужны не исполнительной системе, а транслятору для распределения и заполнения памяти, а также для организации листинга. Определение данных: Данные имеют две характеристики: длина данных n и выражение для этих данных. D используется вместо КОП. [метка] D n <выражение> В зависимости от того какие данные n: B – байт (byte); W – слово (word); Q – учетверенное слово; T – удесятеренное слово;
Выражение: 1. Константы (не изменяется во время работы программы) бывают: · Десятеричные D (допустимо отсутствие D) 2. Знак вопроса ? ставится в случае, если данные еще не определены. Таким образом, мы резервируем ячейки под результат и промежуточные данные, которые заполнятся во время работы программы. Например, X DB 5 D X DB 5 · Шестнадцатеричные H (должны всегда начинаться с цифры) Например, Y DW 5 FA 7 H Y 1 DW OFFFFH · Двоичные B 3. Совокупность данных, перечисленных через запятую. Например, MAS 11, 12, 13, 14 4. Дублирование [метка] D n <константа> DUP <выражение> Например, B DB 4 DUP ? {4 неопределенных слова} Например, Z DB 1100 B · Восьмеричные Q (O) Например, Z 1 DB 377 Q 5. Строковая константа всегда определяется как совокупность более двух символов, заключенных в апострофы. Записывается как байт. Например, S DB ‘ACS 1’ Текст - это готовая программа: Абсолютная (. СОМ) – перемещается в место, указанное программистом. Перемещаемая (. ЕХЕ) – её распределяет в свободное памяти загрузчик, также он может разбить программу на куски, обеспечивая ссылки. Вот пример программы, написанной на Ассемблере, встроенном в Паскаль:
13. 2. Структура программы. Распределение памяти Адресация в IBM-компьютерах В IBM-компьютерах адресуется каждый байт. В Ассемблере можно обращаться как к байту, так и к слову. Младший байт слова имеет меньший адрес, чем старший. Поэтому данные хранятся в попарно перевернутом виде. Исполнительная система знает об этом и обрабатывает их соответствующим образом. Об этом также должен знать и программист при отладке и изменении значений в ОЗУ. Например, Распределение в памяти Все сегментные регистры шестнадцатиразрядные. Размер самого сегмента определяется смещением от 0 до 64 к. Начальный адрес тоже в пределах от 0 до 64 к. Абсолютный адрес состоит из начального адреса и смещения по сегменту кодов. Таким образом, получается смещение 2 байта и начальный адрес 2 байта – абсолютный адрес занимает 4 байта. Чтобы начальный адрес оказался больше 64 к, нужно выровнять его по краю параграфа. Для этого обнуляется младший полубайт и прибавляется смещение. Существует специальная команда PARA – выравнивание по краю параграфа.
13. 3. Регистры и их назначение В IBM всего 14 регистров (также их называют аккумуляторы, сумматоры). 1. Сегментные регистры CS, DS, SS, ES Сегментные регистры адресуют начальный адрес сегментов. 2. Регистры общего назначения (РОНы) AX, BX, CX, DX. Такие регистры предназначены для засылки в них операндов и исполнения основных арифметических операций. Эти регистры шестнадцатиразрядные. Рассмотрим регистр AX: В AH хранятся старшие разряды числа, а в AL – младшие. Таким образом, для 8 -битовых данных имеем 8 регистров, т. к. с каждым можно работать в отдельности. Каждый из РОНов имеет свои особенности, но для всех них применимы операции сложения и вычитания. АХ – самый быстрый и доступный РОН. В АХ очень удобно хранить текущие данные. Только в регистре АХ можно изменять размер числа. Через AX производится умножение и деление. Ввод и вывод. DX – работает в регистровой паре с регистром АХ (DX : AX) и участвует в операциях умножения и деления (по умолчанию). Хранит чаще всего старшие разряды типа longint. BX – индексный регистр. Единственный регистр, который хранит адреса. СХ – регистр-счетчик. Только СХ может считать число повторений в цикле с параметром LOOP. При сдвиговых операциях СХ может хранить число сдвигов.
3. Регистр командного указателя IP – регистр счетчика команд. Хранит смещение в сегменте кодов. Таким образом, абсолютный адрес представляет из себя сумму CS и IP. 4. Индексные регистры SI и DI предназначены для хранения адресов и связаны с сегментом стека. 5. Регистровые указатели SP и BP регистры предназначены для работы с сегментом стека. В ВР можно хранить адреса. Через эти регистры идет пересылка в стек. Редко используются для сложения и вычитания. 6. Флаговый регистр * - неактивные биты Ниже перечислены все задействованные элементы этого регистра. О – переполнение (указывает на переполнение старшего байта). D – направление (обозначает левое или правое направление пересылки или сравнение строковых данных). I – прерывание (указывает на возможность внешних прерываний). Т – пошаговый режим (устанавливается программой так, что возможно пошаговое выполнение каждой команды для проверки и изменения содержимого регистров и памяти). S – знак (содержит результирующий знак после арифметической операции 0 – «+» , 1 – «-» ). Z – ноль (показывает результаты арифметических операций и результаты сравнения 1 – « 0» 0 – «<> 0» ). А – внешний перенос (содержит перенос из третьего бита в 8 -битовых данных. Используется в специальных арифметических операция Р – контроль чётности (паритет – четность веса вектора. Показывает четность младших 8 -битовых данных по их суммам, 1 – четная сумма, 0 – нечетная). С – перенос (содержит перенос из старшего бита после арифметических операций, а также последний бит при сдвигах).
13. 4. Линейные процессы Команда пересылки MOV op 1, op 2 op 1: =op 2 Данная команда флагов не меняет. Введем обозначения: r − регистр m – ячейка памяти i − константа Sr – сегментный регистр (но не CS) Особенности команды MOV: • Оба оператора обязательно должны быть равной длины X DB 100 Y DW 300 MOV AL, X MOV AX, Y • При работе с регистрами формально в АХ можно записать Х, но лучше этого не делать из-за возможного изменения данных. Нельзя переписывать из ячейки памяти в ячейку памяти. Это можно делать только через РОН. MOV AX, M MOV N, AX ; <AX>: =M ; N: =<AX>=M • Sr– сегментный регистр. В него нельзя записать константу и значение из ячейки памяти. Это тоже делают через РОН. DS <- 1000 H MOV AX, 1000 H MOV DS, AX • Cs– начальный адрес сегмента кода. Адреса в сегменте может поменять только команда условного перехода Jump.
Команда XCHG op 1, op 2 op 1<->op 2 Команда меняет местами операнды. M DB 20 D N DB 30 D MOV AL, M MOVAH, N XCHG AL, AH Поменять местами 2 ячейки памяти можно через РОНы N <-> M MOV AL, M ; <AL>: =M XCHG AL, N ; <AL>: =N; N: =M MOV M, AL ; <M>: =N
Команды сложения и вычитания 1. Сложение ADD op 1, op 2 op 1: =op 1+op 2 Команда ADD меняет все арифметические флаги. Флаги формируются на конечном значении первого операнда. Оба операнда равной длины. Вперемешку могут быть лишь знаковые и беззнаковые числа. INC op op: =op+1 INC op – инкремент, поразрядная операция, наращивает операнд на единицу, флагов не меняет. 2. Вычитание SUB op 1, op 2 op 1: =op 1 -op 2 См. Таблицу Команда SUB меняет все арифметические флаги. Флаги формируются на конечном значении первого операнда. Оба операнда равной длины. Вычитать можно как знаковые, так и беззнаковые операнды. DEC op op: =op-1 DEC op – декремент, поразрядная операция, уменьшает операнд на единицу, флагов не меняет. 3. Команды сложения и вычитания для расширенной арифметики с использованием флага С. ADC op 1, op 2 SBB op 1, op 2 op 1: = op 1+op 2+CF op 1: =op 1 -op 2 -CF См. Таблицу Данные команды используются, когда данные в два машинных слова
Команда изменения знака NEG op op: =-op Исключение: не может использоваться для -128 Команда умножения MUL op – для беззнаковых чисел IMUL op – для знаковых чисел. Команды меняют все флаги, имеют 1 операнд – это второй сомножитель, он может быть ячейкой памяти или регистром. Первый операнд зависит от величины второго и хранится в регистре AX[L]. Сомножители должны быть одинаковой длины, умножать можно: Байт на байт, результат в АХ. Слово на слово, результат в AX: DX. Команда деления DIV op – для беззнаковых чисел. IDIV op – для знаковых чисел. Команды меняют все флаги. op – или регистр, или ячейка памяти. Делимое всегда в два раза больше делителя. Делить можно: Слово на байт, результат в АХ, причем остаток от деления в АН, а неполное частное в AL. Двойное слово на слово, результат в DX: АХ, причем остаток от деления в DX, а неполное частное в AX. При делении остановка возможна в двух случаях: · · деление на 0; сообщение о делении на 0, но на самом деле просто не хватает место под результат. Например, MOV AX, 750 MOV BL, 2
Изменение размера данных Данная операция по-разному производится для знаковых и беззнаковых данных. § Беззнаковые данные Чтобы сделать байт длиной в слово достаточно: § MOV AH, 0 Знаковые данные Для того чтобы преобразовать знаковые величины, нужно: байт в слово AH: =0, если AL>=0 и AH: =0 FFH, если AL<0 Для этого придумали команду CBW – конвертирование байт в слово. По умолчанию для находящихся только в AL. Превращение в двойное слово: DX: =0 , если AX>=0 и DX: =0 FFFFH, если AX<0 Для этого придумали команду CWD – конвертирование слова в двойное слово. По умолчанию для находящихся только в AХ. Обе эти команды флагов не меняют.
Примеры умножения и деления для знаковых величин Знаковое умножение: K DB 60 H L DB 30 H W DW 600 H Y DW 300 H 1. байт*байт MOV AL, K IMUL L Результат в AX 2. слово*слово MOV AX, Y IMUL W Результат в DX: AX 3. байт*слово MOV AL, K CBW IMUL Y Результат в DX: AX Для беззнаковых то же самое, только умножение MUL и расширение происходит c помощью засылки в АН 0 (MOV AH, 0).
Знаковое деление: K DB 80 H L DB 16 H W DW 200 H Y DW 0010 H Х DW 1000 H 1. слово/байт MOV AX, W IDIV L Результат в AX 2. байт/байт MOV AL, K CBW IDIV L Результат в AX 3. двойное слово/ слово MOV DX, Y MOV AX, X IDIV W Результат в DX: AX 4. слово/слово MOV AX, W CWD IDIV Y Результат в DX: AX Для беззнаковых то же самое, только деление DIV и расширение происходит c помощью засылки в DX 00 H (MOV DX, 00 H).
Сдвиговые операции Сдвигать можно байт или слово, находящееся в регистре или в ячейке памяти. Константу сдвигать нельзя. Байт можно сдвинуть на 8 разрядов, а слово на 16. Сдвинуть можно вправо и слево. Сдвиги бывают логические, арифметические, циклические и циклические с использованием CF. Синтаксис: КОП ор, <количество сдвигов> Если сдвиг один, то он может быть задан как константа. Если сдвигов больше, то количество записывается в регистр-счетчик CL. Логический сдвиг SHL op, 1 (сдвиг влево) SHR op, CL (сдвиг вправо) Рис. 7. 1 Сдвиг вправо Рис. 7. 2 Сдвиг влево MOV AX, 1100 B MOV CL, 3 SHR AL, 1 ; результат: 0110 CF=0 SHR AL, CL ; результат: 00001100 CF=0, 1, 1 Логический сдвиг влево используется для умножения беззнаковых и знаковых чисел на степень двойки, а также для целочисленного деления беззнаковых величин на степень двойки.
Арифметический сдвиг Используется для деления на степень двойки знаковых чисел. SAL op, n SAR op, n Рис. 8. 1 Сдвиг вправо (производится с размножением знакового разряда) Рис. 8. 2 Сдвиг влево MOV AL, 1100 B SAR AL, 1 MOV CL, 3 ; результат: 11100110 B CF=0 SAR AL, CL ; результат: 11111100 CF=1 Исключение: Сдвиг -1 дает также -1.
Циклический сдвиг используется для того, чтобы поменять местами полубайты и байты. ROR op, n ROL op, n Рис. 9. 1 Сдвиг вправо Рис. 9. 2 Сдвиг влево Циклический сдвиг с использованием CF применяется для переписи из одного слова в другое или из одного байта в другой. Можно переписать из одной ячейки памяти в другую с использованием единицы заема. RСR op, n RСL op, n Рис. 10. 1 Сдвиг вправо Рис. 10. 2 Сдвиг влево
13. 5. Разветвляющиеся процессы Безусловные переходы JMP <метка> Например, Jmp @l ………. . @l : add AX, BX Оператор флагов не меняет, а меняет содержимое регистра IP, к нему прибавляется (вычитается) смещение. Смещение рассчитывается, начинается с текущей команды (следующая после выполняемой). Смещение бывает разных размеров: Short – короткое Near – близкое Far – дальнее Короткое смещение организуется при смещении к началу программы, если число шагов меньше 30 – 40. Если смещение идет вниз по программе, то оно близкое, т. к. помеченная команда ещё не транслировалась и неизвестно расстояние до нее. Jump short : 2 байта, смещение – 1 байт (-128 - +127) Jump near : 3 байта, смещение -32768 - +32767 Jump far : 3 байта, но меняет CS. Для встроенного в Паскаль Ассемблера использование FAR эквивалентно использованию {$F+}. В любом Ассемблере двоеточие после метки указывает на near. Во встроенном в Паскаль Ассемблере нельзя указать короткий переход.
Команды условного перехода и организация разветвляющихся процессов Команды условного перехода формируются после арифметических операций и операций сравнения, т. е. тех которые меняют флаги. Таким образом, команда обязательно должна формировать флаги. Существует команда сравнения: CMP op 1, op 2 Она работает также, как и SUB, при тех же самых операндах. Рассматривается разность, но флаги формируются без разрушения операндов. Сравнивать можно знаковые и беззнаковые величины. Причем команда сравнения по-разному работает для знаковых и беззнаковых величин. В результате данной операции меняются все флаги. Разветвляющиеся процессы в Ассемблере осуществляются на основе команд условного и безусловного переходов. Все алгоритмы требуют преобразования к одностороннему ветвлению. Любая команда условного перехода имеет условие. JXX <метка> Указывает на флаг Куда передается управление
Задачи на разветвляющиеся процессы Пример 1 В ячейку F записать большее из двух чисел. Рассмотрим два алгоритма с двусторонним ветвлением (Рис. 11. 1) и односторонним ветвлением (Рис. 11. 2). Рис. 11. 1 Рис. 11. 2
Пример 2 Записать в ячейку q 0, если хотя бы одна пара целых чисел x, y, x равны между собой и 1 в противном случае. Рис. 12 Неструктурный алгоритм
13. 6. Циклические процессы в Ассемблере могут быть реализованы как циклы с пред и постусловием при помощи условного и безусловного переходов, а также команд сравнения. Арифметический цикл в ассемблере осуществляется с помощью команды LOOP [метка] LOOP <метка> Число вхождений в цикл считает регистр СХ. До входа в цикл в СХ записывается число повторений. Команда LOOP вычитает из СХ единицу. Если результат не нулевой, осуществляется переход по метке. Вычитание и проверка осуществляются после тела цикла. LOOP – это цикл с постусловием. Для того, чтобы избежать вхождение в тело цикла, нужно выполнить следующие действия: MOV CX, N JCXZ @k @l : … ……… Loop @l @k : … ………. Команда двухбайтовая, переход длины – short. Цикл с параметром можно организовать, если команд не более 30 -40. Цикл с постусловием можно реализовать, если действий больше с помощью команд условного и безусловного переходов. 1. LOOP E @1 / LOOP Z @1 – эквивалентные команды If (CX <> 0) and (FZ =0) then goto @1 CX=CX -1 Применяется чаще всего для поиска первого элемента последовательности, отличного от заданной величины. 2. LOOP NE @1 / LOOP NZ @1 If (CX <> 0) and (FZ=1) then goto @1 CX = CX -1 Применяется чаще всего для поиска первого элемента последовательности, имеющего заданную величину.
13. 7. Косвенная адресация Признаком косвенной адресации в ассемблере являются квадратные скобки, которые говорят о том, что записывается содержимое по указанному адресу. A DW 100 D - прямой способ адресации …………… MOV AX, A {в АХ находится 100} АА DW 2000 MOV BX, AA - косвенная адресация. MOV AX, [BX] В АХ записали не 2000, а содержимое по адресу 2000. Для косвенной адресации может использоваться не любой регистр. Это только РОН ВХ, индексные регистры SI, DI и регистровый указатель ВР (хотя он не безопасен).
13. 8. Работа с массивами В работе с массивами мы сталкиваемся с похожей ситуацией. При трансляции выделяется место под массив и только транслятор знает, по какому адресу. Исполнительная система этот адрес должна вычислить. Этот адрес должен знать и программист. Как же его вычислить? Для этого существует специальная команда LEA (load effective adress). LEA BX, MAS Команда флагов не вырабатывает. В квадратные скобки можно ставить регистры ВХ, SI, DI, BP. ВР связан с сегментом стека и поэтому может быть использован для операций ввода и вывода, для обработки прерываний и для работы со строками. Для нахождения каждого последующего элемента к регистру. который ставится в квадратные скобки надо прибавлять или 2 байта, или 4 байта в зависимости от размера данных. из которых состоит массив. Делается это с помощью команды INC (повторяется 2 раза) Пример 1 Удвоить все элементы двумерного массива А и переписать в массив В.
Пример 2 Сколько отрицательных чисел стоит в начале массива?
13. 9. Параметр указания типа <тип> PTR <выражение> PTR – сокращенно от Pointer. Типы бывают: byte, word, dword. Выражение может быть как константное, так и адресное. Например: MOV AX, 0 {занесли в AX 0 длиной в слово} MOV CL, 0 {занесли в CL 0 длиной в байт} MOV [SI], 0 {невозможно! выдает сообщение об ошибке! неизвестен размер 0} В последнем случае поступают следующим образом: MOV byte PTR [SI], 0 H {занесли по адресу SI 0 длиной в байт} MOV word PTR [SI], 0 H {занесли по адресу SI 0 длиной в слово} или MOV [SI], byte PTR 0 {занесли по адресу SI 0 длиной в байт} MOV [SI], word PTR 0 {занесли по адресу SI 0 длиной в слово} Но первый вариант использования PTR предпочтительней.
13. 10. Организация ЕХЕ - программ Рассмотрим организацию ЕХЕ - программ на примере: Пример Большее из двух чисел записать в R.
Программа состоит из команд и псевдокоманд. Она разделена на сегменты. Обязательным является сегмент кодов. В данном случае присутствуют сегменты данных, стека и кодов. Команда PAGE n, m – это команда для организации листинга. Причем 10<=n<=255 (количество строк), 60<=m<=132 (количество символов в строке). Если не писать эту команду, то по умолчанию n=66, m=80. TITLE <имя> – заголовок программы, имя в заголовке, как правило, совпадает с именем программы в каталоге на диске. Комментарии после имени могут содержать до 60 символов. Подпрограммы также могут иметь свой заголовок: SUBTITLE <имя> Сегмент всегда начинается со служебного слова SEGMENT и заканчивается ENDS, должен иметь оригинальное имя, т. е. отличное от имен других сегментов. <имя сегмента> SEGMENT <три параметра> … <имя сегмента> ENDS 1. 2. 3. Параметры: Выравнивание. Например, PARA. Объединение. Например, STACK, COMMON, AT-выражение, MEMORY, PUBLIC. Класс. Всегда строковое выражение. Например, ‘Stack’ (‘имя’). Сегмент кодов состоит из процедур. В данном случае одна процедура. Организация процедуры: <имя процедуры> PROC [FAR] … RET <имя процедуры> ENDP Вместо RET (команда ‘вернуться из процедуры’) может стоять INT 20 H (‘возврат по прерыванию’). Директива ASSUME ставит в соответствие сегментный регистр и его имя. NOTHING означает отсутствие сегмента. Процедур может быть сколь угодно много, но процедура, которая является начальное, имеет признак входной точки FAR. Вся программа заканчивается END <имя процедуры, которая была входной точкой>
Основные соглашения для организации ЕХЕ – программы 1. Обязательно назначение имен сегментных регистров в любом порядке через запятую: ASSUME CS: CODESG, DS: DATASG, SS: STACSG, ES: NOTHING Это неисполняемая директива, которая нужна загрузчику для распределения памяти. По этим адресам записаны сегментные регистры. 2. Операционная система, отправляя в сегмент кодов, сообщает адрес возврата. Для этого используется регистр DS. Придя в свою программу адрес в DS, мы должны записать на дно стека PUSH DS. Это будет первая исполняемая команда в нашей процедуре. Затем этим адресом воспользуется команда RET. 3. На данный момент смещение равно 0, и для регистра IP это значение должно быть записано в стек. Делается это следующим образом: XOR AX, AX PUSH AX 4. Адрес сегмента данных знает загрузчик, и его надо записать в DS, делаем это через РОН: MOV AX, DATASG MOV DS, AX В сегменте данных записаны исходные данные и зарезервированы ячейки под результат. Сегмент стека должен состоять как минимум из 32 машинных слов для простой программы с одной процедурой (25 разрядов прерывания, 2 использованы под DS и 0), иначе программа разрушится самым непредсказуемым образом.
13. 11. Организация СОМ - программ Рассмотрим организацию COM - программ на примере: Пример Большее из двух чисел записать в R. Существует 4 отличия СОМ от ЕХЕ – программ: 1. СОМ – программа не может превышать 64 Кб (нет 512 -байтного заголовка ЕХЕ – файла). 2. СОМ – программа автоматически формирует сегмент стека. 3. Сегмент данных отсутствует. Все данные должны храниться в сегменте кодов между словами RET и ENDP. В примере использован второй способ: данные располагаются вначале программы, и, чтобы на них не попало управление, используется команда обхода данных JMP. 4. Перед СОМ – программой, также как и перед ЕХЕ, существует PSP (префикс командного сегмента) размером 256 байт – 100 Н. Т. е. до 100 Н мы не можем поместить нашу программу. Начальный адрес задается с помощью директивы ORG.
13. 12. Обработка программ на Ассемблере Производится так: 1. Для ЕХЕ - программ: MASM {транслятор} LINK {загрузчик} RUN {запуск на решение} 2. Для СОМ - программ: MASM {транслятор} LINK {загрузчик предупреждает от ошибке ‘WARNING: NO STACK SEGMENT’} EXE 2 BIN A: ABC, A: ABC. com {переводим ЕХЕ - программу в СОМ - программу (расположены на диске А). Если во втором параметре не указать расширение, то по умолчанию переведет в АВС. bin, а затем надо будет переименовать RENAME ABC. COM } DEL ABC. obj, ABC. exe{удаляем лишнее} RUN {запуск на решение}
Дополнительно Работа в машинных кодах Программы хранятся в ОП в машинных кодах. Данные, которые использует программа, также хранятся в машинных кодах.
Пример работы в машинных кодах: Пример для 1 -о адресной машины: Пример для 3 -х адресной машины:
Паше.pptx