第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

我可以在GCC中使用x86匯編的Intel語(yǔ)法嗎?

我可以在GCC中使用x86匯編的Intel語(yǔ)法嗎?

C
偶然的你 2019-10-10 16:07:28
我想寫(xiě)一個(gè)小的底層程序。對(duì)于它的某些部分,我將需要使用匯編語(yǔ)言,但代碼的其余部分將在C / C ++編寫(xiě)。因此,如果我將使用GCC將C / C ++與匯編代碼混合,是否需要使用AT&T語(yǔ)法或可以使用Intel語(yǔ)法?或如何以其他方式混合使用C / C ++和asm(intel語(yǔ)法)?我意識(shí)到也許我別無(wú)選擇,必須使用AT&T語(yǔ)法,但是我想確定一下。如果沒(méi)有選擇,我在哪里可以找到有關(guān)AT&T語(yǔ)法的完整/官方文檔?謝謝!
查看完整描述

2 回答

?
慕碼人8056858

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊

如果使用單獨(dú)的程序集文件,gas會(huì)提供一條指令來(lái)支持Intel語(yǔ)法:


.intel_syntax noprefix

它使用Intel語(yǔ)法,并且在寄存器名稱之前不需要%前綴。


如果使用內(nèi)聯(lián)匯編,則可以使用 -masm=intel


.intel_syntax noprefix在內(nèi)聯(lián)匯編開(kāi)始時(shí)使用,然后切換回.att_syntax可以使用,但如果使用任何約束,都會(huì)中斷m。內(nèi)存引用仍將以AT&T語(yǔ)法生成。


查看完整回答
反對(duì) 回復(fù) 2019-10-10
?
慕妹3242003

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊

您可以像ninjalj一樣將內(nèi)聯(lián)匯編與-masm = intel一起使用,但是當(dāng)您使用內(nèi)聯(lián)匯編包括C / C ++標(biāo)頭時(shí),可能會(huì)導(dǎo)致錯(cuò)誤。這是在Cygwin上重現(xiàn)錯(cuò)誤的代碼。


sample.cpp:

#include <cstdint>

#include <iostream>

#include <boost/thread/future.hpp>


int main(int argc, char* argv[]) {

    using Value = uint32_t;

    Value value = 0;

    asm volatile (

        "mov  %0, 1\n\t"   // Intel syntax

//      "movl $1, %0\n\t"  // AT&T  syntax

        :"=r"(value)::);


    auto expr = [](void) -> Value { return 20; };

    boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };

    std::cout << (value + func.get());

    return 0;

}

構(gòu)建此代碼時(shí),下面出現(xiàn)錯(cuò)誤消息。


g++ -E -std=c++11 -Wall -o sample.s sample.cpp

g++ -std=c++11 -Wall -masm=intel -o sample sample.cpp -lboost_system -lboost_thread

/tmp/ccuw1Qz5.s: Assembler messages:

/tmp/ccuw1Qz5.s:1022: Error: operand size mismatch for `xadd'

/tmp/ccuw1Qz5.s:1049: Error: no such instruction: `incl DWORD PTR [rax]'

/tmp/ccuw1Qz5.s:1075: Error: no such instruction: `movl DWORD PTR [rcx],%eax'

/tmp/ccuw1Qz5.s:1079: Error: no such instruction: `movl %eax,edx'

/tmp/ccuw1Qz5.s:1080: Error: no such instruction: `incl edx'

/tmp/ccuw1Qz5.s:1082: Error: no such instruction: `cmpxchgl edx,DWORD PTR [rcx]'

為了避免這些錯(cuò)誤,它需要將內(nèi)聯(lián)匯編(代碼的上半部分)與需要boost :: future之類的C / C ++代碼(下半部分)分開(kāi)。-masm = intel選項(xiàng)用于編譯包含Intel語(yǔ)法內(nèi)聯(lián)匯編的.cpp文件,而不是其他.cpp文件。


sample.hpp:

#include <cstdint>

using Value = uint32_t;

extern Value GetValue(void);


sample1.cpp: compile with -masm=intel

#include <iostream>

#include "sample.hpp"

int main(int argc, char* argv[]) {

    Value value = 0;

    asm volatile (

        "mov  %0, 1\n\t"   // Intel syntax

        :"=r"(value)::);

    std::cout << (value + GetValue());

    return 0;

}


sample2.cpp: compile without -masm=intel

#include <boost/thread/future.hpp>

#include "sample.hpp"

Value GetValue(void) {

    auto expr = [](void) -> Value { return 20; };

    boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };

    return func.get();

}


查看完整回答
反對(duì) 回復(fù) 2019-10-10
  • 2 回答
  • 0 關(guān)注
  • 1218 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)