Подскажите пожалуйста, как оформить внешнюю far процедуру в 32 разрядной системе, если мы передаем ей 2 значения типа int. Еще интересует вызов внешних С процедур из данной (например printf). Сегодня весь день пробовал, но так корректно вернуться с сишный модуль из ассемблерного и не сумел
Изменю формулировку вопроса: Подскажите пожалуйста, почему выход из внешней far процедуры не получается. Объявление функции: Код (Text): extern "C" cdecl far int asmrazn(int, int); Вызов функции: Код (Text): int result; result=asmrazn(a,b); asm файл, в котором описана процедура asmrazn Код (Text): .486 .model large extrn _op:dword PUBLIC _asmrazn .CODE _asmrazn PROC far push ebp mov ebp,esp mov eax, [ebp+12] mov ebx, [ebp+16] ... pop ebp retf _asmrazn endp end Программа вылетает на команде retf с ошибкой "Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 004028FE in module 'Project1.exe'. Read of address FFFFFFFF. Process stopped'". Насколько я понимаю, это происходит из-за того, что я потерял в стеке адрес возврата из процедуры asmrazn. Прошу подсказать, где я указал неправильное смещение. Среда 32-х разрядная.
Хм... а зачем понадобилась far-процедура? Ведь во всех реально используемых ОС под ИА-32 сегментация реально не используется, поэтому и нужды в них нет...
ретф перегружает и содовый селектор. не уверен, что такое допустимо в юзерморде. кроме того, скомпильте все на С. и фар фу и ее вызов, но в разных объектниках, слинкуйте и откройте ваши функции в отладчике. сильно сомневась, что в выни или лине там будет сал и рет фар. суффикс "фар" пережиток х86 16ти биток оставленный заради совместимости.
Решил поэкспериментировать с 16-ти разрядной средой. Там с возвратом из процедуры все хорошо. Только появился вопрос насчет вызова сишных функций из асемблерного модуля. Ассемблерная процедура принимает 2 указателя на строки (имя файла и строку) и должна записать эту строку в указанный файл. Запись в файл работает, но подсчитать кол-во символов в строке с помощью внешней функции strcmp не получается. Аналогичная ситуация и с вызовом printf. Код (Text): .model large extrn _printf:far extrn _strlen:far extrn _i:word PUBLIC _acmp .CODE _acmp proc far push bp mov bp,sp xor cx,cx mov dx,[bp+6] mov ah,5bh int 21h jc error mov handle,ax ;push [bp+8] ;call _strlen ;pop bx mov bx,handle mov cx,10h mov dx,[bp+8] mov ah,40h int 21h jmp exit error: ; push seg mess_error ; push offset mess_error ; call _printf ; ; exit: pop bp ret _acmp endp .data handle dw 0 mess_error db "Error!!!",10,13,0 end