Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2016, 10:56   #1
K1905
 
Регистрация: 11.02.2010
Сообщений: 7
По умолчанию Помогите исправить ошибку компилятора tasm

Абель Питер - Ассемблер и программирование для IBM PC
http://lib.rin.ru/doc/i/5734p104.html
page 60,132
Код:
TITLE   TABSRCH (COM) Табличный поиск
CODESG  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG,DS:CODESG,ES:CODESG
        ORG     100H
BEGIN:  JMP     SHORT MAIN
; -----------------------------------------------
STOKNIN DW      '23'
STOKTAB DB      '05','Excavators'
        DB      '08','Lifters   '
        DB      '09','Presses   '
        DB      '12','Valves    '
        DB      '23','Processors'
        DB      '27','Pumps     '
DESCRN  10      DUP(?)
; -----------------------------------------------
MAIN    PROC    NEAR
        MOV     AX,STOKNIN      ;Загрузить номер элемента
        XCHG    AL,AH
        MOV     CX,06           ;Число элементов в таблице
        LEA     SI,STOKTAB      ;Начальный адрес таблицы
A20:
        CMP     AX,[SI]         ;Сравнить элементы
        JE      A30             ;Если равны - выйти,
        ADD     SI,12           ;  нет - следующий элемент
        LOOP    A20
        CALL    R10ERR          ;Элемент в таблице не найден
        RET
A30:
        MOV     CX,05           ;Длина описания элемента
        LEA     DI,DESCRN       ;Адрес описания элемента
        INC     SI
        INC     SI              ;Выделить описание
        REP MOVSW               ;  из таблицы
        RET
MAIN    ENDP
;
R10ERR  PROC
;               <Вывод сообщения об ошибке>
        RET
R10ERR  ENDP

CODESG  ENDS
        END     BEGIN
Все материалы с подленника,но компилятор TASM ошибку
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: 29.asm
**Error** 29.asm(15) Illegal instruction
**Error** 29.asm(31) Undefined symbol: DESCRN
Error messages: 2
Warning messages: None
Passes: 1
Remaining memory: 452k

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 07.10.2016 в 11:06.
K1905 вне форума Ответить с цитированием
Старый 07.10.2016, 11:19   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
DESCRN 10 DUP(?)
Не указано 10 чего. db 10? dw 10? ...
p51x вне форума Ответить с цитированием
Старый 07.10.2016, 11:21   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

очень трудно изучать ассемблер по книжке с опечатками..
надеюсь, что эта мелкая опечатка - единственная!

вместо
Цитата:
Код:
DESCRN  10      DUP(?)
должно быть указание типа выделяемой памяти.
например
Код:
DESCRN  DB  10 DUP(?)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.10.2016, 23:36   #4
K1905
 
Регистрация: 11.02.2010
Сообщений: 7
По умолчанию Помогите исправить ошибку компилятора tasm

Большое спасибо за подсказку.В этом учебнике много таких опечаток,но с ними справлялся сам.Мне уже через три месяца будет 70 лет,но несмотря на преклонный возраст,занимаюсь изучением ассемблера самостоятельно.
Николай.
K1905 вне форума Ответить с цитированием
Старый 09.10.2016, 04:14   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от K1905 Посмотреть сообщение
Мне уже через три месяца будет 70 лет
Круто!!! Снимаю шляпу!
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 10.10.2016, 11:41   #6
K1905
 
Регистрация: 11.02.2010
Сообщений: 7
По умолчанию Помогите исправить ошибку компилятора tasm

Абель Питер - Ассемблер и программирование для IBM PC
http://lib.rin.ru/doc/i/5734p104.html
page 60,132
Код:
TITLE   NMSORT  (EXE) Ввод и сортировка имен
; -----------------------------------------------
STACKSG   SEGMENT  PARA STACK 'Stack'
        DW      32 DUP(?)
STACKSG   ENDS
; -----------------------------------------------
DATASG  SEGMENT PARA 'Data'
NAMEPAR LABEL   BYTE            ;Имя списка параметров:
MAXNLEN DB      21              ; макс. длина
NAMELEN DB      ?               ; число введенных символов
NAMEFLD DB      21 DUP(' ')     ; имя

CRLF    DB      13, 10, '$'
ENDADDR DW      ?
MESSG1  DB      'Name?', '$'
NAMECTR DB      00
NAMETAB DB      30 DUP(20 DUP(' ')) ;Таблица имен
NAMESAV DB      20 DUP(?), 13, 10, '$'
SWAPPED DB      00
DATASG ENDS 
; ----------------------------------------------- 
CODESG SEGMENT PARA 'Code' 
BEGIN PROC FAR 
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG 
PUSH DS 
SUB AX,AX 
PUSH AX 
MOV AX,DATASG 
MOV DS,AX 
MOV ES,AX 
CLD 
LEA DI,NAMETAB 
CALL Q10CLR ;Очистить экран 
CALL Q20CURS ;Установить курсор 
A20LOOP: 
CALL B10READ ;Ввести имя с клавиатуры 
CMP NAMELEN,00 ;Есть ли еще имена? 
JZ A30 ; нет - идти на сортировку 
CMP NAMECTR,30 ;Введено 30 имен? 
JE A30 ; да - идти на сортировку 
CALL D10STOR ;Записать имя в таблицу 
JMP A20LOOP 
A30: ;Конец ввода имен 
CALL Q10CLR ;Очистить экран 
CALL Q20CURS ; и установить курсор 
CMP NAMECTR,01 ;Введено менее 2 имен? 
JBE A40 ; да - выйти 
CALL G10SORT ;Сортировать имена 
CALL K10DISP ;Вывести результат на экран 
A40: RET ;Завершить программу 
BEGIN ENDP 
; Ввод имен с клавиатуры? 
; ---------------------- 
B10READ PROC 
MOV AH,09 
LEA DX,MESSG1 ;Вывести текст запроса 
INT 21H 
MOV AH,0AH 
LEA DX,NAMEPAR ;Ввести имя 
INT 21H 
MOV AH,09 
LEA DX,CRLF ;Вывести CRLF 
INT 21H 

MOV BH,00 ;Очистить поле после имени 
MOV BL,NAMELEN ;Получить счетчик символов 
MOV CX,21 
SUB CX,BX ;Вычислить оставшуюся длину 
B20: 
MOV NAMEFLD[BX],20H ;Установить символ пробела
INC BX 
LOOP B20 
RET 
B10READ ENDP 
; Запись имени в таблицу: 
; ---------------------- 
D10STOR PROC 
INC NAMECTR ;Число имен в таблице 
CLD 
LES SI,NAMEFLD 
MOV CX,10 
REP MOVSW ;Переслать имя в таблицу 
RET 
D10STOR ENDP 
; Сортировка имен в таблице: 
; ------------------------- 
G10SORT PROC 
SUB DI,40 ;Установить адреса останова 
MOV ENDADDR,DI 
G20: 
MOV SWAPPED,00 ;Установить начало 
LEA SI,NAMETAB ; таблицы 
G30: 
MOV CX,20 ;Длина сравнения 
MOV DI,SI 
ADD DI,20 ;Следующее имя для сравнения 
MOV AX,DI 
MOV BX,SI 
REPE CMPSB ;Сравнить имя со следующим 
JBE G40 ; нет перестановки 
CALL H10XCHG ; перестановка 
G40: 
MOV SI,AX 
CMP SI,ENDADDR ;Конец таблицы? 
JBE G30 ; нет - продолжить 
CMP SWAPPED,00 ;Есть перестановки? 
JNZ G20 ; да - продолжить, 
RET ; нет - конец сортировки 
G10SORT ENDP 
; Перестановка элементов таблицы: 
; ------------------------------ 
H10XCHG PROC 
MOV CX,10 
LEA DI,NAMESAV 
MOV SI,BX 
REP MOVSW ;Сохранить меньший элемент 

MOV CX,10 
MOV DI,BX 
REP MOVSW ;Переслать больший элемент 
; на место меньшего 
MOV CX,10 
LEA SI,NAMESAV 
REP MOVSW ;Переслать сохраненный 
; элемент на место большего 
MOV SWAPPED,01 ;Признак перестановки 
RET 
H10XCHG ENDP 
; Вывод на экран отсортированные имена: 
; ------------------------------------ 
K10DISP PROC 
LEA SI,NAMETAB 
K20: 
LEA DI,NAMESAV ;Начальный адрес таблицы 
MOV CX,10 
REP MOVSW 
MOV AH,09 
LEA DX,NAMESAV 
INT 21H ;Вывести на экран 
DEC NAMECTR ;Это последний элемент? 
JNZ K20 ; нет - повторить цикл, 
RET ; да - выйти 
K10DISP ENDP 
; Очистка экрана: 
; -------------- 
Q10CLR PROC 
MOV AX,0600H 
MOV BH,61H ;Цвет (07 для ч/б) 
SUB CX,CX 
MOV DX,184FH 
INT 10H 
RET 
Q10CLR ENDP 
; Установка курсора: 
; ----------------- 
Q20CURS PROC 
MOV AH,02 
SUB BH,BH 
SUB DX,DX ;Установить курсор в 00,00 
INT 10H 
RET 
Q20CURS ENDP 

CODESG ENDS 
END BEGIN
C:\TASM\BIN>TASM.EXE 33.ASM
Все материалы с подлинника,но компилятор TASM выдает ошибку
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: 33.ASM
**Error** 33.ASM(81) Operand types do not match
Error messages: 1
Warning messages: None
Passes: 1
Remaining memory: 449k

С оформлением программного кода, как описать,пожалуйста поясните на моем конкретном обращении.С уважением Николай.

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 10.10.2016 в 11:52.
K1905 вне форума Ответить с цитированием
Старый 10.10.2016, 11:55   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

думаю, что вместо
Цитата:
Код:
LES SI,NAMEFLD
должно быть
Код:
LEA SI,NAMEFLD
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2016, 18:46   #8
K1905
 
Регистрация: 11.02.2010
Сообщений: 7
По умолчанию Помогите исправить ошибку компилятора tasm

Большое спасибо! Все правильно,заменив команду LES на LEA,tasm ошибки не показал.Похоже,что кто переводил эту книгу,не знает или плохо владеет знанием программирования потому, что во многих программах найдены ошибки или это сделано,чтобы пользователь находил эти ошибки и самостоятельно их устранял.Николай.
K1905 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить ошибку AgitoLeviafan Помощь студентам 6 19.12.2015 17:29
Помогите исправить ошибку vbn1 Общие вопросы C/C++ 5 18.05.2014 23:40
Помогите исправить ошибку. vfrc Microsoft Office Excel 0 17.11.2009 23:31
Помогите исправить ошибку Ortega Общие вопросы C/C++ 6 04.06.2009 22:39
помогите исправить ошибку Temirlan Общие вопросы Delphi 2 20.02.2009 18:42