9 / 9 / 1
Регистрация: 22.02.2011
Сообщений: 198
1
VS 2012

Как в Visual Studio 2012 в режиме 64-бит использовать ассемблер?

16.05.2014, 13:56. Показов 6827. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
как в Visual studio 2012 в режиме 64 -бит использовать ассемблер?
Или есть ли в в функциях C++ ассемблерная инструкция finit (иниациализировать сопроцессор), я в 32 битном режиме писал вот так.
Assembler
1
2
_asm
 finit;
но как вы знаете в 64 бином режиме использовать ассемблерные вставки нельзя.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2014, 13:56
Ответы с готовыми решениями:

Как открыть проект созданный в Visual Studio 2012 в Visual Studio 2008?
Нашел здесь же тему открытия Visual Studio 2012 в Visual Studio 2010 там написано так. Открыть...

Как проект на visual studio 2012 открыть на visual studio 2008
Программа(курсовая) создана на 2012, надо показать и чтобы работала на 2008. Подскажите пожалуйста...

Скажите если я напишу программу на C# в MS Visual studio 2012 на framework 3.5 я потом смогу открыть проект моей программы на MS Visual studio 2008
Скажите если я напишу программу на C# в MS Visual studio 2012 на framework 3.5 я потом смогу...

Стоит ли переходить на Visual Studio 2013 Express c Visual Studio 2012 Ultimate
Слишком дорого стоят полные версии. Какие значимые функции теряются при переходе на версию Express ?

19
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.05.2014, 21:34 2
Лучший ответ Сообщение было отмечено korez как решение

Решение

Создать файл .asm, добавить его в проект, скомпилировать через ml64.exe,
объектник подать на вход компоновщику. Можно все это делать через
настройки сборки проекта, а можно просто командную строку прописать
куда-нибудь в Build Events.
1
9 / 9 / 1
Регистрация: 22.02.2011
Сообщений: 198
16.05.2014, 22:31  [ТС] 3
Убежденный, как и куда писать строку не могли бы вы привести пример никогда с таким редактированием не сталкивался.
какой у него листинг, дайте ссылку на мануал или пример.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.05.2014, 22:44 4
Лучший ответ Сообщение было отмечено korez как решение

Решение

Кстати, добавлю, пока не забыл: в Visual C++ для многих
асмовских вещей существуют интринсики:

Compiler Intrinsics and Assembly Language
http://msdn.microsoft.com/en-u... 10%29.aspx

Добавлено через 12 минут
Цитата Сообщение от korez Посмотреть сообщение
как и куда писать строку не могли бы вы привести пример
Здесь посмотрите (с картинками!):

Assembly Programming with Visual Studio 2010/2012
http://www.codeproject.com/Art... ual-Studio

Ассемблер для Windows используя Visual Studio
http://habrahabr.ru/post/111275/
1
9 / 9 / 1
Регистрация: 22.02.2011
Сообщений: 198
17.05.2014, 00:02  [ТС] 5
Убежденный, я так понял интринсики это уже написанные библиотечные функции но там по моему нет аналога finit

Добавлено через 31 минуту
Цитата Сообщение от Убежденный Посмотреть сообщение
http://habrahabr.ru/post/111275/
У меня честно говоря dll проект и так нет вкладки Custom build rules
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.05.2014, 08:59 6
korez, а Вы никогда не компилили асмовские проекты
из командной строки (типа ml.exe /c /coff myfile.asm) ?
По-моему, самое время научиться
1
9 / 9 / 1
Регистрация: 22.02.2011
Сообщений: 198
17.05.2014, 13:33  [ТС] 7
Убежденный, да вы правы, научиться самое время буду пробовать все варианты.

Добавлено через 37 минут
проект 64 битный, мне нужно использовать 64 битный масм?

Добавлено через 2 часа 8 минут
скомпилировал, отдельно получил obj файл, но как мне его привязать в visual studio
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.05.2014, 14:11 8
Цитата Сообщение от korez Посмотреть сообщение
проект 64 битный, мне нужно использовать 64 битный масм?
Да. ml64.exe.

Цитата Сообщение от korez Посмотреть сообщение
но как мне его привязать в visual studio
Добавьте obj-файл в linker options, в раздел "input" или как там он
называется (нет под рукой, чтобы посмотреть).
1
9 / 9 / 1
Регистрация: 22.02.2011
Сообщений: 198
17.05.2014, 15:30  [ТС] 9
это ассемблерный код, скомпилировал его вот так ml64.exe /с /coff asm_code.asm
MASM : warning A4018:inval
Assembling: asm_code.asm
но файл скомпилировал в obj файл.
Assembler
1
2
3
4
5
6
7
8
9
.DATA   
.CODE
 
asm_finit PROC
finit
ret
asm_finit ENDP
 
END
вот так вызываю функцию в С++ файле.
C++
1
asm_finit();
прописал в Linker->Iput секции asm_code.obj во всех полях по ечереди но компилятор пишет
error C3861: 'asm_finit': identifier not found
наверное не туда пишу, может скомпилировал не так ассемблерный файл

заковыристый вопросец с этим асом вышел.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.05.2014, 18:41 10
А в коде на C++ функция asm_finit как объявлена ?
1
9 / 9 / 1
Регистрация: 22.02.2011
Сообщений: 198
17.05.2014, 20:30  [ТС] 11
как я и написал вот так
C++
1
asm_finit();
а что еще нужно дописать.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.05.2014, 20:33 12
Нет, я имел в виду, что функция asm_finit, чтобы компилятор ее
"переварил", должна быть объявлена. Например, так:
C++
1
2
extern "C"
void _stdcall asm_finit();
1
9 / 9 / 1
Регистрация: 22.02.2011
Сообщений: 198
17.05.2014, 20:57  [ТС] 13
дааааааа. ура ура ура ура все получилось вы мне очень помогли к вашей репутации +50.
(вообще у меня всегда все тормозиттся из-за настроек проекта, а пишу я очень быстро, один раз искал как компилировать длл в нужном формате неделю).
0
31 / 17 / 5
Регистрация: 18.07.2013
Сообщений: 220
12.08.2014, 16:06 14
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
extern "C"
{
    int _stdcall calcSumm(int a);
}
 
void main()
{
    
    int b=40;
    int r = calcSumm(b);
    printf("\n%d\n", r);    
 }

в другом файле
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.CODE
calcSumm PROC a:DWORD   
    xor esi, esi
    mov eax, a
    mov bx, 10
@div:
    xor edx, edx
    div bx
    add esi, edx    
    cmp ax, 0
    jne @div
    mov eax, esi
    ret
calcSumm ENDP
END


В регистре EAX оказывается стандартное debug значение 0xCCCCCCCC как правильно передавать и возвращать значение
1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
12.08.2014, 19:30 15
В x64 аргументы передаются через RCX, RDX, R8 и R9.
2
31 / 17 / 5
Регистрация: 18.07.2013
Сообщений: 220
13.08.2014, 03:07 16
А с функцией класса как можно поступить или придётся внутри такой функции повторно вызывать функцию, а это дополнительные расходы на вызов и возврат
1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.08.2014, 09:33 17
Вызов нестатического метода класса ничем не отличается от вызова
обычной функции, за исключением того, что первым аргументом неявно
передается указатель this. На всякий случай отмечу, что это не является
частью стандарта и в другом компиляторе может быть сделано по-другому.
1
31 / 17 / 5
Регистрация: 18.07.2013
Сообщений: 220
14.08.2014, 12:49 18
Попытка дать имя функции вида className::func1 в asm файле, мне выдало синтаксическую ошибку. Попытка в классе в объявлении функции написать extern выдало, что ключевые слова линковки не поддерживаются.

Добавлено через 19 часов 43 минуты
Вот разобрался в том как получить листинг на ассемблере для класса и ниже пример для простенького класса
C:\Users\Archi>"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64
\cl.exe" -c "C:\Users\Archi\Documents\Visual Studio 2012\Projects\CPPConsole2\CP
PConsole2\Base.cpp" /Fas
Кликните здесь для просмотра всего текста
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
27
28
29
//#include <iostream>
#include "Base.h"
 
Base::Base(void)
{
    a=7;
}
 
Base::~Base(void)
{
}
 
Base::Base(int n)
{
    a=n;
}
 
Base::Base(Base& b)
{
    a=4;
//  std::cout<< "Use copy Base ";
}
 
Base& Base::operator=(Base& b)
{
    a=9;
//  std::cout<<"Use op= ";
    return *this;
}

в папке моих документов нашёл файл s.asm
Кликните здесь для просмотра всего текста
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.61030.0 
 
include listing.inc
 
INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES
 
PUBLIC  ??0Base@@QEAA@XZ                ; Base::Base
PUBLIC  ??1Base@@QEAA@XZ                ; Base::~Base
PUBLIC  ??0Base@@QEAA@H@Z               ; Base::Base
PUBLIC  ??0Base@@QEAA@AEAV0@@Z              ; Base::Base
PUBLIC  ??4Base@@QEAAAEAV0@AEAV0@@Z         ; Base::operator=
; Function compile flags: /Odtp
_TEXT   SEGMENT
this$ = 8
b$ = 16
??4Base@@QEAAAEAV0@AEAV0@@Z PROC            ; Base::operator=
; File c:\users\archi\documents\visual studio 2012\projects\cppconsole2\cppconsole2\base.cpp
; Line 25
    mov QWORD PTR [rsp+16], rdx
    mov QWORD PTR [rsp+8], rcx
; Line 26
    mov rax, QWORD PTR this$[rsp]
    mov DWORD PTR [rax], 9
; Line 28
    mov rax, QWORD PTR this$[rsp]
; Line 29
    ret 0
??4Base@@QEAAAEAV0@AEAV0@@Z ENDP            ; Base::operator=
_TEXT   ENDS
; Function compile flags: /Odtp
_TEXT   SEGMENT
this$ = 8
b$ = 16
??0Base@@QEAA@AEAV0@@Z PROC             ; Base::Base
; File c:\users\archi\documents\visual studio 2012\projects\cppconsole2\cppconsole2\base.cpp
; Line 19
    mov QWORD PTR [rsp+16], rdx
    mov QWORD PTR [rsp+8], rcx
; Line 20
    mov rax, QWORD PTR this$[rsp]
    mov DWORD PTR [rax], 4
; Line 22
    mov rax, QWORD PTR this$[rsp]
    ret 0
??0Base@@QEAA@AEAV0@@Z ENDP             ; Base::Base
_TEXT   ENDS
; Function compile flags: /Odtp
_TEXT   SEGMENT
this$ = 8
n$ = 16
??0Base@@QEAA@H@Z PROC                  ; Base::Base
; File c:\users\archi\documents\visual studio 2012\projects\cppconsole2\cppconsole2\base.cpp
; Line 14
    mov DWORD PTR [rsp+16], edx
    mov QWORD PTR [rsp+8], rcx
; Line 15
    mov rax, QWORD PTR this$[rsp]
    mov ecx, DWORD PTR n$[rsp]
    mov DWORD PTR [rax], ecx
; Line 16
    mov rax, QWORD PTR this$[rsp]
    ret 0
??0Base@@QEAA@H@Z ENDP                  ; Base::Base
_TEXT   ENDS
; Function compile flags: /Odtp
_TEXT   SEGMENT
this$ = 8
??1Base@@QEAA@XZ PROC                   ; Base::~Base
; File c:\users\archi\documents\visual studio 2012\projects\cppconsole2\cppconsole2\base.cpp
; Line 10
    mov QWORD PTR [rsp+8], rcx
; Line 11
    ret 0
??1Base@@QEAA@XZ ENDP                   ; Base::~Base
_TEXT   ENDS
; Function compile flags: /Odtp
_TEXT   SEGMENT
this$ = 8
??0Base@@QEAA@XZ PROC                   ; Base::Base
; File c:\users\archi\documents\visual studio 2012\projects\cppconsole2\cppconsole2\base.cpp
; Line 5
    mov QWORD PTR [rsp+8], rcx
; Line 6
    mov rax, QWORD PTR this$[rsp]
    mov DWORD PTR [rax], 7
; Line 7
    mov rax, QWORD PTR this$[rsp]
    ret 0
??0Base@@QEAA@XZ ENDP                   ; Base::Base
_TEXT   ENDS
END


Добавлено через 21 минуту
Для продолжения эксперимента, удалил из проекта файл Base.cpp и добавил s.asm. В итоге никаких изменений для прочей части проекта. Полагаю данным методом, можно понять какое имя надо дать PROC, чтобы он считался функцией члена класса

Добавлено через 6 часов 8 минут
Возникли проблемы со static функциями, их линковщик не находит
1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.08.2014, 14:31 19
Цитата Сообщение от Archi0 Посмотреть сообщение
Возникли проблемы со static функциями, их линковщик не находит
Это нормально. static-функции видны только в своей единице трансляции.
0
31 / 17 / 5
Регистрация: 18.07.2013
Сообщений: 220
14.08.2014, 15:04 20
При возникновении подобных проблем стоит сделать следующее 1. в окне Build Customization Files отметить галочку masm. 2. Почистить проект 3. файл с расширением .asm не должен совпадать по имени (без расширения) с файлом cpp (это, если часть функций нужно писать просто на C++) иначе выйдет два obj файла с одним именем 4. Правой клавишей щёлкнув на файле asm в окне Solution Explorer нужно выбрать в Item Type Microsoft Macro Assembler (это, если вы добавили файл asm до первого шага, то там может стоять другой Item type, означающий не участвовать в компиляции)

Добавлено через 1 минуту
Нет, я решил эту проблему, просто забыл настроить правильно, галочку не поставил на masm и Item type стоял не участвовать в компиляции
0
14.08.2014, 15:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.08.2014, 15:04
Помогаю со студенческими работами здесь

Не работает отладка кода в Visual Studio pro 2012+qt visual studio add-in 1.2.1
Здравствуйте, скажите пожалуйста в чем проблема, запускаю этот код (F5) в Visual Studio #include...

Ошибка запуск проекта Visual Studio 2012 на Visual Studio 2017
Предупреждение CS0618 'ZipEntry.Extract(string, bool)&quot; является устаревшим: 'Please use method...

Windows и Visual Studio 2012 не видит SQL Server 2012
Установил на чистый компьютер Windows 7, а затем Visual Studio 2012. Как известно, студия...

Как заменить иконки в MS Visual Studio 11 (2012) ?
Я использую MS Visual Studio, начиная с версии 2005, но такого шизоидного &quot;дизайна&quot;, какой я...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru