gcc内嵌汇编语言

gcc使用 “__asm__” 宏内嵌汇编语言,格式为

 __asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify); 

“__volatile__”宏表示告知编译器不要对汇编代码进行优化

“Instruction List”、Output、Input、Clobber/Modify内容分别为汇编语言,输出、输入、寄存器。gcc内嵌的汇编代码为AT&T汇编语言。

下面为一个同时求商和余的c++示例:

#include<iostream>

void getDivAndMod(int dividend, int divisor, int &quotient, int &remainder) {
    __asm__("movl %2, %%eax\n\t"
        "cltd\n\t"
        "idivl %3\n\t"
        "movl %%eax, %0\n\t"
        "movl %%edx, %1"/*汇编代码 多行加行尾\n\t*/
    :"=r"(quotient), "=r"(remainder)/*输出参数*/
    :"r"(dividend), "r"(divisor)/*输入参数*/
    :"eax", "edx");/*寄存器 上述汇编使用到的寄存器*/
}

int main(){
    int a , b;
    std::cout << "a: ";
    std::cin >> a;
    std::cout << "b: ";
    std::cin >> b;
    getDivAndMod(a, b, a, b);
    std::cout << "a / b = " << a << "\na % b = " << b << std::endl;
    return 0;
}

Windows下使用MinGW编译:

g++ test.cpp

运行结果:

a: 13
b: 3
a / b = 4
a % b = 1

编译为汇编语言:

g++ -S test.cpp

编译结果中的主要代码:

_Z12getDivAndModiiRiS_:
.LFB1573:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	.seh_endprologue
	movl	%ecx, 16(%rbp)
	movl	%edx, 24(%rbp)
	movq	%r8, 32(%rbp)
	movq	%r9, 40(%rbp)
	movl	16(%rbp), %ecx
	movl	24(%rbp), %r8d

发表评论

电子邮件地址不会被公开。 必填项已用*标注