栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

扩展内联汇编

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

扩展内联汇编

1:汇编的结构

__asm__ __volatile__(assembly template \汇编指令行

        : output operand list \输出操作数列表

        : input operand list \输入操作数列表

        : clobber list \破坏列表

内联汇编在逻辑上总是由四部分组成:

  1. 关键字 asm() 或 asm()。修饰符 volatile 或 volatile:关键字 asm 或 asm 用于说明随后的字符串是内联汇编代码块。volatile 或 volatile 是可选的,可以将它们添加到 asm 后面,禁止某些编译器的优化。其实,asm 和 __asm__几乎是相同的,惟一的区别是,当预处理程序宏中使用内联汇编时,asm 在编译过程中可能会引发警告。volatile 和 volatile 也是如此。

  2. 汇编模板:
    汇编模板是括号内的第一个部分。它包含汇编指令行,这些指令行都包括在双引号 ("") 中,以行分隔符(nt 或 n)结束。内联汇编代码的语法是相同的,但比一般的汇编代码简单得多。这其中有许多原因。例如,它不需要在汇编模板中定义数据,因为它应该始终从 C/C++ 变量引用。而且,很少有必要在汇编模板中(为可执行文件)创建一个分段。一般情况下,除了汇编指令,只允许使用一些本地标签。

#define _syscall0(type,name) 
type name(void) 
{ 
long __res; 
__asm__ volatile ("int $0x80" 
	: "=a" (__res)           //输出参数放到__res中
	: "0" (__NR_##name));    //输入参数__NR_name代表的值
if (__res >= 0) 
	return (type) __res; 
errno = -__res; 
return -1; 
}

这段代码的大体含义:触发0x80中断,进入系统调用,具体的调用函数是__NR_name代表的函数。函数返回结果会在eax中,并把eax寄存器的值(返回值) 赋值给__res

汇编指令行
一个指令的操作数是寄存器/立即类型的操作数,那么可以引用它作为一个带有百分比前缀编号的寄存器。 (%0, %1,…)

输出操作数列表
" " 中的值是可选约束修饰符
例如,=&r (ret) 的修饰符是 = 和 &。= 表示该变量是只写的。& 表示这个变量不能与任何输入操作数共享相同的寄存器。

参考: 汇编相关介绍

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678007.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号