Сегмент .startup .Com файл - Assembler
Формулировка задачи:
Доброго времени суток. Имеется .com программа, которая выводит на экран .PCX изображение. Хотелось бы получить пояснения по одному куску кода.
Что за сегмент .startup? В литературе объяснения не нашел. Хотелось бы подробное объяснения, либо же ссылку на литературу. Спасибо.
.model tiny
.code
.startup
mov bx, 80h ; Получить ASCIIZ имя файла
mov dx, 82h
mov al, byte ptr es:[bx] ;режим доступа
inc al ;
add bx, ax ;Дескриптор наследуется дочерным процессом
mov byte ptr es:[bx], 0 ;
mov ax, 03d00h
int 21h ; Открыть файл
Start:
mov bx, ax ; bx = длина файла
mov ax, 0a000h ;Адрес начала видеобуфера в режиме VGA
mov es, ax ;
mov di, 0fa01h ; Инициализация режиме VGA
mov ax, 13h ; и
int 10h ; запись строки в текущую страницу видеобуфера
mov ah, 42h ; установка указателя в файле
xor cx, cx
xor dx, dx
mov al, 2 ;знаковое смещение от конца файла,т.е. вычисление длины файла
int 21h
sub ax, 300h
xor cx, cx
mov dx, ax
mov ah, 42h ; установка указателя в файле
mov al, 0 ;абсолютное смещение от начала файла
int 21h
mov cx, 300h ; загрузка pcx палитры
push di
Loop0:
push cx
call GetByte
shr al, 2
stosb ;копирует регистр AL в память по адресу ES:DI
pop cx
loop Loop0
pop dx
push bx
mov ax, 1012h ;установка цветового регистра
xor bx, bx
mov cx, 100h
int 10h
pop bx
mov ah, 42h ; указатель на начало pcx изображения
xor cx, cx
mov dx, 80h
mov al, 0h
int 21h
xor di, di ;указивает на начало экрана
Loop1: ; Вывод pcx изображения
call GetByte
and al, 0c0h ;
cmp al, 0c0h ;Сравнение на повторяющийся байт
mov al, B
je Run
stosb
jmp Cont
Run:
sub al, 0c0h
push ax
call GetByte
pop cx
rep stosb
Cont:
cmp di, 0fa00h ;64000
jb Loop1
mov ah, 3eh ; закрытие файла
int 21h
mov ah, 00h ; прочитать символ из буфера
int 16h
mov ax, 13h ; инициализация граф режима 320х200 256 цветов
int 10h
ret
GetByte: ; Получить байт из файла
lea dx, B
mov ah, 3Fh ;Чтение из файла
mov cx, 1 ;число пересылаемых байтов
int 21h
mov al, B
ret
B db ?;буфер чтения
endРешение задачи: «Сегмент .startup .Com файл»
textual
Листинг программы
3 .startup 1 4 0000 @Startup: 1 5 0000 BA 0000s MOV DX,@data 1 6 0003 8E DA MOV DS,DX 1 7 0005 8C D3 MOV BX,SS 1 8 0007 2B DA SUB BX,DX 1 9 0009 D1 E3 D1 E3 D1 E3 D1+ SHL BX,4 10 E3 1 11 0011 FA CLI 1 12 0012 8E D2 MOV SS,DX 1 13 0014 03 E3 ADD SP,BX 1 14 0016 FB STI
Объяснение кода листинга программы
- Прикрепление сегмента .startup.
- Установка регистра DS в адрес начала сегмента данных.
- Установка регистра BX в значение регистра стека SS.
- Вычисление размера стека, вычитая адрес начала сегмента данных из регистра стека.
- Установка флага продолжения выполнения инструкций.
- Установка регистра стека SS равным регистру данных DS.
- Увеличение указателя стека на вычисленный размер стека.