📜  C++ |汇编声明

📅  最后修改于: 2021-05-30 08:48:59             🧑  作者: Mango

众所周知,C++是一种全面而强大的编程语言,但是很少有高度专业化的情况无法处理。在这种情况下,C++提供了一个选项,使用该选项可以随时删除汇编代码。此选项使用’asm’语句。使用asm语句,可以将汇编语言直接嵌入到C++程序中。 asm关键字采用单个字段,该字段必须是字符串字面量。
asm关键字的一般形式为:

asm("op-code");

op-code :这是将包含在程序中的汇编语言指令。

一些编译器使用以下形式的asm语句:

asm instruction;
asm instruction newline
asm {instruction sequence }

一些GCC内联汇编语法如下:

  1. 寄存器命名:寄存器名称以%为前缀。
    例如,寄存器是%eax,%cl等,而不仅仅是eax,cl。
    #include
    using namespace std;
      
    int main() {
    int res;
    // move value to register %eax
    // move value to register %ebx
    // subtracting and storing result in res
    __asm__ ( "movl $20, %%eax;"
                    "movl $10, %%ebx;"
                    "subl %%ebx, %%eax ":"=a"(res));
        cout<
    输出:
    10
    
  2. 操作数的顺序与Intel约定(第一个操作数是目标)不同,操作数的顺序是源(源),目标(后)。
    例如,在AT&T汇编中,英特尔语法“ mov eax,edx”将看起来像“ mov%edx,%eax”。
    #include
    using namespace std;
      
    int main() {
    int res;
    // source 5 is written first
    // then destination register is written
    // this will move 5 to register
    __asm__ ( "movl $5, %%eax;": "=a"(res));
        cout<
    输出:
    5
    
  3. 立即操作数:立即操作数带有$前缀。例如,如“ addl $ 5,%eax”中所示,这意味着将立即长值5添加到寄存器%eax中。
    #include
    using namespace std;
      
    int main() {
    int res;
    // move immediate value 50 to register eax
    // move immediate value 20 to register ebx
    // the added value is stored in res for output
    __asm__ ( "movl $50, %%eax;"
                    "movl $20, %%ebx;"
                    "addl %%ebx, %%eax ":"=a"(res));
        cout<
    输出:
    70
    

基本上,这说明了在C++中内联汇编的用法。术语“内联”用于指示编译器在进行实际调用时将函数的代码插入其调用者的代码中。这些功能称为“内联功能”。它减少了函数调用的开销。使用asm关键字,将汇编代码编写为内联函数。
使用asm关键字的简单示例:

#include
using namespace std;
int main()
{
  // generates interrupt 5
  asm int 5;  
  
  return 0;
} 

在DOS下运行时,此程序将生成INT 5指令,该指令将调用打印屏幕函数。

内联程序集可以以以下两种格式使用:

asm("assembly code") or __asm__("assembly code")

程序说明了asm关键字的使用:

#include
using namespace std;
int main()
{
  int val1,val2, add, sub, mul;
  
   val1=100;val2=20;
    asm( "addl %%ebx, %%eax;" : "=a" (add) : "a" (val1) , "b" (val2) );
    asm( "subl %%ebx, %%eax;" : "=a" (sub) : "a" (val1) , "b" (val2) );
    asm( "imull %%ebx, %%eax;" : "=a" (mul) : "a" (val1) , "b" (val2) );
 printf( "%d + %d = %d\n ", val1, val2, add );
    printf( "%d - %d = %d ", val1,val2, sub );
    printf( "%d * %d = %d ", val1, val2, mul );
  
  return 0;
} 
输出:
100 + 20 = 120
 100 - 20 = 80 100 * 20 = 2000

例子:

Input : 10 20 
Output :10+20=30 10-20=-10 10*20=200  


Input : 30 20
Output :30+20=50 30-20=10 30*20=600

上面的程序在asm关键字的帮助下使用内联汇编执行加,减和乘运算。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”