Главная страница

Ассемблер методичка. Программа представляется в виде последовательности команд, каждая из которых записывается с помощью целого числа байт порядок команд однозначно определяется программой


Скачать 253 Kb.
НазваниеПрограмма представляется в виде последовательности команд, каждая из которых записывается с помощью целого числа байт порядок команд однозначно определяется программой
АнкорАссемблер методичка.doc
Дата21.03.2018
Размер253 Kb.
Формат файлаdoc
Имя файлаАссемблер методичка.doc
ТипПрограмма
#17015
страница5 из 7
1   2   3   4   5   6   7

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

1   2   3   4   5   6   7


написать администратору сайта