Форум программистов, компьютерный форум CyberForum.ru

Альтернативный вызов функции - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя http://www.cyberforum.ru/cpp/thread1242580.html
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++
C++ Разделить выпуклый многоугольник на 4 равные части двумя взаимно перпендикулярными прямыми Почти то же, что и тут: http://www.cyberforum.ru/java/thread1022760.html, но хочется решить на C++. А именно: Есть некоторый выпуклый многоугольник, который необходимо разделить на 4 равные части двумя взаимно перпендикулярными прямыми. Входные данные: количество вершин и их координаты в порядке обхода. Координаты не больше 10000, самих координат не больше 1500. Координаты все целочисленные.... http://www.cyberforum.ru/cpp/thread1242320.html
C++ Отследить изменение памяти сторонним процессом
Есть основное приложение1. Есть приложение2, которое считывает и изменяет его память. Надо отследить адреса, действие(чтение или запись), значение до и после действия. Куда копать?
Adobe PDF Library (APDFL) - поместить в формируемый документ картину формата PNG C++
Всем привет! Данная тема, возможно, не вполне подходит для данного раздела, поскольку вопрос, преимущественно имеет отношение к API Adobe PDF, конкретнее, к плюсовому API. Я пишу с использованием этой библиотеки от datalogics некоторое API для формирования PDF-документов. Сбился с ног, пытаясь запихать в формируемый документ (программно, разумеется) картину формата PNG. С JPEG проблем нет,...
C++ Электронная подпись+работа с сертификатами http://www.cyberforum.ru/cpp/thread1241481.html
Здравствуйте!дали задание,саму суть понял,не могу разобраться,как начать писать программу.помогите кто чем может. Вот само задание: Разработать приложение - утилиту командной строки, или с графической оболочкой (на выбор). Утилита должна решать следующие задачи: 1. По серийному номеру находить нужный сертификат из хранилища MY 2. Выводить на экран информацию о владельце, сроке действия, и об...
C++ Освобождение динамически созданных переменных (2-ого уровня) И так, продолжу старую тему про динамику. На этот раз есть вот что: #include <iostream> #include <stdio.h> #include <conio.h> #include <math.h> using namespace std; подробнее

Показать сообщение отдельно
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
16.08.2014, 17:45     Альтернативный вызов функции
Цитата Сообщение от Izual Посмотреть сообщение
Но в тесте 2 я уже не знаю куда копать.
Провел небольшое исследование. VS игнорирует stdcall для прототипа такого вида (причем на моей VS 2012 это происходит только в отладочной сборке).
Вот код:
Assembler
1
2
3
4
5
6
7
8
9
10
    mov esi, esp
    push    0
    push    OFFSET ??_C@_07ONPBMBOP@message?$AA@
    push    OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    push    0
    call    DWORD PTR _me$1[ebp]
    add esp, 16                 ; Проблема тут(!)
    cmp esi, esp
    call    __RTC_CheckEsp
    mov DWORD PTR _res$[ebp], eax
При stdcall вызове очистку стека производит вызываемая функция. Однако, как мы видим по коду, VS пытается произвести очистку еще раз, уже в нашем коде. Подробнее тут.
В общем, как я уже говорил, работающий во всех случаях вариант без асма (хотя бы без знания) сделать будет тяжело (или даже невозможно).

Добавлено через 34 минуты
Вот код, который гененирует VS в релизе (я вручную добавил дебажную проверку):
Assembler
1
2
3
4
5
6
7
8
9
    mov esi, esp ; for check
    push    0
    push    OFFSET ??_C@_07ONPBMBOP@message?$AA@
    push    OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    push    0
    call    eax
    cmp esi, esp  ; for check
    call    __RTC_CheckEsp ; for check
    mov esi, esp  ;  for check
Этот код не падает. Кстати mingw ведет себя корректно (учитывает stdcall у прототипа с ...), генерирует для твоего примера вот такой код:
Assembler
1
2
3
4
5
6
    mov DWORD PTR [esp+12], 0
    mov DWORD PTR [esp+8], OFFSET FLAT:LC4
    mov DWORD PTR [esp+4], OFFSET FLAT:LC5
    mov DWORD PTR [esp], 0
    call    eax
    sub esp, 16
Здесь видно, что у него немного иной подход к изменению esp (когда кладем параметры на стек, то esp не меняется, зато потом, после вызова, мы корректируем его на правильное значение один раз).
Я переписал код для VS таким же способом и вставил проверку:
Assembler
1
2
3
4
5
6
7
8
9
10
    mov esi, esp ; for check
    mov DWORD PTR [esp+12], 0
    mov DWORD PTR [esp+8], OFFSET ??_C@_07ONPBMBOP@message?$AA@
    mov DWORD PTR [esp+4], OFFSET ??_C@_02PCEFGMJL@hi?$AA@
    mov DWORD PTR [esp], 0
    call    eax
    sub esp, 16
    cmp esi, esp ; for check
    call    __RTC_CheckEsp ; for check
    mov esi, esp ; for check
Все работает отлично.
Не знаю чего тут посоветовать: юзай mingw, если не хочешь связываться с ассемблером
 
Текущее время: 02:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru