AT&T汇编指令
GAS中每个操作都是有一个字符的后缀,表明操作数的大小。
|
C声明 |
GAS后缀 |
大小(字节) |
|
char |
b |
1 |
|
short |
w |
2 |
|
(unsigned) int / long / char* |
l |
4 |
|
float |
s |
4 |
|
double |
l |
8 |
|
long double |
t |
10/12 |
注意:GAL使用后缀“l”同时表示4字节整数和8字节双精度浮点数,这不会产生歧义因为浮点数使用的是完全不同的指令和寄存器。
操作数格式:
|
格式 |
操作数值 |
名称 |
样例(GAS = C语言) |
|
$Imm |
Imm |
立即数寻址 |
$1 = 1 |
|
Ea |
R[Ea] |
寄存器寻址 |
%eax = eax |
|
Imm |
M[Imm] |
绝对寻址 |
0x104 = *0x104 |
|
(Ea) |
M[R[Ea]] |
间接寻址 |
(%eax)= *eax |
|
Imm(Ea) |
M[Imm+R[Ea]] |
(基址+偏移量)寻址 |
4(%eax) = *(4+eax) |
|
(Ea,Eb) |
M[R[Ea]+R[Eb]] |
变址 |
(%eax,%ebx) = *(eax+ebx) |
|
Imm(Ea,Eb) |
M[Imm+R[Ea]+R[Eb]] |
寻址 |
9(%eax,%ebx)= *(9+eax+ebx) |
|
(,Ea,s) |
M[R[Ea]*s] |
伸缩化变址寻址 |
(,%eax,4)= *(eax*4) |
|
Imm(,Ea,s) |
M[Imm+R[Ea]*s] |
伸缩化变址寻址 |
0xfc(,%eax,4)= *(0xfc+eax*4) |
|
(Ea,Eb,s) |
M(R[Ea]+R[Eb]*s) |
伸缩化变址寻址 |
(%eax,%ebx,4) = *(eax+ebx*4) |
|
Imm(Ea,Eb,s) |
M(Imm+R[Ea]+R[Eb]*s) |
伸缩化变址寻址 |
8(%eax,%ebx,4) = *(8+eax+ebx*4) |
注:M[xx]表示在存储器中xx地址的值,R[xx]表示寄存器xx的值,这种表示方法将寄存器、内存都看出一个大数组的形式。
数据传送指令:
|
指令 |
效果 |
描述 |
|
movl S,D |
D <-- S |
传双字 |
|
movw S,D |
D <-- S |
传字 |
|
movb S,D |
D <-- S |
传字节 |
|
movsbl S,D |
D <-- 符号扩展S |
符号位填充(字节->双字) |
|
movzbl S,D |
D <-- 零扩展S |
零填充(字节->双字) |
|
pushl S |
R[%esp] <-- R[%esp] – 4; M[R[%esp]] <-- S |
压栈 |
|
popl D |
D <-- M[R[%esp]]; R[%esp] <-- R[%esp] + 4; |
出栈 |
注:均假设栈往低地址扩展。
算数和逻辑操作地址:
|
指令 |
效果 |
描述 |
|
leal S,D |
D = &S |
movl地版,S地址入D,D仅能是寄存器 |
|
incl D |
D++ |
加1 |
|
decl D |
D-- |
减1 |
|
negl D |
D = -D |
取负 |
|
notl D |
D = ~D |
取反 |
|
addl S,D |
D = D + S |
加 |
|
subl S,D |
D = D – S |
减 |
|
imull S,D |
D = D*S |
乘 |
|
xorl S,D |
D = D ^ S |
异或 |
|
orl S,D |
D = D | S |
或 |
|
andl S,D |
D = D & S |
与 |
|
sall k,D |
D = D << k |
左移 |
|
shll k,D |
D = D << k |
左移(同sall) |
|
sarl k,D |
D = D >> k |
算数右移 |
|
shrl k,D |
D = D >> k |
逻辑右移 |
特殊算术操作:
|
指令 |
效果 |
描述 |
|
imull S |
R[%edx]:R[%eax] = S * R[%eax] |
无符号64位乘 |
|
mull S |
R[%edx]:R[%eax] = S * R[%eax] |
有符号64位乘 |
|
cltd S |
R[%edx]:R[%eax] = 符号位扩展R[%eax] |
转换为4字节 |
|
idivl S |
R[%edx] = R[%edx]:R[%eax] % S; R[%eax] = R[%edx]:R[%eax] / S; |
有符号除法,保存余数和商 |
|
divl S |
R[%edx] = R[%edx]:R[%eax] % S; R[%eax] = R[%edx]:R[%eax] / S; |
无符号除法,保存余数和商 |
注:64位数通常存储为,高32位放在edx,低32位放在eax。
条件码:
条件码寄存器描述了最近的算数或逻辑操作的属性。
CF:进位标志,最高位产生了进位,可用于检查无符号数溢出。
OF:溢出标志,二进制补码溢出——正溢出或负溢出。
ZF:零标志,结果为0。
SF:符号标志,操作结果为负。
比较指令:
|
指令 |
基于 |
描述 |
|
cmpb S2,S1 |
S1 – S2 |
比较字节,差关系 |
|
testb S2,S1 |
S1 & S2 |
测试字节,与关系 |
|
cmpw S2,S1 |
S1 – S2 |
比较字,差关系 |
|
testw S2,S1 |
S1 & S2 |
测试字,与关系 |
|
cmpl S2,S1 |
S1 – S2 |
比较双字,差关系 |
|
testl S2,S1 |
S1 & S2 |
测试双字,与关系 |
访问条件码指令:
|
指令 |
同义名 |
效果 |
设置条件 |
|
sete D |
setz |
D = ZF |
相等/零 |
|
setne D |
setnz |
D = ~ZF |
不等/非零 |
|
sets D |
D = SF |
负数 |
|
|
setns D |
D = ~SF |
非负数 |
|
|
setg D |
setnle |
D = ~(SF ^OF) & ZF |
大于(有符号>) |
|
setge D |
setnl |
D = ~(SF ^OF) |
小于等于(有符号>=) |
|
setl D |
setnge |
D = SF ^ OF |
小于(有符号<) |
|
setle D |
setng |
D = (SF ^ OF) | ZF |
小于等于(有符号<=) |
|
seta D |
setnbe |
D = ~CF & ~ZF |
超过(无符号>) |
|
setae D |
setnb |
D = ~CF |
超过或等于(无符号>=) |
|
setb D |
setnae |
D = CF |
低于(无符号<) |
|
setbe D |
setna |
D = CF | ZF |
低于或等于(无符号<=) |
跳转指令:
|
指令 |
同义名 |
跳转条件 |
描述 |
|
jmp Label |
1 |
直接跳转 |
|
|
jmp *Operand |
1 |
间接跳转 |
|
|
je Label |
jz |
ZF |
等于/零 |
|
jne Label |
jnz |
~ZF |
不等/非零 |
|
js Label |
SF |
负数 |
|
|
jnz Label |
~SF |
非负数 |
|
|
jg Label |
jnle |
~(SF^OF) & ~ZF |
大于(有符号>) |
|
jge Label |
jnl |
~(SF ^ OF) |
大于等于(有符号>=) |
|
jl Label |
jnge |
SF ^ OF |
小于(有符号<) |
|
jle Label |
jng |
(SF ^ OF) | ZF |
小于等于(有符号<=) |
|
ja Label |
jnbe |
~CF & ~ZF |
超过(无符号>) |
|
jae Label |
jnb |
~CF |
超过或等于(无符号>=) |
|
jb Label |
jnae |
CF |
低于(无符号<) |
|
jbe Label |
jna |
CF | ZF |
低于或等于(无符号<=) |
转移控制指令:(函数调用):
|
指令 |
描述 |
|
call Label |
过程调用,返回地址入栈,跳转到调用过程起始处,返回地址是call后面那条指令的地址 |
|
call *Operand |
|
|
leave |
为返回准备好栈,为ret准备好栈,主要是弹出函数内的栈使用及%ebp |
相关推荐:https://blog.csdn.net/ldong2007/article/details/2873611
AT&T汇编指令的更多相关文章
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- 学习linux内核时常碰到的汇编指令(1)
转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...
- Windows内核 基本汇编指令
1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- Objdump-查看汇编指令
作用 Objdump可以用来看汇编指令 查看汇编指令 测试文件 编译指令 gcc -g -o objtest 1.8.c objdump -S objtest |more /main 查看结果
- ARM汇编指令(未完待续)
ARM指令自己在看的时候,看完之后就忘了,根本记不住,而且有些ARM汇编指令在平常的时候可能根本就用不到,所以也没必要把所有的ARM指令都去记忆,所以自己就想着不去一遍一遍的复习ARM指令,而是在平常 ...
- STM32的例程GPIO的汇编指令初探
任务一:寻找main函数的汇编指令集 任务二:寻找main函数中的SystemClock_Config函数的汇编指令集 寻找main函数的汇编指令集 运行例程中GPIO工程时,总会加载startup_ ...
- ARM汇编指令的一些总结-转
ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- go语言调度器源代码情景分析之五:汇编指令
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...
随机推荐
- python系统编程(十二)
异步 同步调用就是你 喊 你朋友吃饭 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你们一起去 异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的了. from m ...
- Flask实例化配置
template_folder :指定模板存放路径,默认值:temolates from flask import Flask, url_for app = Flask(__name__,templa ...
- 创建xml文件、解析xml文件
1.创建XML文件: import codecs import xml.dom.minidom doc=xml.dom.minidom.Document() print doc root=do ...
- Maven 下载和配置环境
1.下载 Maven 的网址 www.apache.org www.apache.org 下载放到自己的文件夹里然后解压出来 然后配置环境,打开 我的电脑 按鼠标右键右键 属性 按 新建 然 ...
- poj2229 Sumsets (递推)
http://poj.org/problem?id=2229 看到题目能感觉到多半是动态规划,但是没有清晰的思路. 打表找规律: #include<cstdio> #include< ...
- django之内置Admin
本篇导航: 配置路由 定制Admin Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django ...
- python测试开发django-51.Ajax发送post请求登录案例
前言 我想实现一个登录功能:登录的接口是另外一个地方提供,页面上点登录按钮的时候,先访问登录接口,根据接口返回json信息判断是否登录成功,登录成功页面跳转,登录不成功,在登录首页显示失败原因 登录页 ...
- JS数字指定长度不足前补零的实现
问题描述: 要求输出的数字长度是固定的,如长度为2,数字为1,则输出01,即不够位数就在之前补足0. 解决方法: 方法1 function fn1(num, length) { ret ...
- 基于nginx+xxl-job+springboot高可用分布式任务调度系统
技术.原理讲解: <分布式任务调度平台XXL-JOB--源码解析一:项目介绍> <分布式任务调度平台XXL-JOB--源码解析二:基于docker搭建admin调度中心和execut ...
- 面向服务的体系架构(SOA)
面向服务的体系架构(SOA) 1.面向服务的体系架构(SOA) 面向服务的架构(service-oriented architecture)是Gartner于2O世纪9O年代中期提出的面向服务架构的概 ...