far процедура

Тема в разделе "WASM.ASSEMBLER", создана пользователем vanvo3105, 8 окт 2009.

  1. vanvo3105

    vanvo3105 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2009
    Сообщения:
    7
    Подскажите пожалуйста, как оформить внешнюю far процедуру в 32 разрядной системе, если мы передаем ей 2 значения типа int. Еще интересует вызов внешних С процедур из данной (например printf). Сегодня весь день пробовал, но так корректно вернуться с сишный модуль из ассемблерного и не сумел:dntknw:
     
  2. vanvo3105

    vanvo3105 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2009
    Сообщения:
    7
    Изменю формулировку вопроса:
    Подскажите пожалуйста, почему выход из внешней far процедуры не получается.
    Объявление функции:
    Код (Text):
    1. extern "C" cdecl far int asmrazn(int, int);
    Вызов функции:
    Код (Text):
    1. int result;
    2. result=asmrazn(a,b);
    asm файл, в котором описана процедура asmrazn
    Код (Text):
    1. .486
    2. .model large
    3.  
    4. extrn  _op:dword
    5. PUBLIC _asmrazn
    6.  
    7. .CODE
    8.  
    9. _asmrazn PROC far
    10.  
    11. push ebp
    12. mov ebp,esp
    13.  
    14. mov eax, [ebp+12]
    15. mov ebx, [ebp+16]
    16. ...
    17. pop ebp
    18. retf
    19. _asmrazn endp
    20.  
    21. 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-х разрядная.
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Хм... а зачем понадобилась far-процедура? Ведь во всех реально используемых ОС под ИА-32 сегментация реально не используется, поэтому и нужды в них нет...
     
  4. vanvo3105

    vanvo3105 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2009
    Сообщения:
    7
    Ну теоретичски же это возможно?
     
  5. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Пиши retn вместо retf.
     
  6. reversecode

    reversecode Guest

    Публикаций:
    0
    vanvo3105
    а вы уверены что у вас в сишной программе дествительно код генерируеться call far ?
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ретф перегружает и содовый селектор. не уверен, что такое допустимо в юзерморде. кроме того, скомпильте все на С. и фар фу и ее вызов, но в разных объектниках, слинкуйте и откройте ваши функции в отладчике. сильно сомневась, что в выни или лине там будет сал и рет фар. суффикс "фар" пережиток х86 16ти биток оставленный заради совместимости.
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Это допустимо, но надо загружать корректный селектор. Ну а для этого нужно понимать, что ты делаешь :)
     
  9. vanvo3105

    vanvo3105 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2009
    Сообщения:
    7
    Решил поэкспериментировать с 16-ти разрядной средой. Там с возвратом из процедуры все хорошо. Только появился вопрос насчет вызова сишных функций из асемблерного модуля. Ассемблерная процедура принимает 2 указателя на строки (имя файла и строку) и должна записать эту строку в указанный файл. Запись в файл работает, но подсчитать кол-во символов в строке с помощью внешней функции strcmp не получается. Аналогичная ситуация и с вызовом printf.
    Код (Text):
    1. .model large
    2.  
    3. extrn _printf:far
    4. extrn _strlen:far
    5. extrn _i:word
    6.    
    7. PUBLIC _acmp
    8.  
    9. .CODE
    10.  
    11. _acmp   proc far
    12.     push bp
    13.     mov bp,sp
    14.  
    15.     xor cx,cx
    16.     mov dx,[bp+6]
    17.     mov ah,5bh
    18.     int 21h
    19.     jc error
    20.     mov handle,ax
    21.  
    22.     ;push [bp+8]
    23.     ;call _strlen
    24.     ;pop bx
    25.  
    26.     mov bx,handle  
    27.     mov cx,10h
    28.     mov dx,[bp+8]  
    29.     mov ah,40h 
    30.     int 21h
    31.     jmp exit
    32. error:
    33. ;   push seg mess_error
    34. ;   push offset mess_error
    35. ;   call _printf
    36. ;
    37. ;
    38. exit:
    39.     pop bp
    40.     ret
    41. _acmp  endp
    42.  
    43. .data
    44. handle  dw 0
    45. mess_error db "Error!!!",10,13,0
    46. end