ASM+C , кажется, проблема с линкером. Need help.
Итак, проблема.
Общая информация:
Существует большой проект под DOS, модель Large, куча кода, с, с++, просто объектные файлы (не мои вообще - Independent Jpeg Group) и асмовый код.
Асмовый код компилируется Microsoft Macro Assembler'ом версии 6.14.8444.
Сишный и плюсовый - Borland BCC версии 5.2
Линкуется это все Borland'овским Turbo Linker'ом версии 7.1.30.1
Среда разработки - Borland C++ IDE 5.02.
Проблема:
Определенный ассемблерный код, влинкованный в проект, приводит к тому, что проект перестает запускаться.
Вопрос "что говорит отладчик?" - бессмысленен, потому как в отладчик этот код тоже не загружается, что меня в тупик и ставит.
Виндовый эмулятор DOS просто аккуратно складывается, ничего не говоря.
На дестовой DOS-машине при попытке как запустить этот файл так и загрузить его в дебаггер (то есть код не успевает начать выполняться, ошибка на этапе загрузки) вываливается EMM386 с ошибкой #03 (описания не нашел) по адресу 00B8:0050 (по моим догадкам, там DOS, что там на самом деле - без понятия).
Детали:
Шла модификация библиотеки, писанной на асме, которая занимается графикой, для работы с 16 битными режимами.
Разница между исходным кодом и результирующим - около 4кб.
Тестировалось на отдельном проекте, не на том, для которого писалось, и на тестовом проекте все прекрасно работает.
При влинковывании obj-файла в основной проект возникает проблема.
Взял старый асм'овый исходник и начал его постепенно править до состояния текущего, после каждого изменения проверяя проект его на рабочесть.
И наткнулся на то, что если непосредственный вызов заменить косвенным, то возникает проблема.
Что интересно, в другой ф-ции (в том-же файле) все работает прекрасно, то есть если заменить только тут, то все ок:
Мои выводы: походу виноват линкер, хотя я могу и ошибаться.
Пробовал более старый - не помогло.
Пробовал MASM более старой версии - не помогло.
Вопрос: кто виноват и что делать??
Может быть кто-нить сталкивался с таким?
Общая информация:
Существует большой проект под DOS, модель Large, куча кода, с, с++, просто объектные файлы (не мои вообще - Independent Jpeg Group) и асмовый код.
Асмовый код компилируется Microsoft Macro Assembler'ом версии 6.14.8444.
Сишный и плюсовый - Borland BCC версии 5.2
Линкуется это все Borland'овским Turbo Linker'ом версии 7.1.30.1
Среда разработки - Borland C++ IDE 5.02.
Проблема:
Определенный ассемблерный код, влинкованный в проект, приводит к тому, что проект перестает запускаться.
Вопрос "что говорит отладчик?" - бессмысленен, потому как в отладчик этот код тоже не загружается, что меня в тупик и ставит.
Виндовый эмулятор DOS просто аккуратно складывается, ничего не говоря.
На дестовой DOS-машине при попытке как запустить этот файл так и загрузить его в дебаггер (то есть код не успевает начать выполняться, ошибка на этапе загрузки) вываливается EMM386 с ошибкой #03 (описания не нашел) по адресу 00B8:0050 (по моим догадкам, там DOS, что там на самом деле - без понятия).
Детали:
Шла модификация библиотеки, писанной на асме, которая занимается графикой, для работы с 16 битными режимами.
Разница между исходным кодом и результирующим - около 4кб.
Тестировалось на отдельном проекте, не на том, для которого писалось, и на тестовом проекте все прекрасно работает.
При влинковывании obj-файла в основной проект возникает проблема.
Взял старый асм'овый исходник и начал его постепенно править до состояния текущего, после каждого изменения проверяя проект его на рабочесть.
И наткнулся на то, что если непосредственный вызов заменить косвенным, то возникает проблема.
paintRect proc
push BP
mov BP, SP
push DI
push AX
push DX
push BX
push CX
push DS
mov AX, 0a000h
mov DS, AX
mov AX, [BP+8]
mov CX, [BP+12]
paint_y:
push CX
mov CX, [BP+10]
mov DI, [BP+6]
paint_x:
push AX
push DI
mov BX, [BP+16]
mov DX, [BP+14]
; вот код непосредственного вызова. Так все ок.
call putPixel
; вот так оно должно было работать, но не стало.
; в putting_fnc, должен быть адрес ф-ции аналогичной ф-ции putPixel
;
;call word ptr [putting_fnc]
; пробовал вызывать через регистр - картина аналогичная.
; работать не хочет. и в отладчик загружаться тоже.
;push si
;mov si, putting_fnc
;call word ptr [si]
;pop si
pop DI
inc DI
pop AX
loop paint_x
inc AX
pop CX
loop paint_y
pop DS
pop CX
pop BX
pop DX
pop AX
pop DI
pop BP
retf
paintRect endp
Что интересно, в другой ф-ции (в том-же файле) все работает прекрасно, то есть если заменить только тут, то все ок:
paintDot proc
push BP
mov BP, SP
push DS
push BX
push AX
push DI
push DX
mov AX, 0a000h
mov DS, AX
mov DI, [BP+6] ;x
mov AX, [BP+8] ;y
mov BX, [BP+12] ; high color
mov DX, [BP+10] ; low color
; Тут все работает!!!
call [putting_fnc]
pop DX
pop DI
pop AX
pop BX
pop DS
pop BP
retf
paintDot endp
Мои выводы: походу виноват линкер, хотя я могу и ошибаться.
Пробовал более старый - не помогло.
Пробовал MASM более старой версии - не помогло.
Вопрос: кто виноват и что делать??
Может быть кто-нить сталкивался с таким?
