Wasup!
Зарегистрирован: 14.12.2005 Сообщения: 1
|
Добавлено: Ср Дек 14 2005 09:38 Заголовок сообщения: Assembler Как разделить программу на два модуля (.asm) ? |
|
|
Есть программа находящая максимальное и минимальное слово из вводимой строки. Для поиска слов используется процедура SearchMinMax параметры в которую передаются через ячейки памяти. Вывод на экран с помощью процедуры ShowWords параметры в которую передаются через стек.
Каким образом разделить программу так, чтобы основной код находился в одном файле main.asm, а процедуры в другом, proc.asm?
Пробовал так:
Основной файл main.asm
. Код: | model small
.stack 100h
extrn SearchMinMax:far, ShowWords:far
StackSg segment STACK
db 128 dup(?)
StackSg ends
DataSg segment public byte
SZ=80
CR=13
Lf=10
min db SZ dup(?),'$'
FH db 'c:\txt.txt',0
... ;объявление переменных
DataSg ends
CodeSg segment public byte
assume cs:CodeSg, ds:DataSg, ss:StackSg, es:DataSg
start:
mov ax,@data
mov ds,ax
...
call SearchMinMax
...
call ShowWords
...
mov ax,4c00h
int 21h
CodeSg ends
end start |
Файл с процедурами proc.asm
Код: | PUBLIC SearchMinMax, ShowWords
codProc segment public byte
assume cs:codProc
SearchMinMax proc
lea DI,str1 ;адрес строки str1 в DI
...
ret
SearchMinMax endp
ShowWords proc
mov bp,sp
mov ah,09H
...
ret
ShowWords endp
codProc ends
end |
Компилировать пробовал так:
Код: |
tasm /zi main
tasm /zi proc
tlink /v main+proc,myprog |
Но при компиляции proc.asm выдается ошибка, что переменные str1, min, max и т.д. не определены. Хотя по идее файлы должны объединятся, и объявление переменных в main.asm должно учесться в proc.asm? |
|
adonin
Зарегистрирован: 11.10.2005 Сообщения: 35
|
Добавлено: Ср Дек 14 2005 14:38 Заголовок сообщения: |
|
|
Во первых, Вы не корректно пишите функции. Функция или процедура должна писаться так, чтобы минимизировать работу с глобальными переменными: все данные нужно передавать в качестве параметров, результат - возвращать через регистры общего назначения (обычно eax и, по моему, edx).
Параметры функции передают через стек:
Код: |
push par1
push par2
...
push parn
call function
|
Функция выбирает параметры из стека (с учётом факта, что в вершине стека 8 байт - адрес возврата из функции, помещённый туда командой call function)
Если Вы все таки хотите использовать глобальные переменные, обьявите их как public. Иначе компоновщик не сможет связать обьектные модули. Вы обьявили функцию как public, чтобы вызвать её из другого модуля, аналогично поступите и с переменными.
Я бы рекомендовал: Юров "Ассемблер учебник" издательство Питер. |
|