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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2010, 20:47   #1
Kenny McCormick
Новичок
Джуниор
 
Регистрация: 04.05.2010
Сообщений: 2
Вопрос Дальний косвенный вызов

Доброго времени суток.
Пишу программу с вызовами подпрограмм. Ближние вызовы работают - как прямые, так и косвенные. А вот с дальними проблема. Прямой дальний вызов тоже работает нормально, а косвенный работать отказывается:
Код:
.8086
.model small
.stack 256h

dseg segment; para
array dw 10
spa dd evalsumm
mainadr dw main
dseg ends

cseg segment; para
assume cs:cseg, ds:dseg;, ss:sseg

init proc
start:
mov AX, dseg
mov DS, AX
call DS:mainadr
init endp

main proc near
finit
mov BX, offset array
mov SI, 0
mov AX, 0
mov CX, 10
fill: mov array[BX][SI],AX
	inc AX
	add SI,2
loop fill
;call evalsumm; работает

;mov DI, offset spa; не работает
;call [DI]

;call dword ptr spa; не работает

call far ptr evalsumm; работает

mov AX,4C00h
int 21h
ret
main endp
cseg ends

subcode segment
assume CS:subcode

evalsumm proc far;subprog

mov SI, 2
mov AX, 0
mov CX, 5
calc: add AX, array[BX][SI]
	add SI, 4
loop calc
retf
evalsumm endp
subcode ends
end start
Таким образом, при попытках напрямую указать адрес дальней подпрограмы(начало её сегмента кода в памяти) - начинаются ошибки.
Компиллирую TASMом. Всё компиллируется и линкуется, значения CS и IP успешно уходят в стек, но вместо выполнения дальней подпрограммы начинают выполнятся совершенно другие комманды.
Подозреваю, что ошибка в определении адреса для подпрограммы:
Код:
spa dd evalsumm
и/или его использовании при вызове:
Код:
call dword ptr spa
или
Код:
mov DI, offset spa
call [DI]
поскольку в качестве значения CS при переходе в дальнюю подпрограмму фигурирует подозрительное значение 0002(если использовать прямой вызов - значение CS 14D1).
В чём может быть ошибка?
Kenny McCormick вне форума Ответить с цитированием
Старый 17.11.2010, 00:59   #2
Kenny McCormick
Новичок
Джуниор
 
Регистрация: 04.05.2010
Сообщений: 2
Лампочка Вопрос решён

Вопрос решён. Проблема состояла в неверном определении массива в памяти:
вместо
Код:
array dw 10
должно быть
Код:
array dw 10 dup(?)
Благодарности Qraizer'у.
Kenny McCormick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CR-Team ищет программистов для проeкта "Дальний Свет" Ha3aP Фриланс 6 22.10.2009 19:28
Вызов формы в C++ Скарам Помощь студентам 4 07.10.2009 17:33
Вызов PopupMenu Vladya Помощь студентам 10 31.08.2009 00:39
Дальний рубеж треугольника Паскаля NecRomant Общие вопросы Delphi 3 05.11.2008 17:03
вызов Iceman Софт 7 24.02.2008 07:30