Сегмент .startup .Com файл - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Имеется .com программа, которая выводит на экран .PCX изображение. Хотелось бы получить пояснения по одному куску кода.
.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? В литературе объяснения не нашел. Хотелось бы подробное объяснения, либо же ссылку на литературу. Спасибо.

Решение задачи: «Сегмент .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

Объяснение кода листинга программы

  1. Прикрепление сегмента .startup.
  2. Установка регистра DS в адрес начала сегмента данных.
  3. Установка регистра BX в значение регистра стека SS.
  4. Вычисление размера стека, вычитая адрес начала сегмента данных из регистра стека.
  5. Установка флага продолжения выполнения инструкций.
  6. Установка регистра стека SS равным регистру данных DS.
  7. Увеличение указателя стека на вычисленный размер стека.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы