IBM PC

т.е. из неравенства код('0')<=код(c)<=код('9') следует, что c - цифра;

IBM PC

Информация

Компьютеры, программирование

Другие материалы по предмету

Компьютеры, программирование

Сдать работу со 100% гаранией
Запись слова в стек: PUSH op

Здесь op обозначает любой 16-битовый регистр (в том числе и сегмент-

ный) или адрес слова памяти. По этой команде значение регистра SP

уменьшается на 2 (вычитание происходит по модулю 2^16), после чего

указанное операндом слово записывается в cтек по адресу SS:SP.

Чтение слова из стека: POP op

Слово, считанное из вершины стека, присваивается операнду op (регист-

ру, в том числе сегментному, но не CS, или слову памяти), после чего

значение SP увеличивается на 2.

Переход с возвратом: CALL op

Эта команда записывает адрес следующей за ней команды в стек и затем

делает переход по адресу, определяемому операндом op. Она используется

для переходов на подпрограммы с запоминанием в стеке адреса возврата.

Имеются следующие разновидности этой команды (они аналогичны вари-

антам команды безусловного перехода JMP):

- внутрисегментный относительный длинный переход (op - непосредст-

венный операнд размером в слово, а в MASM - это метка из текущего сег-

мента команд или имя близкой процедуры (см. ниже)); в этом случае в

стек заносится только текущее значение счетчика команд IP, т.е. смеще-

ние следующей команды;

- внутрисегментный абсолютный косвенный переход (op - адрес слова

памяти, в которой находится адрес (смещение) той команды, на которую и

будет сделан переход); и здесь в стек записывается только смещение ад-

реса возврата;

- межсегментный абсолютный прямой переход (op - непосредственный

операнд вида seg:ofs, а в MASM - это FAR PTR <метка> или имя дальней

процедуры (см. ниже)); здесь в стек заносится текущие значение регист-

ров CS и IP (первым в стек записывается содержимое CS), т.е. абсолют-

ный адрес возврата, после чего меняются регистры CS и IP;

- межсегментный абсолютный косвенный переход (op - адрес двойного

слова, в котором находится пара seg:ofs, задающая абсолютный адрес пе-

рехода); и здесь в стеке спасается содержимое регистров CS и IP.

Переход (возврат) по адресу из стека: RET op

Из стека считывается адрес и по нему производится переход. Если указан

операнд (а это должно быть неотрицательное число), то после чтения ад-

реса стек еще очищается на это число байтов (к SP добавляется это чис-

ло). Команда используется для возврата из подпрограммы по адресу, за-

писанному в стек по команде CALL при вызове подпрограммы, и одновре-

менной очистки стека от параметров, которые основная программа занесла

в стек перед обращением к подпрограмме.

Команда RET имеет две разновидности (хотя в MASM они записываются

и одинаково): в одном случае из стека считывается только одно слово -

смещение адреса возврата, а во втором - из стека считывается пара seg:

ofs, указывающая абсолютный адрес возврата. Как ассемблер определяет,

какой из этих двух случаев имеет место, объяснено ниже.

В ПК стек в основном используется для организации подпрограмм и

прерываний. Подпрограммы рассматриваются ниже, а прерывания - в главе

3. Однако, даже если программе не нужен стек, она все равно должна от-

вести под него место. Дело в том, что стеком будет неявно пользоваться

операционная система при обработке прерываний, которые возникают (нап-

ример, при нажатии клавиш на клавиатуре) в то время, когда выполняется

программа. Для нужд ОС рекомендуется выделять в стеке 64 байта.

1.7.3 Подпрограммы

Типичная схема огранизации подпрограмм, обычно используемая транс-

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

частности, рекурсивных), следующая.

При обращении к подпрограмме в стек заносятся параметры для нее и

адрес возрата, после чего делается переход на ее начало:

PUSH param1 ;запись 1-го параметра в стек

...

PUSH paramk ;запись последнего (k-го) параметра в стек

CALL subr ;переход в возратом на подпрограмму

(Замечание: если необходимо вычислить параметр или если его размер от-

личен от слова, тогда для записи параметра в стек нужно, конечно, нес-

колько команд, а не одна.) Состояние стека после выполнения этих ко-

манд обращения к подпрограмме показано на рис. a

| | |--------------|

| | | лок.величины |<-SP

| | -2| (m байтов) |

| | |--------------|

| | 0| BP стар |<-BP

|адрес возврата|<-SP +2|адрес возврата|

| 1-й параметр | +4| 1-й параметр |

| ... | | ... |

| k-й параметр | | k-й параметр |

|//////////////| |//////////////|

|//////////////|<-BP |//////////////|

рис. а рис. б

Первыми командами подпрограммы обычно являются следующие:

PUSH BP ;спасти в стеке старое значение BP

MOV SP,BP ;установить BP на вершину стека

SUB SP,m ;отвести в стеке место (m байтов) под локальные

;величины подпрограммы (состояние стека в этот

;момент показано на рис. б)

Поясним эти "входные" команды. В подпрограмме для обращения к

ячейкам стека, занятых параметрами, используется (как базовый) регистр

BP: если в BP занести адрес вершины стека, то для доступа к этим ячей-

кам следует использовать адресные выражения вида i[BP] или, что то же

самое, [BP+i]. (Отметим, что применять здесь регистры-модификаторы BX,

SI и DI нельзя, т.к. формируемые по ним исполнительные адреса будут

сегментироваться по умолчанию по регистру DS, а в данном случае нужно

сегментирование по SS.) Однако данная подпрограмма может быть вызвана

из другой, также использующей регистр BP, поэтому прежде, чем устано-

вить BP на вершину стека, надо спасти в стеке старое значение этого

регистра, что и делает первая из "входных" команд. Вторая же команда

устанавливает BP на вершину стека. Если предположить, что каждый пара-

метр и адрес возврата занимают по слову памяти, тогда доступ к первому

параметру обеспечивается адресным выражением [BP+4], ко второму - вы-

ражением [BP+6] и т.д. (см. рис. б).

Подпрограмме может потребоваться место для ее локальных величин.

Такое место обычно отводится в стеке (а для рекурсивных подпрограмм -

только в стеке) "над" ячейкой, занимаемой старым значением BP. Если

под эти величины нужно m байтов, то такой "захват" места можно реали-

зовать простым уменьшением значения регистра SP на m, что и делает 3-я

"входная" команда. Доступ к локальным величинам обеспечивается адрес-

ными выражениями вида [BP-i]. Если подпрограмме не нужно место под ло-

кальные величины, тогда третью из "входных" команд следует опустить.

Выход из подпрограммы реализуется следующими командами:

MOV SP,BP ;очистить стек от локальных величин

POP BP ;восстановить старое значение BP

RET 2*k ;возврат из подпрограммы и очистка стека от

;параметров (считаем, что они занимают 2*k байтов)

Первая из этих "выходных" команд заносит в регистр SP адрес той ячейки

стека, где хранится старое значение регистра BP, т.е. происходит очис-

тка стека от локальных величин (если их не было, то данную команду

надо опустить). Вторая команда восстанавливает в BP это старое значе-

ние, одновременно удаляя его из стека. В этот момент состояние стека

будет таким же, как и перед входом в подпрограмму (см. рис а). Третья

команда считывает из стека адрес возврата (в результате чего SP "опус-

кается" на 2 байта), затем добавляет к SP число, которое должно рав-

няться числу байтов, занимаемых всеми параметрами подпрограммы, и за-

тем осуществляет переход по адресу возврата. В этот момент состояние

стека будет таким же, каким оно было перед обращением к подпрограмме.

Здесь описана универсальная схема организации работы подпрограмм.

В кокретных же случаях можно использовать более простые схемы. Напри-

мер, параметры можно передавать не через стек, а через регистры, место

под локальные величины можно отводить не в стеке, а в сегменте данных

и т.п.

1.7.4 Процедуры в языке ассемблера

При составлении и вызове подпрограмм необходимо следить за тем,

чтобы команды CALL и RET действовали согласовано - были одновременно

близкими или дальними. В MASM эта проблема снимается, если подпрограм-

му описать как процедуру. Процедуры имеют следующий вид:

имя_процедуры PROC [NEAR или FAR]

...

имя_процедуры ENDP

Хотя в директиве PROC после имени процедуры не ставится двоеточие,

это имя относится к меткам и его можно указывать в командах перехода,

в частности в команде CA

Лучшие

Похожие работы

<< < 6 7 8 9 10 11 >