Язык ассемблера и режимы адресации
| English | Русский |
|---|---|
| assembler/əˈsemblə/ | ассемблер |
| mnemonic/nɪˈmɒnɪk/ | мнемоника |
| instruction set/ɪnˈstrʌkʃn set/ | набор инструкций |
| machine code/məˈʃiːn kəʊd/ | машинный код |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | язык ассемблера |
| operand/ˈɒpərænd/ | операнд |
| opcode/ˈɒpkəʊd/ | опкод |
| symbol table/ˈsɪmbl ˈteɪbl/ | таблица символов |
| label/ˈleɪbl/ | метку |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | прямые ссылки |
| addressing mode/əˈdresɪŋ məʊd/ | адресный режим |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | непосредственная адресация |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | прямая адресация |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | косвенная адресация |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | индексная адресация |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | относительная адресация |
Тридцать одна инструкция на ряду переключателей
- В 1949 году компьютер EDSAC в Кембридже загрузился из 31 инструкции, заданных переключателями, написанной Дэвидом Уилером и названной «начальными приказами».
- Их вся работа заключалась в том, чтобы считывать буквы, такие как A и S, с бумажной ленты и преобразовывать их в числа, которые машина действительно понимала: первый ассемблер.
- С тех пор программисты пишут мнемоники вместо битовых паттернов, и набор инструкций для экзамена является прямым потомком этих мнемоник.
- Этот урок посвящен этому переводу, трассировке программы вручную и пяти способам, которыми инструкция может указывать местонахождение своих данных.
Машинный код и язык ассемблера
- Процессор выполняет машинный код: битовые паттерны, специфичные для одной архитектуры, каждый из которых представляет собой код операции и операнд.
- Язык ассемблера — это читаемая форма. Каждая инструкция пишется с помощью мнемоники, такой как
LDD,ADDилиJMP, и каждая инструкция ассемблера превращается ровно в одну машинную инструкцию. - Ассемблер переводит её. Соотношение «один к одному», что и отличает ассемблер от языков высокого уровня, где одна команда становится множеством инструкций.

Каждая мнемоника становится одним кодом операции; каждый символьный адрес становится числом
Язык ассемблера — это:
Ассемблер использует мнемоники и отображается один к одному с машинным кодом; ассемблер переводит его.
Ассемблер с двумя проходами
- Pass 1 читает исходный код и создает таблицу символов: каждый раз, когда появляется метка, например
LOOP:, ее адрес сохраняется. Код не генерируется. - Проход 2 читает исходный код и генерирует машинные инструкции, заменяя каждую мнемонику на её опкод, а каждый символьный адрес — на число из таблицы символов.
- Два прохода необходимы из-за перекрестных ссылок:
JMP LOOPможет появиться до того, как была встречена строкаLOOP:, поэтому её адрес неизвестен на первом проходе.
Что выполняет первый проход (pass 1) двухпроходного ассемблера?
Первый проход (pass 1) записывает, где находится каждая метка (таблица символов); затем второй проход (pass 2) генерирует код, используя таблицу для разрешения ссылок на метки.
Расставьте работу двухпроходного ассемблера в правильном порядке.
Первый проход (pass 1) сначала находит все метки, чтобы второй проход (pass 2) мог разрешить даже переход к метке, определённой позже.
Почему ассемблеру нужно два прохода?
Переход может целеваться на метку, которая встречается позже в исходном коде; первый проход (pass 1) сначала находит все метки, чтобы второй проход (pass 2) мог их разрешить.
Разобранный пример: применение двух проходов
- Программа начинается по адресу 100.
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- Проход 1 подсчитывает адрес каждой строки и фиксирует метки:
LOOP= 101,COUNT= 105. Больше ничего не записывается. - Проход 2 выполняет пословную транслитерацию.⟩
LDD COUNT⟨ становится опкодом для⟩LDD⟨ с операндом 105;⟩JPN LOOP⟨ становится опкодом для⟩JPN⟨ с операндом⟩101⟨. Без прохода⟩1⟨ первая строка не могла бы быть переведена.
Как работает двухпроходный ассемблер
Проанализируйте процесс. Ассемблер читает ваш код дважды: первый проход (pass 1) только определяет местоположение каждой метки, поэтому второй проход (pass 2) может подставить адреса — именно так работает переход к метке, определённой позже в коде.
В разобранном примере первый проход (pass 1) записывает метку LOOP с адресом ____ в таблице символов.
Программа начинается с 100, поэтому вторая строка, LOOP: DEC ACC, занимает 101. COUNT, на шестой строке, равен 105.
Набор инструкций
- Набор инструкций Кембриджа имеет один регистр общего назначения, аккумулятор ACC, и индексный регистр IX. Операнд
#n— десятичный,Bn— двоичный,&n— шестнадцатеричный, а<address>— номер ячейки памяти или метка. - Перемещение данных:
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>. Ввод и вывод:IN,OUT. - Арифметика:
ADD,SUB,INC,DEC. Сравнение:CMP,CMI. Переходы:JMPбезусловный,JPEиJPNусловные. Побитовые операции:AND,OR,XOR,LSL,LSR. Затем⟩END⟨. - «Инструкции сгруппированы»: назовите группы и приведите по одной инструкции из каждой.
Что из перечисленного является группами набора инструкций? Выберите все подходящие варианты.
Перемещение данных, ввод/вывод, арифметика, сравнение, условные и безусловные переходы, а также побитовые манипуляции. Электронная таблица — это прикладное ПО, находящееся далеко выше этого уровня.
Разобранный пример: трассировка программы
- Нарисуйте таблицу со столбцом для ACC и для каждой ячейки памяти, которую использует программа, затем обновляйте её строку за строкой до
END.
100 LDM #0
101 STO TOTAL
102 LDD TOTAL
103 ADD #5
104 STO TOTAL
105 LDD COUNT
106 DEC ACC
107 STO COUNT
108 CMP #0
109 JPN 102
110 END
111 TOTAL: 0
112 COUNT: 3
- Проход 1 цикла: ACC 0 → 5 (TOTAL = 5), COUNT 3 → 2, сравнение «не равно», переход. Проход 2: TOTAL = 10, COUNT = 1, переход. Проход 3: TOTAL = 15, COUNT = 0, сравнение «равно», нет перехода,
END. - Конечные значения: TOTAL = 15, COUNT = 0, ACC = 0. Записывайте новую строку только тогда, когда значение меняется, и никогда не пропускайте сравнение.
В прослеживаемой программе каково значение TOTAL при достижении END?
Цикл добавляет 5 к TOTAL один раз для каждого из трех проходов: 5, 10, 15.
Режимы адресации
- Режим адресации указывает, как процессор находит операнд.
| Режим | Где находится операнд | Пример |
|---|---|---|
| непосредственная адресация | значение содержится в самой инструкции | LDM #10 загружает 10 |
| прямая адресация | инструкция содержит адрес; используйте значение, хранящееся там | LDD 200 загружает содержимое 200 |
| косвенная адресация | адрес содержит другой адрес, который содержит данные | LDI 200 |
| индексная адресация | эффективный адрес = указанный адрес + индексный регистр | LDX 200 с IX |
| относительная адресация | адрес является смещением от текущей инструкции | переходы |

Одно и то же поле операнда, четыре разных значения
При непосредственной адресации (например, LDM #10) операндом является:
Непосредственная адресация использует буквальное значение в инструкции (здесь, 10).
Сопоставьте каждый режим адресации с его значением.
Непосредственный = значение; прямой = адрес значения; косвенный = адрес адреса; индексированный = база + индекс.
Разобранный пример: один операнд, четыре ответа
- Память: ячейка 200 содержит 300, ячейка 300 содержит 7, ячейка 202 содержит 9. Индексный регистр IX содержит 2.
LDM #200помещает 200 в ACC: непосредственная, само число.LDD 200помещает 300 в ACC: прямая, содержимое 200.LDI 200помещает 7 в ACC: косвенная, содержимое адреса, найденного в 200.LDX 200прибавляет IX к 200 и загружает содержимое 202: 9. Один и тот же операнд записан четырьмя способами, четыре разных значения.
Почему существует индексная адресация
- Массив — это ряд последовательных ячеек памяти.
LDX 200с IX = 0, 1, 2, … читает элементы 0, 1, 2, … без изменения инструкции. - Шаблон цикла:
LDR #0для обнуления индекса,LDX ARRAYдля получения элемента, выполнение действия,INC IX, сравнение с длиной,JPNобратно. - Прямое адресование потребовало бы отдельной инструкции для каждого элемента; индексированное адресование требует одной.
Индексированная адресация наиболее полезна для:
Эффективный адрес равен базе + индексному регистру, поэтому увеличение индекса обеспечивает проход по массиву.
Сравнение и переход
CMP #nилиCMP <address>сравнивает ACC со значением и устанавливает флаг. Он не изменяет ACC.JPE <address>совершает переход, если последнее сравнение показало равенство значений;JPN <address>совершает переход, если они не были равны;JMP <address>всегда совершает переход.- В языке высокого уровня
IFстановитсяCMP, за которым следует условный переход; цикл представляет собой сравнение и переход назад к метке.
CMP #0 изменяет значение, хранящееся в аккумуляторном регистре.
Команд сравнения только устанавливает флаг, который читает следующее условное ветвление. ACC остается неизменным, поэтому в трассировке на строке CMP нет нового значения ACC.
Потерянные баллы
LDM #10загружает число 10;LDD 10загружает содержимое ячейки 10. Разница между ними составляет#.#— десятичная система,B— двоичная,&— шестнадцатеричная.AND &0FиAND B00001111— одна и та же маска;AND #15— тоже.CMPне трогает ACC; он лишь устанавливает флаг.JPNсовершает переход, когда значения не равны.- Проход 1 ассемблера не пишет никакого кода. Его выходными данными являются таблица символов, а причины его существования служат перекрестные ссылки (forward references).
Вы поняли
- машинный код — это последовательности битов; ассемблерный язык — мнемоники, один к одному, преобразуемые ассемблером
- два прохода: проход 1 формирует таблицу символов адресов меток, проход 2 генерирует код; необходимо для перекрестных ссылок
- трассировка с таблицей ACC и каждой ячейки, по одной строке на каждое изменение; CMP устанавливает флаг, JPE/JPN считывают его
- адресация: непосредственная
#nзначение · прямая содержимое адреса · косвенная адрес адреса · индексированная адрес + IX (массивы) · относительная смещение