Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 08.01.2020
Сообщений: 3
TASM

Раздельная компиляция - ошибка при сборке

08.01.2020, 00:38. Показов 2687. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем привет!
У меня возникла проблема с TASM.
Нам дали задание сделать проект используя несколько файлов, а потом их залинковать.
Создал три воспомагательных файлов (InVar.asm, CalcVar.asm, OutpVar) и главный (main.asm).
Вроде сделал как в методичке, но вылазит ошибка

Assembler
1
2
3
4
5
6
07/01/2020 18:43:21 :     Building executable from - C:\1\main.obj, using switch : '/3 /x /v'
07/01/2020 18:43:22 :     Turbo Link  Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International
07/01/2020 18:43:22 :     Warning: DOSSEG directive ignored in module MAIN.ASM
07/01/2020 18:43:22 :     Error: Undefined symbol INVAR in module MAIN.ASM
07/01/2020 18:43:22 :     Error: Undefined symbol CALCVAR in module MAIN.ASM
07/01/2020 18:43:22 :     Error: Undefined symbol OUTPVAR in module MAIN.ASM
Вот код файлов:

main.asm

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
dosseg
.model small
.stack 100h
extrn InVar:far, CalcVar:far, OutpVar:far
 
datasg segment para public 'data'           
datasg ends
 
codesg segment para public 'code'
 assume cs: codesg, ds: datasg
 main:
    
 mov ax, datasg
 mov ds, ax
 
 call InVar
 call calcVar
 call OutpVar 
 
 mov ah, 4ch
 int 21h  
 
codesg ends
 
end main
InVar.asm

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
dosseg
PUBLIC B,C,D,E,F
 
datasg segment para public 'data'
    string db 4              ; ??????????? ????? ???? ? ????? + 1 (????? ??? ?????? ?????)
    db ?                 ; ??????? ????????? ?????
    db 4 dup (?)         ; ??????? ????? ? ??????? char ???????????? 0?h (?????? ?????)
ctr db 0                 ; ????????? ??????? 10 ??? 16 ??? ??????????? ? ?????
numSys dw 10             ; ??????? ????????
decrement dw 48d         ; ??????? ????? ??????? ??? ASCII ????, ??? ???????? ????? (??? 0-9 = 48, ??? ?-Z = 55, ??? a-z = 87)
compare db 10d 
 
B dw 0000h,0000h  
C dw 0000h,0000h
D db 00h
E db 00h
F dw 0000h, 0000h
 
datasg ends
 
input macro variable
 mov ah, 0Ah             ; ???? ???????
 mov dx, offset string   ; ??? ?????????? ?????? ???????
 int 21h                 ; ??????? ??? ??? ????????
 mov si, offset string   ; ??????, ???? ????? ?????????
 call strToNum           ; ?????? ??????? ???????? ?????
 mov variable, bl
 
 mov dl, 10
 mov ah, 02h
 int 21h
 mov dl, 13
 mov ah, 02h
 int 21h
endm
 
codesg segment para public 'code'
    assume cs: codesg, ds: datasg
 
;start:
 
 InVar proc far 
 public InVar
 
 mov ax, seg datasg
 mov ds, ax 
 
 input cl
 mov B, cx
 
 xor cx, cx
 input cl
 mov C, cx
 
 input D
 input E
 
 xor cx, cx
 input cl
 mov F, cx
 
 ret 
 
InVar endp
 
 jmp exit
 
strToNum proc
 ; ??????, ??? si ????????? ?? ???????? ??????
 inc si                  ; ?????? ?? ????? ???????? ????
 mov cl, [si]            ; ?????????? ????? ???????? ????
 mov ch, 0               ; ??????? ??????? cx, ????? ?? = cl
 add si, cx              ; ????? ?????? ?? ??????????? ??????
 
 ; ??????????? ??????
 mov bx, 0               ; ???? ????? ?????????? ?????????
 mov bp, 1               ; 10 ??? 16 ? ??????? ?? ???? ?????? ??????? ???????
 
untilAllStrConverted:
 ; ??????????? ????? ??????
 mov al, [si]            ; ?????????? ?????? ??? ??????????? 
 sub ax, decrement       ; ????????, ?? ??????? ????? - ?????????
 cmp al, compare         ; ?????????? ???? ?????, ???? ???? ??????? 16 ?????, ?? ????????? ?? num16Sys
 ja num16Sys
 mov ah, 0               ; ??????? ah, ????? ax = al
 mul bp                  ; ??????? ???? ????? ?? ??????? 10 ??? 16
 add bx, ax              ; ??????? ????????? ????????? ?? ??????????
 
 ; ????????????? ??????? ?????? (10 ??? 16)
 mov ax, bp              ; ?????????? ???? ?????? ? ??????? ? ax ??? ????????
 mov bp, numSys          ; ?????????? ?????? ??? ????????
 mul bp                  ; ax * numSys = dx:ax
 mov bp, ax              ; ?????? ?? ?????????? ????????
 
 ; ????????? ?? ?? ????????? ???????????
 dec si                  ; ????????? ?????? ??? ???????????
 cmp si, 1               ; ???????????, ?? ?? ??? ?? ???????????? ??? ???????
 jne untilAllStrConverted; ???? ??, ?? ?????????? ?????
 jmp exit                ; ???? ???, ?? ????????? ? ??????
 
num16sys:                ; ???? ????? ??? ??? ??????????? ????????? 16 ??????? ????????
 mov numSys, 16d         ; ??????? ??????? ????????
 add ax, decrement       ; ?????? ????? ?????????
 mov decrement, 55d      ; ??????? ???????? ?????????? ??? a-z
 mov compare, 16d        ; ?????? ?????? ?????????? ?? ???? ??????? ????????
 mov si, 1               ; ????????? ?????????
 mov cl, [si]            ; ?????????? ????? ???????? ????
 mov ch, 0               ; ??????? ??????? cx, ????? ?? = cl
 add si, cx              ; ????? ?????? ?? ??????????? ??????
 
 ; ??????????? ??????
 mov bx, 0               ; ???? ????? ?????????? ?????????
 mov bp, 1               ; 16 ? ??????? ?? ???? ?????? ??????? ???????
 sub ax, decrement       ; ?????????? ??? ??????? ?????????
 cmp al, compare         ; ?????????? ?? ??? ?????? ??????? ? a-z
 ja UpperCase            ; ???? ??, ?? ????????? ?? UpperCase 
 jmp UntilAllStrConverted; ???? ???, ?? ?????????? ??????
UpperCase:               ; ?????? ??? ????? A-Z
 add ax, decrement       ; ??????? ????? ?????????
 mov decrement, 87d      ; ??????? ???????? ?????????? ??? A-Z
 jmp untilAllStrConverted; ????????? ??????
 
exit:                    ; ?????? ???????
 ret
strToNum endp
 
codesg ends
end
CalcVar.asm

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
dosseg
extrn B:word,C:word,D:byte,E:byte,F:word
public X
 
datasg segment para public 'data'
 
K_high EQU 0000h
K_low EQU 0007h
 
; X = K - B2 + C2 / D1 - E1 * F2
 
 Temp1 dw 0000h             ; Temp1 = C2/D1                -2 byte / 1 byte, res = 1 byte
 Temp2 dw 0000h,0000h       ; Temp2 = E1*F2                -1 byte * 2 byte, res = 3 byte
 Temp3 dw 0000h,0000h       ; Temp3 = K-B2                 -4 byte - 2 byte, res = 4 byte
 Temp4 dw 0000h,0000h       ; Temp4 = Temp3+Temp1          -4 byte + 1 byte, res = 4 byte
 X     dw 1200h,0000h       ; X = Temp4-Temp2              -4 byte - 3 byte, res = 4 byte
 
datasg ends
 
codesg segment para public 'code'
    assume cs:codesg, ds:datasg
start:
 mov ax, seg datasg
 mov ds, ax 
 
CalcVar proc far   
 public CalcVar
 xor ax, ax
 xor bx, bx
 xor cx, cx
 xor dx, dx
 
; Temp1 = C2/D1
 
 mov ax, C
 mov dx, C+2
 mov cl, D 
 div cl
 mov Temp1, ax
 
 ; Temp2 = E1*F2
 
 xor cx, cx
 xor ax, ax
 mov al, [E]
 mov ah, 0
 mul [F + 2]
 mov [Temp2], ax
 mov [Temp2+2], cx
 mov al, [E]
 mov ah, 0
 mul [F]
 add [Temp2], ax
 adc [Temp2+2], cx
 
 ; Temp3 = K - B2
                                                           
 mov ax, K_low
 mov dx, K_high 
 mov bx, B
 mov cx, B+2
 sub ax, bx
 sbb dx, cx
 mov Temp3,ax
 mov Temp3+2,dx
 
 ; Temp4 = Temp3+Temp1
 
 mov ax, Temp3
 mov dx, Temp3+2
 mov bx, Temp1
 xor cx, cx
 add bx, ax
 adc cx, dx
 mov Temp4, bx
 mov Temp4+2, cx
 
 ; X = Temp4 - Temp2 -4 byte - 3 byte 
 
 mov ax, Temp4
 mov dx, Temp4+2
 mov bx, Temp2
 mov cx, Temp2+2
 sub ax, bx
 sbb dx, cx
 mov X, ax
 mov X+2, dx
 
 ret
 
 CalcVar endp
 
codesg ends
end start
OutpVar.asm

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
dosseg
extrn X:word
 
 
datasg segment para public 'data'
count db 00
 
datasg ends
 
codesg segment para public 'code'
    assume cs: codesg, ds:datasg
 
start:
 mov ax, datasg
 mov ds, ax 
 
OutpVar proc far
 public OutpVar
 
 xor ax, ax
 mov bx, X
 mov ch, bh
nextPair:
 mov cl, ch
 and ch, 0F0h
 shr ch, 4
 and cl, 0Fh
 
 mov dl, ch
 add dl, 48d
 mov ah, 2h
 int 21h
 xor dx, dx
 
 mov dl, cl
 add dl, 48d
 mov ah, 2h
 int 21h
 
 inc count
 
 cmp count, 4
 je exit_1
 
 cmp count, 2
 je molRoz
 
 mov ch, bl
 jmp nextPair
 
molRoz:
 mov bx, X+2
 mov ch, bh
 jmp nextPair
 
 exit_1:
 
 ret
 
OutpVar endp
 
codesg ends
end start
Код скорее всего не очень, но я только начинаю учить ассемблер и по отдельности все эти файлы работают, возможно, ошибка очень в тупом, но я уже 2 день ее не вижу..

Спасибо наперед за ответ!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2020, 00:38
Ответы с готовыми решениями:

Удалить лишние пробелы между словами (раздельная компиляция asm и C)
Есть программа на C++ с ассемблерным кодом. В задании нужно удалить лишние пробелы, т.е. если между пробелами больше одного пробела - всё...

Раздельная компиляция nasm+gcc для подсистемы Debian в Windows 10
Я сейчас активировал подсистему линукс в винде 10, установил из Mic.Store "Debian". Установил нужные пакеты. Makefile:runme: main.cpp...

Поменять местами части строк. Раздельная компиляция QuickC (*.c + *.asm)
Даны 2 строки. Нужно поменять местами их первые, ну допустим 5 символов. Ну т е 5 символов второй строки запихать в 1ю,а 5 символов 1й...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,928
Записей в блоге: 13
08.01.2020, 01:18
в main добавьте описания внешних процедур
Assembler
1
2
extrn OutpVar:far
.....
Добавлено через 1 минуту
А в модулях сделайте видимость процедур
Assembler
1
public OutpVar
0
0 / 0 / 0
Регистрация: 08.01.2020
Сообщений: 3
08.01.2020, 01:30  [ТС]
Что вы имеете в виду "добавьте описания внешних процедур", извините, не понимаю((
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,928
Записей в блоге: 13
08.01.2020, 01:42
Лучший ответ Сообщение было отмечено wztch как решение

Решение

Я скомпилировал все файлы - без ошибок.
Потом в командной строке DOSBox набрал
Windows Batch file
1
tlink main.obj+CalcVar.obj+InVar.obj+OutptVar.obj
Получил main.exe и предупреждения о ненужности директивы DOSSEG в модулях.

Т.е. все исходники нормальные. Вы неправильно компонуете при помощи tlink

Добавлено через 54 секунды
У вас есть и extrn и public - я сразу не увидел.
1
0 / 0 / 0
Регистрация: 08.01.2020
Сообщений: 3
08.01.2020, 01:55  [ТС]
Даа, спасибо, работает, я просто не писал .obj при использовании tlink.
Тоесть до линкования, оно так и будет показывать
Assembler
1
Undefined symbol OUTPVAR in module MAIN.ASM
?
И еще, DOSSEG не нужна ? Я так и не понял по тому что прочитал в сети.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,928
Записей в блоге: 13
08.01.2020, 01:58
В модулях - нет. А в main - на ваше усмотрение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2020, 01:58
Помогаю со студенческими работами здесь

Вставка подстроки в строку (раздельная компиляция Turbo Pascal и TASM)
В общем, было вот задание написать код в ассемблере и паскале, который будет выполнять следующую функцию: 18. procedure Insert(SubS:...

В двумерном массиве A[N*M] найти максимальный элемент в последнем столбце. (раздельная компиляция asm и C)
Есть массив A. extern "C" int Fun(int *a); z = Fun(*A); Надо вернуть максимальный элемент в последнем столбце. .686 ...

Перевод строки в число типа longint (раздельная компиляция Turbo Pascal и TASM)
Составить внешнюю подпрограмму для варианта задания, соответствующего порядковому номеру студента в списке группы. Подпрограмму оформить в...

Отсортировать по возрастанию только числа, меньше порога, введенного с клавиатуры (раздельная компиляция asm и C)
Отсортировать по возрастанию только числа, меньше порога, введенного с клавиатуры. Сортировку производить в массиве D. Числа больше...

Отредактировать текст, удаляя те слова, которые имеют больше 3-х гласных. (раздельная компиляция asm и C)
Как посчитать гласные в ассeмблере, сравнить регистр с пробелом и куда записать слово? Если я написал ерунду, то с помощью чего решить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru