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