Как включить включение asm-файлов x86 и x64 в один проект Visual Studio?

Я использую сообщество Visual Studio 2017 для создания тестового консольного приложения на C ++. Мне нужно включить функцию сборки в этот проект:

extern "C" void* __fastcall getBaseFS(void);

Чтобы включить asm-файл, я щелкнул правой кнопкой мыши проект и перешел в «Build dependencies» -> «Build Customization» и проверил «masm» в списке.

Затем я могу добавить файл asm, щелкнув правой кнопкой мыши мой проект -> Добавить новый элемент ->, а затем добавить «asm_.code getBaseFS PROC mov ecx, 0C0000100H; IA32_FS_BASE rdmsr shl rdx, 32 или rax, rdx ret getBaseFS ENDP END x64" файл, где я пишу свой код asm x86-64:

.asm

Это работает в 64-битном проекте.

Проблема в том, что при переключении платформы решений с x64 на x86:

введите описание изображения здесь

мой файл asm должен измениться. Поэтому в некотором смысле мне нужно включить в компиляцию другой файл «asm_x86.asm», который используется только для сборки x86 или x64.

Каков наилучший способ автоматизации этого переключателя?

visual-studio,assembly,masm,

1

Ответов: 2


2

Хорошо, спасибо Майклу Петчу , я решил его решить. Пришлось поместить оба x64и x86код в один .asmфайл.

(Есть еще один предложенный вариант для работы с конфигурацией сборки, но я предпочитаю метод, который я показываю здесь. Мне не повезло с тем, что конфигурации сборки исчезают, когда решения переносятся с компьютера на компьютер.)

Таким образом, я не уверен, почему использование IFDEF RAXработ , и собственные предложения Microsoft ifndef X64 этого не делают. Но хорошо. Если кто знает, напишите комментарий.

asm_code.asm файл:

IFDEF RAX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; x64 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; WinAPI to call
extrn Beep : proc


.data

align   8
beep_freq:
    dq  700 ; hz
beep_dur:
    dq  200 ; ms
str_from:
    db  "Hail from x64 asm", 0



.code

useless_sh_t_function__get_GS_a_string_and_beep PROC
    ; parameter = CHAR** for a string pointer
    ; return = value of GS register selector

    mov     rax, str_from
    mov     [rcx], rax

    mov     rdx, qword ptr [beep_dur]
    mov     rcx, qword ptr [beep_freq]
    call    Beep

    mov     rax, gs
    ret
useless_sh_t_function__get_GS_a_string_and_beep ENDP




ELSE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; x86 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.686p  
.XMM  
.model flat, C  


.data

align   4
beep_freq   dd  700 ; hz
beep_dur    dd  200 ; ms
str_from    db  "Hail from x86 asm", 0


.code

; WinAPI to call
extrn stdcall Beep@8 : proc


useless_sh_t_function__get_GS_a_string_and_beep PROC
    ; parameter = CHAR** for a string pointer
    ; return = value of GS register selector

    mov     eax, [esp + 4]
    mov     [eax], OFFSET str_from

    push    dword ptr [beep_dur]
    push    dword ptr [beep_freq]
    call    Beep@8

    mov     eax, gs
    ret
useless_sh_t_function__get_GS_a_string_and_beep ENDP


ENDIF

END

main.cpp файл:

#include "stdafx.h"
#include <Windows.h>

extern "C" {
    size_t useless_sh_t_function__get_GS_a_string_and_beep(const CHAR** ppString);
};

int main()
{
    const char* pString = NULL;
    size_t nGS = useless_sh_t_function__get_GS_a_string_and_beep(&pString);
    printf("gs=0x%Ix, %s
", nGS, pString);

    return 0;
}

2

Хорошо, что вы нашли способ обработать ваш прецедент.

Однако, если у вас больше asm-файлов или они нужны только для некоторых типов сборки, вы также можете изменить настройки для каждого отдельного файла для частей, где он отличается от значений по умолчанию для проекта.

Просто щелкните имя файла правой кнопкой мыши, чтобы перейти к его индивидуальным свойствам.

Чтобы иметь asm-файл, включенный только в сборки x64, вы можете использовать следующие настройки:

введите описание изображения здесь

А затем исключить его из 32-битных сборников:

введите описание изображения здесь

Эти параметры доступны для всех типов файлов, а не только для файлов .asm.

зрительно-студия, монтаж, MASM,
Похожие вопросы