ATT 汇编常用指令

devtools/2025/3/24 23:52:58/
汇编常用指令">汇编常用指令#
1、操作数
  • 立即数:表示常数值

    表示方法:"$"+标准C表示法表示的整数 例:$0x1F

  • 寄存器:表示某个寄存器的内容

    表示方法:"%"+寄存器的名称 例:%eax

  • 内存引用:会根据计算出来的地址访问某个内存位置。

    表示方法:这个表示方法比较多,可以利用寄存器进行间接寻址,也可以通过一个整数进行绝对寻址,也可以通过寄存器加减来寻址,例:0x104、(%rax)、4(%rax)

    (tips:4(%rax)=(%rax+4))

2、数据传送指令

​ 指令模板类一:MOV S,D(通过MOV类指令把数据从S复制到D)

MOV类由四条指令组成:movb、movw、movl、和movq。

  • movb(传送字节)
  • movw(传送字)
  • movl(传送双字)
  • movq(传送四字)
  • movabsq(传送绝对的四字)

movq和movabsq的区别在于,movq指令只能以表示为32位补码数字的立即数作为源操作数,movabsq能够以任意64位立即数值作为源操作数,并且只能以寄存器为目的。

​ 指令模板类二:MOVZ S,R(将较小的源值复制到较大的目的时使用)

该MOV类指令,在转移数据的时候,会把源值做零扩展后再转移到目的

零扩展:将目标的高位设置为0,通常针对无符号数字

  • movzbw(将做了零扩展的字节传送到字)
  • movzbl(将做了零扩展的字节传送到双字)
  • movzwl(将做了零扩展的字传送到双字)
  • movzbq(将做了零扩展的字节传送到四字)
  • movzwq(将做了零扩展的字传送到四字)

​ 指令模板类三:MOVS S,R (与MOVZ指令功能一致)

与MOV不同的点在于MOVS对源值做的是符号扩展。

符号扩展:保留数字的符号(正/负)和值的同时增加二进制数的位数,通常针对有符号数字

  • movsbw(将做了符号扩展的字节传送到字)
  • movsbl(将做了符号扩展的字节传送到双字)
  • movswl(将做了符号扩展的字传送到双字)
  • movsbq(将做了符号扩展的字节传送四字)
  • movswq(将做了符号扩展的字传送到四字)
  • movslq(将做了符号扩展的双字传送到四字)
3、数据传输实例

C语言代码:

long exchange(long *xp,long y)
{long x = *xp;*xp = y;return x;
}

输入命令:

gcc -Og -S hello.c

生成汇编文件,查看文件内容:

long exchange(long *xp, long y)
xp in %rdi,y in %rsi
exchange:
.LFB11:.cfi_startprocmovq	(%rdi), %raxmovq	%rsi, (%rdi)ret.cfi_endproc

关注第四行~第六行,第四行xp指向的内容被mov给rax寄存器,第五行y被mov给rdi寄存器储存的地址的内存,第六行ret,将%rax储存的内容返回,也就是xp指向的内容。

4、压入栈和弹出栈
  • pushq S

    功能:将一个四字值压入栈中。

    过程:先将栈指针减8,再将值写到栈顶地址

  • popq

    功能:弹出一个四字,并从栈顶位置读出数据

    过程:首先将栈顶的数据读出来,再将栈指针加8

5、算术逻辑操作
指令描述
leaq S,D将有效地址S读取到D寄存器,类似C中的&
INC D对D加1
DEC D对D减1
NEG D对D取负
NOT D对D取补
ADD S,DD+S,并将值储存在D中
SUB S,DD-S,并将值储存在D中
IMUL S,DD*S,并将值储存在D中
XOR S,DS^D,并将值储存在D中
OR S,DD|S,并将值储存在D中
AND S,DD&S,并将值储存在D中
SAL k,DD左移k位,并将值储存在D中
SHL k,D与SAL的含义一致
SAR k,D算数右移(填上0)
SHR k,D逻辑右移(填上符号位)
6、控制

6.1条件操作

​ 除了寄存器,CPU维护着一组单个位的条件码寄存器,常用的条件码:

  • CF:进位标志。最近的操作使最高位产生了进位,可用来检查无符号操作的溢出
  • ZF:零标志。最近的操作得出的结果为0
  • SF:符号标志。最近的操作得到的结果为负数
  • OF:溢出标志,最近的操作导致了一个补码溢出

6.2 跳转指令

指令跳转条件描述
jmp Label1直接跳转
jmp *Operand1间接跳转
je LabelZF相等/零
jne Label~ZF不相等/非零
js LabelSF负数
jns Label~SF非负数
jg Label(SF^OF)&ZF大于(有符号>)
jge Label~(SF^OF)大于或等于(有符号>=)
jl LabelSF^OF小于(有符号<)
jle Label(SF^OF)|ZF小于或等于(有符号<=)
ja LabelCF&ZF超过(无符号>)
jae Label~CF超过或相等(无符号>=)
jb LabelCF低于(无符号<)
jbe LabelCF|ZF低于或相等(无符号<=)

​ 上面表格中,Label一般表示的是一个标号,例如下面代码:

	movq $0,%raxjmp .L1         //此行代表直接跳过下行代码,从.L1处开始执行movq (%rax),%rdx
.L1:popq %rdx

​ 而*Operand表示的是用Operand代表的值作为跳转目标,例如

jmp *%rax //用寄存器%rax中的值作为跳转目标
jmp *(%rax) //以%rax中的值作为读地址,在从内存中读出跳转目标

​ 上面表格中除了jmp,还有许多jmp和条件码的组合的跳转指令,当满足跳转条件的时候,它们就会跳转到Label的位置。

6.3 循环

汇编没有相应的指令来表示循环,一般是将条件测试和跳转组合起来实现循环的效果,例如以下代码:

	movl  $1,%eax 
loop:imulq %rdi,%raxsubq  $1,%rdi //每次循环将rdi寄存器的值减一cmpq  $1,%rdi //比较1和rdi寄存器的值jg    loop	//若rdi>1,则保持循环

其循环等效于以下类C语言形式的代码:

long result = 1;
while(n>1)
{result *= n;n--;
}

6.4 转移控制

​ 当在函数P中调用函数Q的时候,就需要用到转移控制指令CALL,CALL指令将控制从函数P转移到函数Q时,把程序计数器设置为Q的代码的起始位置,同时记录稍后要继续P的执行代码的位置,既然有控制转移,那就有返回,一般与CALL指令配合使用的返回指令为ret。下表给出CALL和RET的一般形式:

指令描述
call Label过程调用
call *Operand过程调用
ret从过程调用中返回

【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步

文章来源:https://blog.csdn.net/m0_61164038/article/details/146412457
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/devtools/169165.html

相关文章

前端小食堂 | Day17 - 前端安全の金钟罩

&#x1f6e1;️ 今日盾牌&#xff1a;XSS/CSRF 攻防全解析 1. XSS 防御の三重结界 // &#x1f6ab; 危险操作&#xff1a;直接渲染未过滤内容 document.getElementById(content).innerHTML userInput; // ✅ 安全姿势一&#xff1a;文本转义 const escapeHTML (str)…

AI+视频赋能智慧农业:EasyCVR打造全域可视化农场监管平台

随着科技的飞速发展&#xff0c;传统农业正加速向智慧农业转型&#xff0c;农场管理也迎来了前所未有的变革机遇。在这一进程中&#xff0c;如何有效整合先进的信息技术&#xff0c;实现农场的精准化、智能化管理&#xff0c;成为了摆在农场主和农业管理者面前的关键课题。 基于…

清华大学第12弹:《DeepSeek政务应用场景与解决方案》.pdf(文末附免费下载地址)

大家好&#xff0c;我是吾鳴。 之前吾鳴给大家分享由清华大学出品的11份DeepSeek的报告&#xff0c;它们分别是&#xff1a; 《DeepSeek从入门到精通》 《AIGC发展研究》 《DeepSeek&#xff1a;赋能品牌传播与营销》 《DeepSeekDeepResearch&#xff1a;让科研像聊天一样简…

【RabbitMQ】RabbitMQ如何保证消息不丢失?

为了保证消息不丢失&#xff0c;需要在生产者、RabbitMQ本身和消费者三个环节采取相应措施。 1.生产者端&#xff1a;确保消息发送成功 1.1开启消息确认机制(Publisher Confirms) 原理&#xff1a; 生产者发送消息后&#xff0c;RabbitMQ会返回一个确认(ACK),表示消息已成功…

云计算赛题私有云服务搭建题目

【任务 1】私有云服务搭建[5 分] 【题目 1】1.1.1 基础环境配置[0.2 分] 1.控制节点主机名为 controller,设置计算节点主机名为 compute; 2.hosts 文件将 IP 地址映射为主机名。 使用提供的用户名密码,登录提供的 OpenStack 私有云平台,在当前租户下,使用 CentOS7.9 镜…

e2studio开发RA4L1(15)----配置RTC时钟及显示时间

e2studio开发RA4L1.15--配置RTC时钟及显示时间 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callbac…

001 你好LabVIEW

打开LabVIEW 新建一个工程 界面功能 保存 新建一个VI 认识前面板与程序框图 前面板工具介绍 添加一个按钮和一个指示灯 程序框图工介绍 编写一个简单的程序 添加 LED灯 选择&#xff0c;右键&#xff0c;取消标签显示 右键&#xff0c;转为数组 选中数组&#xff0c;鼠标放到…

星玲之战.重启誓约(第四章)

第 46 章&#xff1a;踏上拯救之路​ 打败卡尔后&#xff0c;小纷队虽然取得了阶段性胜利&#xff0c;但白夜猫却因重伤陷入了昏迷&#xff0c;生命垂危。他的肉身受到了极其严重的创伤&#xff0c;灵魂也变得极为虚弱。小纷队深知&#xff0c;若不尽快找到拯救白夜猫的方法&a…