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

Вставка ассемблерного кода в С++ для очистки экрана - C++

Войти
Регистрация
Восстановить пароль
 
feanoris
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 49
06.12.2012, 22:57     Вставка ассемблерного кода в С++ для очистки экрана #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
#include <conio.h>
#include "iostream"
#include <fstream>
#include "windows.h"
#include <stdlib.h>
#include <cstdlib>
#include <string>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
   double x=5;
   double y=6;
   cout<<x;
   const char* command = "cls"; 
   _asm 
   { 
         push command 
         call system 
   }
   cout<<y;
     return 0;
}
Visual studio 12 выдает ошибку: " Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention." Подскажите, как исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 22:57     Вставка ассемблерного кода в С++ для очистки экрана
Посмотрите здесь:

C++ функции для очистки содержимого файла
C++ Вставка кода в exe-ый файл
функции для очистки буфера COM порта? C++
Функция очистки экрана приводит к выборочному крешу программы C++
C++ Как реализовать вставку ассемблерного кода в код с++ для очистки экрана?
C++ Нужно осуществить инжект ассемблерного кода в процесс
C++ Счетчик в консольном приложении без очистки экрана
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
06.12.2012, 23:00     Вставка ассемблерного кода в С++ для очистки экрана #2
а
C++
1
system("CLS");
не проще написать?
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,912
Записей в блоге: 1
06.12.2012, 23:05     Вставка ассемблерного кода в С++ для очистки экрана #3
а если уж очень асма хочется, то написать
Цитата Сообщение от SeregaC++ Посмотреть сообщение
C++
1
system("CLS");
А затем посмотреть дизассемблированный код при отладке.
feanoris
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 49
06.12.2012, 23:25  [ТС]     Вставка ассемблерного кода в С++ для очистки экрана #4
Цитата Сообщение от SeregaC++ Посмотреть сообщение
а
C++
1
system("CLS");
не проще написать?
Читать тему умеем? мне не нужно проще, мне нужно решить данный вопрос.
feanoris
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 49
06.12.2012, 23:32  [ТС]     Вставка ассемблерного кода в С++ для очистки экрана #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"
#include <conio.h>
#include "iostream"
#include <fstream>
#include "windows.h"
#include <stdlib.h>
#include <cstdlib>
#include <string>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
   double x=5;
   double y=6;
   cout<<x;
   const char* command = "cls"; 
   _asm 
   { 
         push command 
         call system 
   }
   cout<<y;
     return 0;
}
Visual studio 12 выдает ошибку: " Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention." Подскажите, как исправить?
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,912
Записей в блоге: 1
07.12.2012, 00:08     Вставка ассемблерного кода в С++ для очистки экрана #6
Цитата Сообщение от feanoris Посмотреть сообщение
Читать тему умеем? мне не нужно проще, мне нужно решить данный вопрос.
Эй, что за наезды, ребята? Попробуй так. Написал, посмотрев дизассемблированный вызов system("pause")
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdlib.h>
#include <stdio.h>
int main()
{
 
    char* command1="CLS";
    char* command2="pause";
    printf("Hello World\n");
     _asm 
     { 
           mov         esi,esp 
           push        command1;
           call        dword ptr [system]
           add         esp,4
           mov         esi,esp 
           push        command2;
           call        dword ptr [system]
           add         esp,4
   }     
return 0;
}
Добавлено через 4 минуты
Причина твоей ошибки: аргументы в стек надо не только запихивать командой push, но и вытаскивать из стека после вызова командой pop либо увеличением esp до прежней величины

Добавлено через 16 минут
ну куда ты опять ушёл???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 00:53     Вставка ассемблерного кода в С++ для очистки экрана
Еще ссылки по теме:

Разработать процедуры для добавления, форматирования и очистки информации в файле C++
C++ вставка кода на ассемблере
C++ Программа для очистки диска
C++ Вставка ассемблерного модуля в С++ проект
Запуск ассемблерного кода на выполнение из main() C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
skaa
Хочу в Исландию
 Аватар для skaa
1026 / 825 / 75
Регистрация: 10.11.2010
Сообщений: 1,626
07.12.2012, 00:53     Вставка ассемблерного кода в С++ для очистки экрана #7
У меня вот так работает:
C++
1
2
3
4
5
6
7
8
    const char command[] = "cls"; 
    _asm 
    { 
    lea eax,command[0]
    push    eax
    call    dword ptr system
    pop eax
    }
Yandex
Объявления
07.12.2012, 00:53     Вставка ассемблерного кода в С++ для очистки экрана
Ответ Создать тему
Опции темы

Текущее время: 23:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru