Ассемблер методичка. Программа представляется в виде последовательности команд, каждая из которых записывается с помощью целого числа байт порядок команд однозначно определяется программой
Скачать 253 Kb.
|
2.3.Написание сегмента стекаСегмент стека обычно состоит из директивы DB 256 DUP (?), предписывающей ассемблеру выделить 256 байт под стек. Пример: Sseg SEGMENT STACK ‘stack’ DB 256 DUP (?) Sseg ENDS 2.4.Написание сегмента кодаСегмент кода содержит все операторы программы, разби-тые на подпрограммы. В начале этого сегмента указывается директива ASSUME, имеющая такой вид: ASSUME CS:метка сегм. кода, DS:метка сегм. данных, SS:метка сегм. стека Подпрограммы определяются с помощью директив PROC и ENDP следующим образом: Имя PROC Тип Операторы … RET ; Возврат из подпрограммы в точку вызова Имя ENDP Имя подпрограммы – это метка, указывающая смещение под-программы в сегменте кода. Тип может быть NEAR и FAR. Подпрограммы типа NEAR вызываются в пределах текущего сегмента, а FAR – из текущего или другого сегмента. Как правило, в программах, не использующих библиотеки подпрограмм и имеющих один сегмент кода, все подпрограммы, кроме одной, делают NEAR. Подпрограмма, называемая главной (аналог main в языке C или фрагмента кода begin … end. в языке Pascal), всегда объявляется как FAR, так как в конце программы необходимо передать управление операционной системе с помощью команды, находящейся в другом сегменте. Любая подпрограмма может вызывать другие подпрограммы (аналогично тому, как это делается в языках высокого уровня). Вызов подпрограммы осуществляется с помощью команды CALL: CALL имя_подпрограммы При вызове подпрограмм типа NEAR в стек записывается смещение следующей за CALL команды и производится переход к подпрограмме. По команде RET это значение из стека записывается в регистр IP, и программа продолжается со следующей за CALL командой. Для подпрограмм типа FAR в стек записывается как смещение, так и сегмент точки возврата. По команде RET в CS:IP записывается адрес точки возврата. Пример сегмента кода: Cseg SEGMENT ‘code’ ASSUME cs:Cseg, ds:Dseg, ss:Sseg Sub PROC NEAR … RET Sub ENDP Main PROC FAR … CALL Sub … RET Main ENDP Cseg ENDS 2.5.Написание головной подпрограммыГлавная подпрограмма вызывается системой, однако в стек адрес возврата не записывается. Чтобы вернуться в операционную систему, нужно выполнить команду, находящуюся в самом начале так называемого программного префикса. Программным префиксом (PSP) называется область памяти размером 256 байт, используемая для хранения переменных окружения, командной строки, некоторых других данных и предшествующая в памяти сегменту кода: PSP Сегмент кода Номер сегмента PSP система записывает в регистр DS. Смещение первой его команды всегда равно нулю. В начале работы главной подпрограммы необходимо записать в стек адрес первой команды PSP: сначала DS, а затем ноль. Тогда команда RET в конце головной подпрограммы извлечет этот адрес из стека и следующей выполнится команда возврата в операционную систему. Поскольку при старте программы в DS находится номер сегмента PSP, в DS необходимо явно записать номер сегмента данных. Это делают так: MOV AX, Dseg MOV DS, AX Поэтому головную процедуру пишут обычно так: Main PROC FAR PUSH DS ; Занесение DS в стек MOV AX, 0 ; Обнуление AX PUSH AX ; Занесение нуля в стек MOV AX, Dseg ; Настройка DS на сегмент данных MOV DS, AX … RET Main ENDP Пример программы на ассемблере Приведем пример программы, вычисляющей сумму трех чисел: X,Y,Z и записывающей результат в переменную RES. ; Сегменты не более 64 килобайт .MODEL SMALL ; Сегмент стека Sseg SEGMENT STACK ‘stack’ DB 256 DUP (?) Sseg ENDS ; Сегмент данных Dseg SEGMENT ‘data’ X DB 3 Y DB 5 Z DB 7 RES DB ? Dseg ENDS ; Сегмент кода Cseg SEGMENT ‘code’ ASSUME CS:Cseg, DS:Dseg, SS:Sseg ; Процедура добавления Z к сумме X и Y в AL и записи результата в RES Sumres PROC NEAR ADD AL, Z MOV RES, AL RET Sumres ENDP ; Головная подпрограмма Main PROC FAR ; Подготовимся к возврату в операционную систему PUSH DS MOV AX, 0 PUSH AX ; Настроим DS на наш сегмент данных MOV AX, Dseg MOV DS, AX ; Делаем вычисления MOV AL, X ADD AL, Y CALL Sumres ; Передача управления первому оператору в PSP RET Main ENDP Cseg ENDS END Main |