Сегмент .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.
- Увеличение указателя стека на вычисленный размер стека.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д