ATT汇编指令总结

AT&T汇编指令总结


宗旨:技术的学习是有限的,分享的精神是无限的。


 

1.寄存器引用 

   引用寄存器要在寄存器号前加百分号%,“movl %eax, %ebx”。 

    80386有如下寄存器: 

    832-bit寄存器 %eax%ebx%ecx%edx%edi%esi%ebp%esp; 

    816-bit寄存器 它们事实上是上面832-bit寄存器的低16位:

                   %ax%bx%cx%dx%di%si%bp%sp; 

    88-bit寄存器  %ah%al%bh%bl%ch%cl%dh%dl

                  它们事实上是寄存器%ax%bx%cx%dx的高8位和低8位; 

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

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

    6debug寄存器  %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)。 

2. 操作数顺序 

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

3. 立即数 

    使用立即数,要在数前面加符号$

      如“movl $0x04, %ebx” 

         或者: 

         para = 0x04 

         movl $para, %ebx 

    指令执行的结果是将立即数04h装入寄存器ebx。 

4. 符号常数 

    符号常数直接引用 如 

    value: .long 0x12a3f2de 

    movl value , %ebx 

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

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

5. 操作数的长度 

    操作数的长度用加在指令后的符号表示b(byte, 8-bit), w(word, 16-bits), l (long, 32-bits),如“movb %al, %bl”“movw %ax, %bx”“movl %eax, %ebx ”。 

    如果没有指定操作数长度的话,编译器将按照目标操作数的长度来设置。比如指令“mov %ax, %bx”,由于目标操作数bx的长度为word,那么编译器将把此指令等同于“movw %ax, %bx”。同样道理,指令“mov $4, %ebx”等同于指令“movl $4, %ebx”“push %al”等同于“pushb %al”。对于没有指定操作数长度,但编译器又无法猜测的指令,编译器将会报错,比如指令“push $4”。 

6. 符号扩展和零扩展指令 

    绝大多数面向80386AT&T汇编指令与Intel格式的汇编指令都是相同的,符号扩展指令和零扩展指令则是仅有的不同格式指令。符号扩展指令和零扩展指令需要指定源操作数长度和目的操作数长度,即使在某些指令中这些操作数是隐含的。 

   在AT&T语法中,符号扩展和零扩展指令的格式为,基本部分"movs""movz"(对应Intel语法的movsxmovzx),后面跟上源操作数长度和目的操作数长度。movsbl意味着movs frombyte tolongmovbw意味着movs frombyte towordmovswl意味着movs fromword tolong。对于movz指令也一样。比如指令“movsbl %al, %edx”意味  着将al寄存器的内容进行符号扩展后放置到edx寄存器中。  

   其它的Intel格式的符号扩展指令还有: 

            cbw -- sign-extend byte in %al to word in %ax; 

            cwde -- sign-extend word in %ax to long in %eax; 

            cwd -- sign-extend word in %ax to long in %dx:%ax; 

            cdq -- sign-extend dword in %eax to quad in %edx:%eax; 

   对应的AT&T语法的指令为cbtwcwtlcwtdcltd。 

7. 调用和跳转指令 

    段内调用和跳转指令为"call""ret""jmp",段间调用和跳转指令为:"lcall""lret""ljmp"。 

    段间调用和跳转指令的格式为“lcall/ljmp $SECTION, $OFFSET”,而段间返回指令则为

    “lret $STACK-ADJUST”。 

8. 前缀 

    操作码前缀被用在下列的情况: 

        字符串重复操作指令(rep,repne); 

        指定被操作的段(cs,ds,ss,es,fs,gs); 

        进行总线加锁(lock); 

        指定地址和操作的大小(data16,addr16); 

    在AT&T汇编语法中,操作码前缀通常被单独放在一行,后面不跟任何操作数。例如,对于重复

    scas指令,其写法为: 

             repne 

             scas 

    上述操作码前缀的意义和用法如下: 

        指定被操作的段前缀为cs,ds,ss,es,fs,gs。在AT&T语法中,只需要按照

    section:memory-operand的格式就指定了相应的段前缀。比如:lcall %:realmode_swtch

    操作数/地址大小

        前缀是“data16”"addr16",它们被用来在32-bit操作数/地址代码中指定16-bit的操作数/地址。 

        总线加锁前缀“lock”,它是为了在多处理器环境中,保证在当前指令执行期间禁止一切中 断。这个前缀仅仅对ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD,XCHG指令有效,如果将Lock前缀用在其它指令之前,将会引起异常。 

        字符串重复操作前缀"rep","repe","repne"用来让字符串操作重复“%ecx”次。 

9. 内存引用 

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

        section:[base+index*scale+displacement] 

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

        section:displacement(base,index,scale) 

    其中,baseindex是任意的32-bit baseindex寄存器。scale可以取值1248。如果不指定scale值,则默认值为1section可以指定任意的段寄存器作为段前缀,默认的段寄存器在不同的情况下不一样。如果你在指令中指定了默认的段前缀,则编译器在目标代中不会产生此段前缀代码。 

如果calljump操作在操作数前指定前缀“*”,则表示是一个绝对地址调用/跳转,也就是说jmp/call指令指定的是一个绝对地址。如果没有指定"*",则操作数是一个相对地址。 

任何指令如果其操作数是一个内存操作,则指令必须指定它的操作尺寸(byte,word,long),也就是说必须带有指令后缀(b,w,l)。 

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

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

相关文章

jpush 极光推送 java

https://www.jianshu.com/p/22a4d630c01a http://blog.csdn.net/qq_35860097/article/details/75117323转载于:https://www.cnblogs.com/volatileAndCrazy/p/8508061.html

1万字30张图说清TCP协议

本篇文章较长,大家先看下目录1、简介2、TCP协议头3、TCP 数据包的编号(SEQ)4、三次握手建立连接5、四次挥手断开连接6、TCP可靠性的保证7、滑动窗口技术9、窗口滑动的数据重发9、TCP 流控制10、网线“断”了怎么办01简介TCP(Transmission Con…

比tween更有效的tween包.

感谢经典feixing1的提示. TweenLite: http://blog.greensock.com/tweenliteas3/ Tweener: http://code.google.com/p/tweener/ Burrows 翻译的 TweenLite中文文档http://www.troikaer.cn/blog/

蓝牙模块测试

蓝牙测试 宗旨:技术的学习是有限的,分享的精神的无限的。 1、发送AT,回复OK,连接成功 2、先发送 ATBTPOWER1;打开蓝牙功能,回复OK 3、发送ATBTHOST?;查询模块蓝牙地址和名称 4、发送ATBTSC…

Spring源码解析(二)BeanDefinition的Resource定位

IOC容器的初始化过程主要包括BeanDefinition的Resource定位、载入和注册。在实际项目中我们基本上操作的都是ApplicationContex的实现,我们比较熟悉的ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebapplicationContext等。ApplicationCo…

JSON.parse()

JSON.parse() 方法用于将一个 JSON 字符串转换为对象。 语法 JSON.parse(text[, reviver]) 参数说明: text:必需, 一个有效的 JSON 字符串。 reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。 返回值&#xf…

apache+php+mysql+phpadmin 服务环境搭建

前些日子,有朋友问如何用apache/php/mysql/phpadmin搭建PHP网站服务环境.现在就这个问题,我把我的一些经验与大家分享。各位同行有何建议,敬请在评论区指出,谢谢! 1.下载apache软件,以apache2.2为例。安装…

单片机(MCU)如何才能不死机之对齐访问(Aligned Access)

从一个结构体说起。如下,在 STM32F0 的程序中,我们定义了一个结构体My_Struct ,那么这个结构体占用多少内存呢?struct Struct_Def { uint8_t Var_B; uint16_t Var_W0; uint16_t Var_W1; uint32_t Var_DW; }; struct Struct_Def My…

c_str()的用法

c_str()的用法ing&#xff0c;所以函数c_str()就是将C的string转化为C的字符串数组&#xff0c;c_str()生成一个const char *指针&#xff0c;指向字符串的首地址。 char *ps[10]; string a“welcome”; strcpy(p,a.c_str()); cout<<p; 结果为"welcome".

常见的蓝牙4.0模块

常见的蓝牙4.0模块 1、TI公司的cc2540/cc2640&#xff1b;2、nordic的蓝牙4.0&#xff08;BLE&#xff09;芯片nRF51822&#xff1b;3、汇承公司的HC-05蓝牙转串口模块&#xff1a;主芯片CSR BlueCore5 MM。

Sub-process /usr/bin/dpkg returned an error code (1)解决办法

在ubuntu 16.04更新了一些东西之后用apt装ros bringup包会出现如下错误&#xff1a; Sub-process /usr/bin/dpkg returned an error code (1) 解决办法&#xff1a; cd /var/lib/dpkg sudo mv info info.bak #即备份一个info sudo mkdir info #新建一个新的info目录 sudo apt i…

小米的隔空充电,看起来好酷

昨天是1月29号&#xff0c;昨天小米发布了一个隔空充电技术&#xff0c;很火爆&#xff0c;大胆想&#xff0c;如果有一条无线充电的高速公路&#xff0c;那电动汽车还担心没有电吗&#xff1f;—— 雷总的微博原文隔空充电技术&#xff1a;如科幻电影一般&#xff0c;拿着手机…

网络基础知识 快速计算子网掩码的2种方法

网络基础知识快速计算子网掩码的2种方法<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />IP地址(IP Address)的概念及其子网掩码(Subnet Mask)的计算对于首次学习网络知识的初学者来说是一件比较困难的事情。下文所述的是我个人的…

C++ 解析Json

C 解析Json——jsoncpp JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;和xml类似&#xff0c;本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录。 Jsoncpp是个跨平台的开源库&#xff0c;下载地址&#xff1a;http://sourceforge.net/projec…

Linux下获取文件编译的时间

#include <stdio.h>#define MONTH_PER_YEAR 12 // 一年12月 #define YEAR_MONTH_DAY 20 // 年月日缓存大小 #define HOUR_MINUTES_SEC 20 // 时分秒缓存大小void GetCompileTime(void) {const char year_month[MONTH_PER_YEAR][4] { "Jan", "Fe…

同事用void把我给秀翻了!

1、聊一聊今天跟大家推荐的这首歌最近应该挺火的&#xff0c;不过没办法插入AGA的原版歌曲&#xff0c;大家觉得不错可以去找找原版歌曲收录一下。昨天建立了"最后一个bug"技术交流群,由于群成员超过200就无法直接通过群二维码加入&#xff0c;如果大家想加入扫描下面…

Spring Boot之自定义属性

选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能&#xff0c;还能实现快速开发的便捷。我想大多数人也是出于这个原因选择了Spring Boot,如果不是特殊应用场景&#xff0c;就只需要在application.properties中完成一些属性配置就能开启各模块的应用。而不像传统的XML配…

编程大师论道:PHP的魅力和不足何

编程大师论道:PHP的魅力和不足何在2008-07-01 来自&#xff1a;lizhe1985 [收藏到我的网摘]SOA 案例分析系列学习和实验 SOA 的各方面知识、方法、技术及工具Snort&#xff1a;入侵检测工具Snort使用手册&#xff1a;保护和分析 Web 站点Snort 使用手册之第2部分通过设置 Snor…

WCF基础

第1章 WCF基础本章主要介绍WCF的基本概念、构建模块以及WCF体系架构&#xff0c;以指导读者构建一个简单的WCF服务。从本章的内容中&#xff0c;我们可以了解到WCF的基本术语&#xff0c;包括地址&#xff08;Address&#xff09;、绑定&#xff08;Binding&#xff09;、契约&…

检测ARM板的RTC

#include <stdio.h> #include <time.h>// 可以测试ARM板的RTC是不是好的 void GetLocalTime(void) {time_t now;struct tm *timenow;time(&now);timenow localtime(&now);printf("Local time is %s", asctime(timenow)); }int main(void) {Get…