Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519493
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: LINUX

2016-07-29 20:01:40

嵌入汇编语句的基本格式为:
asm("汇编语句"
        :输出寄存器
        :输入寄存器
        :会被修改的寄存器
       );
常用的寄存器约束的缩写:

r:I/O,表示使用一个通用寄存器,由GCC在%eax/ %ax/ %al、%ebx/ %bx/ %bl、%ecx/ %cx /%cl、%edx/%dx/%dl中选取一个GCC认为是合适的;
q:I/O,表示使用一个通用寄存器,与r的意义相同;
g:I/O,表示使用寄存器或内存地址;
m:I/O,表示使用内存地址;
a:I/O,表示使用%eax/%ax/%al;
b:I/O,表示使用%ebx/%bx/%bl;
c:I/O,表示使用%ecx/%cx/%cl;
d:I/O,表示使用%edx/%dx/%dl;
D:I/O,表示使用%edi/%di;
S:I/O,表示使用%esi/%si;
f:I/O,表示使用浮点寄存器;
t:I/O,表示使用第一个浮点寄存器;
u:I/O,表示使用第二个浮点寄存器;
A:I/O,表示把%eax与%edx组合成一个64位的整数值;
o:I/O,表示使用一个内存位置的偏移量;
V:I/O,表示仅仅使用一个直接内存位置;
i:I/O,表示使用一个整数类型的立即数;
n:I/O,表示使用一个带有已知整数值的立即数;
F:I/O,表示使用一个浮点类型的立即数;

=: O 表示此Output操作表达式是只写的
+ :O 表示此Output操作表达式是可读可写的
&:O 表示此Output操作表达式独占为其指定的寄存器
%:I 表示此Input操作表达式中的C/C++表达式可以与下一个Input操作表达式中的C/C++表达式互换
嵌入汇编程序规定把输出和输入寄存器统一按顺序编号,顺序是从输出寄存器序列从左到右,从上到下以"%0"开始,分别计为%0,%1,...,%9。
在执行代码时,如果不希望汇编语句被gcc优化而修改,就需要在asm符号后面添加关键字volatile。(__asm__volatile_(......);)
从制定段和偏移值的内存地址处取一个字节。 

点击(此处)折叠或打开

  1. #define get_seg_byte(seg,addr) \
  2. ({ \
  3.  register char _res; \
  4.  __asm__("push % %fs; \
  5.           mov % %ax,% %fs; \
  6.           movb % %fs:%2,% %al; \
  7.           pop % %fs" \
  8.           :"=a"(_res) \
  9.           :"0"(seg),"m"(*(addr))); \  //"0"表示使用和上面同个位置的输出相同的寄存器
  10.   
  11. _res;})


阅读(775) | 评论(0) | 转发(0) |
0

上一篇:I/O复用

下一篇:串操作指令

给主人留下些什么吧!~~