Программа печати, ошибки - Assembler
Формулировка задачи:
Доброго времени суток!
Помогите пожалуйста с программой печати.
Есть программа:
Компилятор почему то ругается на переменные. Как это исправить?
Я не знаю, может в MASM чего не хватает, какой либо библиотеки, программа взята из книги Питера Абеля.
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 |
Решение задачи: «Программа печати, ошибки»
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
Объяснение кода листинга программы
- Название: MAXNLEN Значение: 20 Описание: Максимальная длина имени
- Название: NAMELEN Значение: ? Описание: Длина введенного имени
- Название: NAMEFLD Значение: 20 DUP(' ') Описание: Введенное имя
- Название: HEADG Значение: 'List of Employee Names Page ' Описание: Строка заголовка
- Название: PAGECTR Значение: '01',0AH,0AH Описание: Перевод страницы
- Название: FFEED Значение: 0CH Описание: Перевод страницы
- Название: LFEED Значение: 0AH Описание: Перевод строки
- Название: LINECTR Значение: 01 Описание: Счетчик строк
- Название: PROMPT Значение: 'Name? ' Описание: Строка запроса имени
- Название: A2LOOP Описание: Основной цикл ввода и печати имен
- Название: A30 Описание: Конец работы: вывод строки с номером страницы
- Название: D10INPT Описание: Подпрограмма ввода имени с клавиатуры
- Название: E10PRNT Описание: Подпрограмма подготовки к печати
- Название: M10PAGE Описание: Подпрограмма печати заголовка страницы
- Название: M30 Описание: Установка счетчика страниц и перевод строки
- Название: M40 Описание: Печать заголовка страницы
- Название: M50 Описание: Перевод номера страницы в ASCII
- Название: P10OUT Описание: Подпрограмма печати символов на экран
- Название: Q10CLR Описание: Очистка экрана
- Название: Q20CURS Описание: Установка курсора в указанную позицию
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д