c语言asm汇编内嵌语法.pdfVIP

  • 0
  • 0
  • 约2.89万字
  • 约 26页
  • 2026-03-16 发布于河北
  • 举报

..GC、Inlin.A、M

GC、支持在C、C、+代码中铁入汇编代码,这些汇编代码被称作GC、Inlin.A、M——GC、

内联汇编。这是、非常有用的功能,有利于我们将、C、C+语法无法表达的指令直接

潜入C、C、+代码中,另外也允许我们直接.C、C、+代码中使用汇编编写简洁高效的代码。

1.基本内联汇编

GC、中基本的内联汇编非常易懂.我们先来看两个简单的例子:

_asm_(mov.%esp,%eax)./.看起来很熟悉吧!

或者是

_asm_(

mov.$l,%ea./.SYS_exit

xo.%ebx,%ebx

in.$0x80

);

_asm_(

mov.$l,%eax\r\l.\

xo.%ebx,%ebx\r\t.\

Min.$0x80.\

);

基本内联汇编的格式是

—asm_._volatile—(Instructio.List);

1.—asm-

_asm_是GC,关键字asm的宏定义:

#defln._asm_.asm

_asm_或asm用来声明、内联汇编表达式,所以任何、内联汇编表达式都是以它开头

的,是必不可少的。

2.Instructio.List

Instructio.List是汇编指令序列。它可以是空的,比如:—asm_._volatile—或—asm_.();

都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。但并非所有

Instructio.List为空的内联汇编表达式都是没有意义的,比如:_asm_.(:::memory).就非常

有意义,它向GC、声明:“我对内存作了改动”,GC、在编译的时候,会将此因素考虑进去。

我们看、下面这个例子:

.ca.examplel.c

in.main(in.—argc.char.—argvl.

int._..(int*)_argc.

(*_p..9999.

//_asm—memory).

i((*_p.=.9999.

relur.5.

rctur.(*_p).

)

.这段代码中,那条内联汇编是被注释掉的。在这条内联汇编之前,内存指针_p所指向的内

存被赋值为9999,随即在内联汇编之后,、i语句判断—.所指向的内存与9999是否相等。

很明显,它们是相等的。GC、在优化编译的时候能够很聪明的发现这、。我们使用下面的

命令行对其进行编译:

.gc..examplel.c

选项-O表示优化编译,我们还可以指定优化等级,比如-02表示优化等级为2;选项-S表示将

C、C、+源文件编译为汇编文件,文件名和C、C、+文件、,只不过扩展名由.c变为果

我们来查看、被放在examplel.s中的编译结果,我们这里仅仅列出了使用gc.2.96在

redha.7.3上编译后的相关函数部分汇编代码。为了保持清晰性,无关的其它代码未被列出。

.ca.examplel.s

main.

push.%eb.

mov.%esp.%eb.

mov.8(%ebp).%ca..int._..(int*)_argc

mov.$9999.(%eax..(*_p..999.

mov.$5.%ea..retur.5

pop.%eb.

ret

.照、C、码和编译出的汇编代码,我们会发现汇编代码中,没有if语句相关的代码,而是

在赋值语句(*_p)=9999后直接retur.5;这是因为G

文档评论(0)

1亿VIP精品文档

相关文档