Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
1

Комбинирование ассемблера с С++

08.04.2015, 19:37. Просмотров 1465. Ответов 12
Метки нет (Все метки)

Пытаюсь вызвать перемененные из ассемблера в С++. Работаю в Visual Studio 2010, при компиляции выводит очень сильно раздражающую ошибку "C:\ProgramFiles(x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\masm.targets(49,5): error MSB3721: выход из команды "ml.exe /c /nologo /Zi /Fo"Debug\function.obj" /W3 /errorReport: prompt /Tafunction.asm" с кодом "1""
вот собственно главный код на С++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <conio.h>
using namespace std;
 
extern "C" short GetFromAsm(short a, short b, short c, short d);
 
int main()
{
    cout<<"Value output="<<GetFromAsm(4,5,7,8);
    _getch();
    return 0;
}
И функция которую я пытаюсь вызвать из ассемблера:
Assembler
1
2
3
4
5
6
7
8
9
.code
GetFromAsm proc 
mov ax,cx
add ax,dx
add ax,r8w
add ax,r9w
ret
GetFromAsm endp
end
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2015, 19:37
Ответы с готовыми решениями:

Вызов С++ функции из ассемблера
Здравствуйте, есть массив в ASM(уже инициализированный), вызывается функция С++...

Подсветка синтаксиса ассемблера
Здравствуйте, делаю на c# небольшой редактор. Хочу организовать подсветку...

Оцените IDE для Ассемблера
Недавно нашёл новый IDE для ассемблера: ...

Как работать с файлами WinAPI из ассемблера?
DeleteFile(&quot;\\comp1\user1\test\test1.txt&quot;); Это понятно, это изи. А как мне на...

Вызов .NET функции clrcall из ассемблера
Добрый вечер. делаю .NET хук, появилась проблема вызова из unmanaged code'a...

12
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
08.04.2015, 20:51 2
Ну во первых не знаю какая там по умолчанию call convention у MSVC но скорее всего не __fastcall а тем более что четыре параметра. Вопрос - кто стек чистить будет?
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
10.04.2015, 07:22  [ТС] 3
Проблема была решена тем, что я отключил инкрементную компоновку. Теперь когда я пытаюсь умножить значения регистров, у меня выводит тоже самую ошибку только вместо "ml.exe /c /nologo /Zi /Fo" эта ошибка "ml64.exe /c /nologo /Zi /Fo". Вот что я изменил в коде ассемблера:
Assembler
1
2
3
4
5
6
7
8
9
.code
GetFromAsm proc 
mov ax,cx
add ax,dx
add ax,r8w
mul ax,r9w
ret
GetFromAsm endp
end
Добавлено через 13 минут
все разобрался, оказывается после mul пишем только имя одного регистра, которую мы хотим умножить)
0
murderer
3325 / 1471 / 135
Регистрация: 06.10.2010
Сообщений: 3,233
10.04.2015, 07:52 4
Ну во первых не знаю какая там по умолчанию call convention у MSVC но скорее всего не __fastcall
У него код для x64 - там во всех компиляторах принято __fastcall.
0
_aux_delta
0 / 0 / 0
Регистрация: 18.08.2015
Сообщений: 2
19.08.2015, 08:44 5
3 минувших дня подряд я пытася разобраться в этой же теме. Пользуюсь MVC++ 2005 Express с полноценным компилятором MASM. Нашёл материал здесь. Пример работает, всё отлично. Попытался я нагородить свой код (изменив код функции на ассемблере):
Assembler
1
2
3
4
5
6
7
8
9
10
.686
.model flat,C
.stack
.code
myFunc proc C
mov ah,10h
int 16h
ret
myFunc endp
end
исполняемый файл попрежнему собирался без ошибок, но запуск приводил к вылету программы на том самом месте, где из C++ вызывалась функция myFunc();
Как я понял, вызов подпрограммы обслуживания прерывания BIOS: int 16h или DOS int 21h не будут работать, если их собирать средствами Visul Studio.
0
Убежденный
Ушел с форума
Эксперт С++
16138 / 7285 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
19.08.2015, 08:47 6
Цитата Сообщение от _aux_delta Посмотреть сообщение
Как я понял, вызов подпрограммы обслуживания прерывания BIOS: int 16h или DOS int 21h не будут работать, если их собирать средствами Visul Studio.
Visual Studio тут не причем, они не будут работать в любом случае, если
делать это из третьего кольца защиты (user mode). Это же защищенный режим,
какие еще прерывания ?!?
0
_aux_delta
0 / 0 / 0
Регистрация: 18.08.2015
Сообщений: 2
19.08.2015, 08:54 7
А собранные на MASM они работают. Кольца защиты это архитектура безопасности?
0
Убежденный
Ушел с форума
Эксперт С++
16138 / 7285 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
19.08.2015, 09:13 8
Цитата Сообщение от _aux_delta Посмотреть сообщение
А собранные на MASM они работают.
У меня в Windows 7 этот код вылетает на int 16h, не зависимо от того,
где он собран.

Цитата Сообщение от _aux_delta Посмотреть сообщение
Кольца защиты это архитектура безопасности?
Да.
Операционная система работает в нулевом кольце защиты, пользовательские
приложения - в третьем. Из третьего кольца прерывания (и еще много чего)
недоступны, за отдельными исключениями.
0
Archi0
28 / 14 / 5
Регистрация: 18.07.2013
Сообщений: 177
17.09.2015, 09:10 9
Вот пример
Assembler
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
27
28
29
30
31
PUBLIC  ?shl@Integer128@@QEAAXI@Z           ; Integer128::shl
 
_TEXT   SEGMENT
?shr@Integer128@@QEAAXI@Z PROC              ;void Integer128::shr(unsigned int b)
    xor rax, rax
    xor r9, r9
    cmp edx, 128
    jae SHRRet
    cmp edx, 64
    jae SHRJAE64
    mov r8, rcx; r8 -> this
    mov ecx, edx; ecx = b
    mov rax, QWORD PTR [r8+8]
    mov r9, QWORD PTR [r8]
    shrd r9, rax, cl
    shr rax, cl
    mov rcx, r8
SHRRet:
    mov QWORD PTR [rcx], r9
    mov QWORD PTR [rcx+8], rax
    ret
SHRJAE64:
    mov r8, rcx
    mov ecx, edx
    mov r9, QWORD PTR [r8+8]
    sub edx, 64
    shr r9, cl
    mov rcx, r8
    jmp SHRRet
?shr@Integer128@@QEAAXI@Z ENDP              ;void Integer128::shr(unsigned int b)
_TEXT   ENDS
C++
1
2
3
4
5
6
7
class Integer128
{
public:
    char int128 [16];
    /*Сдвигает биты числа вправо на заданное число*/
    void shr(unsigned int b);
}
Код на ассемблере в отдельном файле. Узнать какое заковыристое имя нужно дать процедуре можно из сообщения об ошибке линковщика, который обнаруживает, что вы обращаетесь к несуществующей функции. Некоторые регистры не должны меняться после выхода из процедуры, в режиме debug вы не заметите этой ошибки, а в release программа перестанет работать. Также программа наоборот может работать в release и выдавать ошибку в debug причина тому например запись в стек qword вместо dword. debug внимательно следит за стеком, а release нет
0
Black Fregat
2757 / 1418 / 391
Регистрация: 31.05.2009
Сообщений: 5,280
17.09.2015, 09:18 10
Archi0, для отключения декорирования имён используется соответствующее описание:
C++
1
extern "C" void shr(unsigned int);
0
Archi0
28 / 14 / 5
Регистрация: 18.07.2013
Сообщений: 177
17.09.2015, 09:33 11
Вроде с extern не получиться сделать данную функцию именно членом класса.
1
Black Fregat
2757 / 1418 / 391
Регистрация: 31.05.2009
Сообщений: 5,280
17.09.2015, 15:06 12
Прошу прощения, про класс как-то не заметил. Тогда действительно только так.
0
Archi0
28 / 14 / 5
Регистрация: 18.07.2013
Сообщений: 177
18.09.2015, 15:23 13
Скорее всего вы компилируете под 32 бита. error MSB3721 будет выдавать всякий раз когда ml не выполнил компиляцию. Я поменял ret на rtt и получил эту ошибку. Но выполнил команду в консоли и получил сообщение в консоли 5: error A2008:syntax error : rtt.
0
18.09.2015, 15:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2015, 15:23

Код ассемблера
у меня такая просьба помогите разобраться в коде а точнее распишите что...

Перевод из Ассемблера в C++
в интернете нашел программу, которая разрешает или запрещает доступ к USB,...

Освоение ассемблера
в общем дело подошло к сессии и надо решить задачу на ассемблере.... вся...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru