att汇编教程 linux,ATT 汇编语法

6 个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;

3 个控制寄存器:%cr0,%cr2,%cr3;

6 个 debug 寄存器:%db0,%db1,%db2,%db3,%db6,%db7;

2 个测试寄存器:%tr6,%tr7;

8 个浮点寄存器栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),

%st(7).

4. 操作数顺序

操作数排列是从源(左)到目的(右),如“movl %eax(源), %ebx(目的)”

5, 符号常数

符号常数直接引用 如

value: .long 0x12a3f2de

movl value , %ebx

指令执行的结果是将常数 0x12a3f2de 装入寄存器 ebx。

引用符号地址在符号前加符号$, 如“movl $value, % ebx”则是将符号 value 的地址装入

寄存器 ebx。

6. 内存引用

Intel 语法的间接内存引用的格式为:

section:[base+index*scale+displacement]

而在 AT&T 语法中对应的形式为:

section:displacement(base,index,scale)

其 中 , base 和 index 是 任 意 的 32-bit base 和 index 寄 存 器 。 scale 可 以 取 值

1,2,4,8。如果不指定 scale 值,则默认值为 1。section 可以指定任意的段寄存器作

为段前 缀,默认的段寄存器在不同的情况下不一样。如果你在指令中指定了默认的段前缀

则编译器在目标代码中不会产生此段前缀代码。

下面是一些例子:

-4(%ebp) : base=%ebp , displacement=-4 , section 没 有 指 定 , 由 于 base

=%ebp,所以默认的 section=%ss,index,scale 没有指定,则 index 为 0。

foo(,%eax,4):index=%eax,scale=4,displacement=foo。其它域没有指定。这

里默认的 section=%ds。

foo(,1):这个表达式引用的是指针 foo 指向的地址所存放的值。注意这个表达式中没有

base 和 index,并且只有一个逗号,这是一种异常语法,但却合法。

%gs:foo:这个表达式引用的是放置于%gs 段里变量 foo 的值。

如果 call 和 jump 操作在操作数前指定前缀“ *”,则表示是一个绝对地址调用/跳转,也就

是说 jmp/call 指令指定的是一个绝对地址。如果没有指定"*",则操作数是一个相对地址。

任何指令如果其操作数是一个内存操作,则指令必须指定它的操作尺寸

(byte,word,long),也就是说必须带有指令后缀(b,w,l)。

1,内联汇编。

两种内联汇编的格式。

一、基本内联汇编的格式是

__asm__ __volatile__("Instruction List");

二、带有 C/C++表达式的内联汇编格式为:

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

规则:

1,这 4 个部分都不是必须的,任何一个部分都可以为空。

2,如 果 Clobber/Modify 为 空 , 则 其 前 面 的 冒 号 (:) 必 须 省 略 。 比 如 __asm__("mov %

%eax, %%ebx" : "=b"(foo) : "a"(inp) : ) 就 是 非 法 的 写 法 ; 而 __asm__("mov %

%eax, %%ebx" : "=b"(foo) : "a"(inp) )则是正确的。

3,"Instruction List"中的寄存器写法要遵守相关规定,比如寄存器前必须使用两个百分号(%%),

而不是像基本汇编格式一样在寄存器前只使用一个百分号(%)。比如 __asm__( " mov %%eax, %%ebx" : : );

__asm__( " mov %%eax, %%ebx" : ) 和 __asm__( " mov %eax, %ebx" ) 都 是 正 确 的 写 法 , 而

__asm__( " mov %eax, %ebx" : : );__asm__( " mov %eax, %ebx" : )和__asm__(

" mov %%eax, %%ebx" )都是错误的写法。

4,区分一个内联汇编是基本格式的还是带有 C/C++表达式格式的,其规则在于在"Instruction List"后

是否有冒号(:)的存在,如果没有则是基本格式的,否则,则是带有 C/C++表达式格式的。

5,ouput:

例子:

int func(void)

{

int b = -1;

__asm__ __volatile__(

"movl $2,%%eax"

:"=a"(b)

);

printf("--------------->%d\n",b);

return 0;

}

我们可以很清楚得看到这个输出操作由两部分组成:括号括住 的部分 (b)和引号引

住的部分"=a"。这两部分都是每一个输出操作必不可少的。其中括号里面的是c/c++

表达式,而且只能是左值表达式。而右值来自于引用部分。引号中的内容,被称作

“操作约束”(Operation Constraint),在这个例子中操作约束为"=a",它包含两个约束:

等号(=)和字母 a,其中等号(=)说明括号中左值表达式b是一个 Write-Only 的,只能够

被作为当前内联汇编的输入,而不能作为输入。而字母 a 是寄存器 EAX / AX / AL 的

简写,说明 cr0 的值要从 eax 寄存器中获取,也就是说b = eax。

6,input.

理解了output,再来理解input很容易。

__asm__("movl %0, %%db7" : : "a" (cpu->db7));

括号里面的是c/c++表达式,可以是左值,也可以是右值。

引号里面的是寄存器。寄存器作为左值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其基本格…

linux提示链接层次太多,嵌入式linuxmusic播放器

VLC music player流媒体客户端软件层次结构流媒体网络协议流视频协议是为了在客户端机和服务器之间进行通信而设计的标准化协议。根据它们的功能,网络上传输的流视频相关的协议分为三类。网络层协议:网络层协议提供了基本的网络服务支持。IP就是网络上流…

vc的UI编程PngTextButton控件的适用情况

控件继承自Cbutton。重写了其中的一些方法。适用ui类型:带图片和文字的类型的按钮,其中图片在前面,文字在后面。如下图 文件下载 转载于:https://www.cnblogs.com/songtzu/p/3415601.html

python在eclipse下中文乱码问题zz

首先要确保eclipse编辑器环境的编码为utf8,这个是大前提;其次如果py文件中含有中文字符的话,需要在py文件中对编码进行声明。1. 修改eclipse编辑器编码 a) window->preferences->general->editors->text editors->spelling-&g…

SecureCRT连接linux时主机名,secureCRT连接linux方法

jookfoon 于 2011-09-22 11:43:08发表:挺简单的zdq 于 2011-09-22 11:28:00发表:回复吧,又没钱下载了,怎么这样子咧sand302 于 2011-08-12 11:05:35发表:感谢分享,支持chongee 于 2011-08-12 10:55:11发表:收藏之前,先支持一下&am…

如何使用一个库中不存在的函数

Windows是一个不断发展的系统,很多新的 API 在操作系统更新时更新,而MASM32开发包一般在很长一段时间内都无法及时更新,如果需要在编程中使用新添加的API函数。就得自己动手来更手库文件,下面我就给大家介绍一下如何通过手动的方法…

linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、groupadd benetgrp2. useradd -g benetgrp benet3, mkdir -p /var/www/beneta, chown benet /var/www/benet ; chmod urwx /var/www/benetb, chown :benetgrp /var/www/benet或者chgrp benetgrp /var/www/benet; chmod grx /var…

清除浮动的7种方法

使用display:inline-block会出现的情况: 1.使块元素在一行显示 2.使内嵌支持宽高 3.换行被解析了 4.不设置的时候宽度由内容撑开 5.在IE6,7下步支持块标签 由于inline-block属性换行的时候被解析(有间隙)故解决方法使用浮动float:…

linux gst qt,【ARM-Linux开发】Gstreamer+QT+摄像头 编程总结

1,gstreamer开发手册,gstreamer官网(这些都不用说了吧)2,gst-launch的用法,这也不用说了吧。(白菜,鸡蛋,西红柿,砖头,鼠标……..)lqplayer--基于gstreamer和qt的Linux下的简单播放器。实现了基于…

背后的故事之 - 快乐的Lambda表达式(二)

快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式。知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们通过IL代码深入了解了Lambda表达式&#x…

linux用vsc写c语言,vscode写c语言(windows)

用vscode学习c语言。记录vscode配置c语言编译环境。1.安装vscode(版本1.27)2.安装c/c扩展。配置环境变量,以WIN10为例 ,此电脑-属性-高级系统设置-环境变量-系统变量-path-添加一条D:\Program Files\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw3…

mouseevent tips

关于roll_over 和 mouse_over的区别,这篇文章说明的很清楚,http://zengrong.net/post/1105.htm 全文如下: 在MouseEvent中,ROLL_OVER和MOUSE_OVER、ROLL_OUT和MOUSE_OUT是两对比较相似的事件,它们有什么区别呢&#xf…

mt3 linux外网搭建,MT3 换皮梦幻 Linux端架设文字教程

1.安装宝塔yum install -y wget && wget -O install.shhttp://download.bt.cn/install/install.sh&& shinstall.sh获取宝塔地址 账号 密码开放端口10030 10011 10020 10003宝塔安装网站环境n1.14 mysql 5.6 php5.4关闭防火墙,我是7系统&…

一个有关数组的题

//在这里插入代码片import java.util.*; 1. (A rookie learning Java)写的一个有关数组的题 定义一个长度为10的整型数组, 循环输入10个整数然后判断这个数组中有几个偶数, 再定义一个正好能存放这几个偶数的数组, 将上一个数组中的所有偶数…

onCreateOptionsMenu

onCreateOptionsMenu----只在Activity创建时调用一次!之后不会再被调用!onPrepareOptionsMenu----每次display menu之前,都會调用该方法,  只要按一次menu按鍵,就會调用一次。  所以你會發現每次只要按一次menu按鍵…

linux识别UDF文件系统吗,Linux Kernel UDF文件系统本地缓冲区溢出漏洞

发布日期:2012-07-04更新日期:2012-07-05受影响系统:Linux kernel 3.3.x描述:--------------------------------------------------------------------------------BUGTRAQ ID: 54279Linux Kernel是Linux操作系统的内核。Linux K…

程序编译时书写Makefile注意事项一例

在进行程序编译时,可能需要指定一些库的库的路径、头文件的路径,分别使用的参数选项是-L和-I,需要注意的是:需要确保-L和-I后边的内容不为空,否则会出现意想不到的错误,而这种错误比较难以发现,…

把一个数组分为多个数组

/*int[]arr{1,2,5,213,75,42,64,48,21,44,22}; 分为3个数组 第一个数组满足全是偶数 第二个数组满足全是3的倍数 第三个数组满足其他*/ public class E{public static void main(String[]args){int[]arr{1,2,5,213,75,42,64,48,21,44,22};int b0,c0,d0;//遍历数组,得到每个数组…