Программа печати, ошибки - Assembler

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

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

Доброго времени суток! Помогите пожалуйста с программой печати. Есть программа:
TITLE   PRTNAME (COM)   Ввод и печать имен
CODESG  SEGMENT PARA PUBLIC 'CODE'
        ASSUME  CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
        ORG     100H
BEGIN:  JMP     SHORT MAIN
; -----------------------------------------------------
NAMEPAR LABEL   BYTE            ;Список параметров
MAXNLEN DB      20              ; максимальная длина имени
NAMELEN DB      ?               ; длина введенного имени
NAMEFLD DB      20 DUP(' ')     ; введенное имя
                                ;Строка заголовка:
HEADG   DB      'List of Employee Names    Page '
PAGECTR DB      '01',0AH,0AH
FFEED   DB      0CH             ;Перевод страницы
LFEED   DB      0AH             ;Перевод строки
LINECTR DB      01
PROMPT  DB      'Name? '
; -----------------------------------------------------
MAIN    PROC    NEAR
        CALL    Q10CLR          ;Очистить экран
        CALL    M10PAGE         ;Установка номера страницы
A2LOOP:
        MOV     DX,0000         ;Установить курсор в 00,00
        CALL    Q20CURS
        CALL    D10INPT         ;Ввести имя
        CALL    Q10CLR
        CMP     NAMELEN,00      ;Имя введено?
        JE      A30             ; если нет - выйти,
        CALL    E10PRNT         ; если да - подготовить
                                ;  печать
        JMP     A20LOOP
A30:
        MOV     CX,01           ;Конец работы:
        LEA     DX,FFEED        ; один символ
        CALL    P10OUT          ; для прогона страницы,
        RET                     ; возврат в DOS
MAIN    ENDP
;               Ввод имени с клавиатуры:
;               -----------------------
D10INPT PROC    NEAR
        MOV     AH,40H          ;Функция
        MOV     BX,01           ; вывода на экран
        MOV     CX,05           ; 5 символов
        LEA     DX,PROMPT
        INT     21H             ;Вызов DOS
        MOV     AH,0AH          ;Функция ввода с клавиатуры
        LEA     DX,NAMEPAR
        INT     21H             ;Вызов DOS
        RET
D10INPT ENDP
;               Подготовка для печати:
;               ----------------------
E10PRNT PROC    NEAR
        CMP     LINECTR,60      ;Конец страницы?
        JB      E20             ; нет - обойти
        CALL    M10PAGE         ; да - печатать заголовок
E20:    MOV     CH,00
        MOV     CL,NAMELEN      ;Число символов в имени
        LEA     DX,NAMEFLD      ;Адрес имени
        CALL    P10OUT          ;Печатать имя
        MOV     CX,01           ;Один
        LEA     DX,LFEED        ; перевод строки
        CALL    P10OUT
        INC     LINECTR         ;Увеличить счетчик строк
E10PRNT ENDP
;               Подпрограмма печати заголовка:
;               -----------------------------
M10PAGE PROC    NEAR
        CMP     WORD PTR PAGECTR,3130H  ;Первая страница?
        JE      M30             ; да - обойти
        MOV     CX,01           ;
        LEA     DX,FFEED        ; нет --
        CALL    P10OUT          ;  перевести страницу,
        MOV     LINECTR,03      ;  установить счетчик строк
M30:
        MOV     CX,36           ;Длина заголовка
        LEA     DX,HEADG        ;Адрес заголовка
M40:
        CALL    P10OUT
        INC     PAGECTR+1       ;Увеличить счетчик страниц
        CMP     PAGECTR+1,3AH   ;Номер страницы = шест.xx3A?
        JNE     M50             ; нет - обойти,
        MOV     PAGECTR+1,30H   ; да - перевести в ASCII
        INC     PAGECTR
M50:    RET
M10PAGE ENDP
;               Подпрограмма печати:
;               -------------------
P10OUT  PROC    NEAR            ;CX и DX установлены
        MOV     AH,40H          ;Функция печати
        MOV     BX,04           ;Номер устройства
        INT     21H             ;Вызов DOS
        RET
P10OUT  ENDP
;               Очистка экрана:
;               --------------
Q10CLR  PROC    NEAR
        MOV     AX,0600H        ;Функция прокрутки
        MOV     BH,60H          ;Цвет (07 для ч/б)
        MOV     CX,0000         ;От 00,00
        MOV     DX,184FH        ; до 24,79
        INT     10H             ;Вызов BIOS
        RET
Q10CLR  ENDP
;               Установка курсора (строка/столбец):
;               ----------------------------------
Q20CURS PROC    NEAR            ;DX уже установлен
        MOV     AH,02           ;Функция установки курсора
        MOV     BH,00           ;Страница ј 0
        INT     10H             ;Вызов BIOS
        RET
Q20CURS ENDP
CODESG  ENDS
        END     BEGIN
Компилятор почему то ругается на переменные. Как это исправить?
Assembling: C:\Documents and Settings\Администратор\Рабочий стол\1.asm
C:\Documents and Settings\Администратор\Рабочий стол\1.asm(26) : error A2006: undefined symbol : Q10CLR
C:\Documents and Settings\Администратор\Рабочий стол\1.asm(27) : error A2006: undefined symbol : M10PAGE
C:\Documents and Settings\Администратор\Рабочий стол\1.asm(32) : error A2006: undefined symbol : Q10CLR
C:\Documents and Settings\Администратор\Рабочий стол\1.asm(37) : error A2006: undefined symbol : A20LOOP
C:\Documents and Settings\Администратор\Рабочий стол\1.asm(40) : error A2006: undefined symbol : FFEED
C:\Documents and Settings\Администратор\Рабочий стол\1.asm(62) : error A2006: undefined symbol : M10PAGE
C:\Documents and Settings\Администратор\Рабочий стол\1.asm(91) : warning A4023: with /coff switch, leading underscore required for start address : BEGIN
Я не знаю, может в MASM чего не хватает, какой либо библиотеки, программа взята из книги Питера Абеля.

Решение задачи: «Программа печати, ошибки»

textual
Листинг программы
TITLE   PRTNAME (COM)   Ввод и печать имен
CODESG  SEGMENT PARA PUBLIC 'CODE'
        ASSUME  CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
        ORG     100H
BEGIN:  JMP     SHORT MAIN
; -----------------------------------------------------
NAMEPAR LABEL   BYTE            ;Список параметров
MAXNLEN DB      20              ; максимальная длина имени
NAMELEN DB      ?               ; длина введенного имени
NAMEFLD DB      20 DUP(' ')     ; введенное имя
                                ;Строка заголовка:
HEADG   DB      'List of Employee Names    Page '
PAGECTR DB      '01',0AH,0AH
FFEED   DB      0CH             ;Перевод страницы
LFEED   DB      0AH             ;Перевод строки
LINECTR DB      01
PROMPT  DB      'Name? '
; -----------------------------------------------------
MAIN    PROC    NEAR
        CALL    Q10CLR          ;Очистить экран
        CALL    M10PAGE         ;Установка номера страницы
A2LOOP:
        MOV     DX,0000         ;Установить курсор в 00,00
        CALL    Q20CURS
        CALL    D10INPT         ;Ввести имя
        CALL    Q10CLR
        CMP     NAMELEN,00      ;Имя введено?
        JE      A30             ; если нет - выйти,
        CALL    E10PRNT         ; если да - подготовить
                                ;  печать
        JMP     A2LOOP
A30:
        MOV     CX,01           ;Конец работы:
        LEA     DX,FFEED        ; один символ
        CALL    P10OUT          ; для прогона страницы,
        RET                     ; возврат в DOS
MAIN    ENDP
;               Ввод имени с клавиатуры:
;               -----------------------
D10INPT PROC    NEAR
        MOV     AH,40H          ;Функция
        MOV     BX,01           ; вывода на экран
        MOV     CX,05           ; 5 символов
        LEA     DX,PROMPT
        INT     21H             ;Вызов DOS
        MOV     AH,0AH          ;Функция ввода с клавиатуры
        LEA     DX,NAMEPAR
        INT     21H             ;Вызов DOS
        RET
D10INPT ENDP
;               Подготовка для печати:
;               ----------------------
E10PRNT PROC    NEAR
        CMP     LINECTR,60      ;Конец страницы?
        JB      E20             ; нет - обойти
        CALL    M10PAGE         ; да - печатать заголовок
E20:    MOV     CH,00
        MOV     CL,NAMELEN      ;Число символов в имени
        LEA     DX,NAMEFLD      ;Адрес имени
        CALL    P10OUT          ;Печатать имя
        MOV     CX,01           ;Один
        LEA     DX,LFEED        ; перевод строки
        CALL    P10OUT
        INC     LINECTR         ;Увеличить счетчик строк
E10PRNT ENDP
;               Подпрограмма печати заголовка:
;               -----------------------------
M10PAGE PROC    NEAR
        CMP     WORD PTR PAGECTR,3130H  ;Первая страница?
        JE      M30             ; да - обойти
        MOV     CX,01           ;
        LEA     DX,FFEED        ; нет --
        CALL    P10OUT          ;  перевести страницу,
        MOV     LINECTR,03      ;  установить счетчик строк
M30:
        MOV     CX,36           ;Длина заголовка
        LEA     DX,HEADG        ;Адрес заголовка
M40:
        CALL    P10OUT
        INC     PAGECTR+1       ;Увеличить счетчик страниц
        CMP     PAGECTR+1,3AH   ;Номер страницы = шест.xx3A?
        JNE     M50             ; нет - обойти,
        MOV     PAGECTR+1,30H   ; да - перевести в ASCII
        INC     PAGECTR
M50:    RET
M10PAGE ENDP
;               Подпрограмма печати:
;               -------------------
P10OUT  PROC    NEAR            ;CX и DX установлены
        MOV     AH,40H          ;Функция печати
        MOV     BX,04           ;Номер устройства
        INT     21H             ;Вызов DOS
        RET
P10OUT  ENDP
;               Очистка экрана:
;               --------------
Q10CLR  PROC    NEAR
        MOV     AX,0600H        ;Функция прокрутки
        MOV     BH,60H          ;Цвет (07 для ч/б)
        MOV     CX,0000         ;От 00,00
        MOV     DX,184FH        ; до 24,79
        INT     10H             ;Вызов BIOS
        RET
Q10CLR  ENDP
;               Установка курсора (строка/столбец):
;               ----------------------------------
Q20CURS PROC    NEAR            ;DX уже установлен
        MOV     AH,02           ;Функция установки курсора
        MOV     BH,00           ;Страница ј 0
        INT     10H             ;Вызов BIOS
        RET
Q20CURS ENDP
CODESG  ENDS
        END     BEGIN

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

  1. Название: MAXNLEN Значение: 20 Описание: Максимальная длина имени
  2. Название: NAMELEN Значение: ? Описание: Длина введенного имени
  3. Название: NAMEFLD Значение: 20 DUP(' ') Описание: Введенное имя
  4. Название: HEADG Значение: 'List of Employee Names    Page ' Описание: Строка заголовка
  5. Название: PAGECTR Значение: '01',0AH,0AH Описание: Перевод страницы
  6. Название: FFEED Значение: 0CH Описание: Перевод страницы
  7. Название: LFEED Значение: 0AH Описание: Перевод строки
  8. Название: LINECTR Значение: 01 Описание: Счетчик строк
  9. Название: PROMPT Значение: 'Name? ' Описание: Строка запроса имени
  10. Название: A2LOOP Описание: Основной цикл ввода и печати имен
  11. Название: A30 Описание: Конец работы: вывод строки с номером страницы
  12. Название: D10INPT Описание: Подпрограмма ввода имени с клавиатуры
  13. Название: E10PRNT Описание: Подпрограмма подготовки к печати
  14. Название: M10PAGE Описание: Подпрограмма печати заголовка страницы
  15. Название: M30 Описание: Установка счетчика страниц и перевод строки
  16. Название: M40 Описание: Печать заголовка страницы
  17. Название: M50 Описание: Перевод номера страницы в ASCII
  18. Название: P10OUT Описание: Подпрограмма печати символов на экран
  19. Название: Q10CLR Описание: Очистка экрана
  20. Название: Q20CURS Описание: Установка курсора в указанную позицию

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


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

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

8   голосов , оценка 4.125 из 5