Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЗЯП. Указатели на страницы ответов.rtf
Скачиваний:
24
Добавлен:
30.11.2021
Размер:
7.65 Mб
Скачать

5. Сравнить программы exe и com.

EXE

1. Длина EXE-файла НЕ ограничена размером одного сегмента.

2. Есть сегмент стека, и может быть сегмент данных, если необходимо.

3. Все процедуры, включая главную, могут иметь как атрибут NEAR, так и атрибут FAR.

4. EXE-файл имеет заголовок размером в 512 байт.

5. Нужно специально готовить стек для возврата в DOS.

Код

.model LARGE

.stack

; Данные в стеке

.data

; Данные и резервируемая память

.code

main proc far

; Код главной функции

main endp

; Процедуры

end main

COM

1. Длина COM-файла ограничена размером одного сегмента (64 КБайт).

2. Нет сегмента стека и сегмента данных. Все данные определяются в сегменте кода.

3.Все процедуры, включая главную, должны иметь атрибут NEAR.

4. Модель COM-файлов: .model TINY.

5. Нужно устанавливать ORG 100h — значение начального смещения, поскольку DOS резервирует 256 байт для префикса программного сегмента (PSP).

Код

.MODEL TINY

.CODE

org 100h

start:

mov ah, 09h

lea dx, Msg

int 21h

ret

Msg db 'Hello, world', 13, 10, '$'

end start

(tasm <name>.asm, tlink /t <name>.obj)

6. Загрузка exe и com программ.

[1] слайды 240-259.

[2] стр. 313-316.

EXE-программа

COM-программа

7. Формат exe-программы.

[1] слайды 245-259.

[2] стр. 314-317.

CODESG SEGMENT PARA 'CODE'

BEGIN PROC FAR

ASSUME CS: CODESG, SS: STACKSG, DS: DATASG, ES: DATASG

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, DATASG

MOV DS, AX

MOV ES, AX

; Дальнеший код

RET

BEGIN ENDP

; Процедуры

CODESG ENDS

STACKSG SEGMENT PARA STACK 'STACK'

; Стек

DB 12 DUP ('STACKSEG')

STACKSG ENDS

DATASG SEGMENT PARA 'DATA'

; Данные

DATASG ENDS

END BEGIN

8. Использование сопроцессора (fpu).

[1] слайды 225-239.

[2] стр. 266-304.

Все вычисления выполняются в 80-битном расширенном вещественном формате.

Загрузка данных в стек

FLD (FLOAT)

FBLD (BCD)

FILD (INT)

Копирование данных из стека

FST (FLOAT)

FIST (INT)

Извлечение данных из стека

FSTP (FLOAT)

FBSTP (BCD)

FISTP (INT)

Сложение

FADD (FLOAT)

FIADD (INT)

Вычитание

FSUB (FLOAT)

FISUB (INT)

Обратное вычитание

FSUBR (FLOAT)

FISUBR (INT)

Умножение

FMUL (FLOAT)

FIMUL (INT)

Деление

FDIV (FLOAT)

FIDIV (INT)

Реверсное деление

FDIVR (FLOAT)

FIDIVR (INT)

Остальное

FABS (модуль)

FSQRT (корень)

FCHS (смена знака)

9. Обработка массивов.

[1] слайды 218-224.

[2] стр. 206-212.

Сумма элементов одномерного массива в NUM2

XOR BX, BX

XOR AX, AX

FIN:

MOV AL, MYARR[BX]

ADD NUM2, AX

INC BX

CMP BX, 10

JB FIN

RET

Сумма элементов двумерного массива в NUM2

XOR BX, BX

XOR AX, AX

LOUT:

XOR SI, SI

LIN:

MOV AL, MYARR[BX][SI]

ADD NUM2, AX

INC SI

CMP SI, 10

JB LIN

INC BX

CMP BX, 10

JB LOUT

RET

10. Обработка строк.

[1] слайды 211-217.

[2] стр. 223-232.

DS:SI, ES:DI, DF flag (STD, CLD)

MOVSB ([SI] >>> [DI])

CMPSB ([SI] ~ [DI])

SCASB ([AL] ~ [DI]) | SCASW ([AX] ~ [DI])

LODSB ([SI] >>> [AL]) | LODSW ([SI] >>> [AX])

STOSB ([AL] >>> [DI]) | STOSW ([AX] >>> [DI])

REP (в CX счётчик)

Пример

LEA DI, NUM1 + 3 ; NUM1 DB '00000$'

CLD

MOV AL, '3'

STOSB

MOV AL, '4'

STOSB