汇编指令初步(ATT格式)
目录
一、寄存器的种类
二、mov指令
三、lea指令
四、跳转指令
五、压栈/弹栈指令
六、sub/add指令
一、寄存器的种类
80386有如下通用寄存器:
- AX,BX,CX,DX;SI,DI;SP,BP(16位)
- AH,AL;BH,BL;CH,CL;DH,DL(8位)
- 以E开头的寄存器为32位
- EAX(累加器,是算术运算的主要寄存器)
- EBX(基址寄存器,在内存中寻址时存放基址)
- ECX(计数器)
- EDX(数据寄存器)
- ESI(源变址)
- EDI(目标变址)
- ESP(堆栈指针)
- EBP(基址指针)
- EIP(程序计数器,存储的是将要执行的下一条指令放在内存中的地址)
- EFLAGS(保存的是根据运算得到的结果设置的条件码ZF,CF,SF,OF)
- 段寄存器:
- CS:代码段寄存器
- SS:堆栈段寄存器
- DS:数据段寄存器
- ES、FS、GS:附加数据段寄存器
- (该图摘自教案,侵删)
- 内存有大小端之分,寄存器没有
- 整型占四个字节,短整型占两个字节,字符型占一个字节
- 指向字符/整数/字符串/数组的指针均占用四个字节(其实指针存储的就是数据在内存中的地址)
二、mov指令
mov后的字母表示操作数的长度
使用mov指令可以在寄存器与寄存器之间、内存与寄存器之间传送数据
- movl:用于传送32位的长字值(四个字节)/ 传送双字
- movw:用于传送16位的字值(两个字节)/ 传送字
- movb:用于传送8位的字值(一个字节)/ 传送字节
mov指令可以根据目的操作数的大小来决定传送的字节数
举例:movl $4, %eax 执行的是将立即数4送入到寄存器eax中;
movl %ebx, %eax 执行的是将寄存器ebx中的值送入寄存器eax中;
movl $values,%eax 表示将values的首地址送入寄存器eax中;
movl values,%eax 表示将以values为首地址共四个字节单元表示的值送入到寄存器eax中;
- movsbl %dh, %eax 表示将%dh进行符号扩展之后存入寄存器eax中(扩展位根据最高位来填充)
- movzbl %dh, %eax 表示将%dh进行零扩展之后存入寄存器eax中(扩展位由零来填充)
与查看数据相关的指令--print &value,查看value变量在内存中的地址
--x/4bt 查看内存内容(b表示单字节,h表示双字节,w表示四字 节,g表示八字节)
x 按十六进制格式显示变量,a 按十六进制格式显示变量。
u 按十六进制格式显示无符号整型;o 按八进制格式显示变量。
t 按二进制格式显示变量;d 按十进制格式显示变量
c 按字符格式显示变量;f 按浮点数格式显示变量
s 按照字符串格式显示变量
汇编代码的格式: “ 指令 源操作数 ,目的操作数 ”
示例:movl $8 , %eax
操作数:立即数(immediate)、寄存器(register)、存储器(memory)
注意:CPU计算总是仅从寄存器直接存/取数据
三、lea指令
lea 指令是mov 指令的变形
lea 指令形式是从存储器读数据到寄存器,但实际并没有引用存储器,而是将有效地址写入目的操作数(必须是寄存器)
leal S,D 表示D <---&S,将S的地址给D
据说,Intel对于设计出LEA指令颇为得意,LEA指令可以在一个时钟周期内完成,执行效率高;lea不在ALU里执行,而是在AGU(address generation unit)里执行,可提高并行效率;如:加法需要1~3个时钟周期,乘法一般需要>10个时间周,除法需要几十甚至上百个时间周期可以模拟一些三元运算例如:%ebx =% eax +% edx,不使用lea需要多条指令,而使用lea: lea (%eax,%edx,1), %ebx
lea指令和mov指令的辨析
- leaq 8(%edi), %eax==> R[%eax] = 8 + R[%edi]
- movq 8(%edi), %eax==> R[%eax] = M[8 + R[%edi]]
movl $立即数a,size(%register)是指将立即数a存放到在内存中最终地址为寄存器%register中的值 + size中的单元去
注:括号内的是寄存器,括号外size是偏移值,可为负数。
四、跳转指令
- jmp L:无条件跳转指令,跳转至L
- jge L:使用cmpl R1,R2作为判断(有符号数减法,R2-R1),大于等于则跳转至L
- jae L:使用cmpl R1,R2作为判断(无符号数减法,R2-R1),大于等于则跳转至L
五、压栈/弹栈指令
- push S:压栈指令。对于pushl S,表示R[%esp] <-- R[%esp] – 4;M[R[%esp]] <-- S,其中,4为l的字节数,且假设栈往低地址扩展。
注意:push $value表示将value的首地址压入栈中
- pop D:出栈指令。对于popl D,表示D <-- M[R[%esp]];R[%esp] <-- R[%esp] + 4,同理
push与pop也可以自动根据操作数的长度来分配入栈/出栈时栈顶指针需要减小/增大的地址长度
六、sub/add指令
- subl %eax,%edx 表示将%edx-%eax的结果存放进寄存器edx中
- addl %eax,%edx 表示将%edx+%eax的结果存放进寄存器edx中
1008.s
在调试过程中输入“p value1”即可查看value1的值,输入“p &value1”即可查看地址(p是print的缩写)
此时用p来查看value2的值默认的是打印四个字节(即会将后两个字节中的数据打印出来),所以value2会是0x??030002(根据value2的值可以算得为0x00030002)
(上机验证正确)
分析“movl %ecx, value2”这条指令,此时value2代表的是value2所处单元的首地址,该条指令代表的就是从寄存器ecx中取出的四个字节的数据复制到以value2所处单元的首地址为首的四个内存单元
输入“p $ eax”可以查看寄存器eax中的值
1009.s
- ".section .data"这一段表示申明变量,value1为一个值为400的整型(int占用四个字节),values为一个存储了400,15,20,25,30,35,40,45,50,55,60的整型数组(每个整型数值占四个字节)
- ".section .text" ".global _start" "_start:"相当于固定格式(类似于C++中的头文件,命名空间等)
- 10-12行格式一样,以第十行为例,该指令将立即数1送入寄存器edi中
- 第13行,这个时候value1可以看做它所处内存单元的首地址,将从value1首地址开始的四个字节的值送入寄存器ecx中
- 14-16行同上
- 以第18行为例,该行是将以为values+%edi+%ebx*1为首地址之后的四个字节中的数据送入寄存器eax中
先根据“p &values”得到values的首地址,再输入“x /44bx values首地址”查看以values为首地址共11*4个字节的单元的数据,
执行第十四行(按照十六进制显示eax中的数据)得到
执行第十五行,得到
执行第十六行,得到
汇编指令初步(ATT格式)相关推荐
- go语言调度器源代码情景分析之五:汇编指令
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...
- att格式汇编指令_ATT汇编语法简介
这里,我们介绍三种类型的ATT汇编指令操作数的表示方法,其中指令参考对应体系的指令集(ISA). 第一种类型是立即数(immediate),其书写方式是'$'后面跟一个用标准C表示法表示的整数,比如$ ...
- ATT格式汇编—— mov与lea的区别
ATT格式汇编-- mov与lea的区别 1. mov 数据传送指令,目的操作数不能是立即数,数据不能从内存直接传送到内存(若需要,转化成2条指令,从内存取数据到寄存器,从寄存器到内存) 2. lea ...
- Intel格式和ATT格式汇编区别
一.AT&T 格式Linux 汇编语法格式<?xml:namespace prefix = "o" /> 在 AT&T 汇编格式中,寄存器名要加上 '% ...
- CLion设置默认显示汇编指令的格式
CLion进行调试时可以查看反编译的汇编指令. 常见汇编指令格式有 Intel 和 ATT 下图是att的显示格式 下图intel显示 CLion在断点调试是默认是att,即使在当前debug环境下设 ...
- ATT汇编指令 AT&T汇编伪指令
最近一直在看OS方面的东西,其中要用到许多AT&T汇编,下面是在网上打到的关于它的伪指令方面的中英文对照版本.英文版本也可以输入如下命令来查看: info as read ...
- MIPS指令集处理器设计(支持64条汇编指令)
一.题目背景和意义 二.国内外研究现状 (略) 三.MIPS指令集处理器设计与实现 (一).MIPS指令集功能性梳理 1.MIPS指令集架构 (1).mips基础指令集格式总结 MIPS是(Micro ...
- 几条跟堆栈扯上关系的汇编指令
堆栈算是非常重要的结构了,今晚讲讲它是怎么设计的,最后讲几个跟堆栈相关的汇编指令. 初识堆栈结构 之前学过那些通用寄存器,读取方便,而且快速,但是有一个问题:就是寄存器有大小限制,数据量大的时候,寄存 ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- A ...
- 实验一 查看CPU和内存 用机器指令和汇编指令编程
一. Debug的使用 1. 什么是Debug Debug是Dos.Windows都提供的实模式(8086方式)程序调试的工具.使用它,可以查看CPU各种寄存器的内容.内存的情况和在机器码级跟踪程序运 ...
最新文章
- java三级考试_java web 学习 --第五天(Java三级考试)
- 如何防止果照外泄?自己先上传就OK!扎克伯格这波操作给网友整不会了
- Hibernate框架--学习笔记(上):hibernate项目的搭建和常用接口方法、对象的使用
- 大专经过计算机统考,成人大专计算机统考选择题汇总
- 戴维·阿克:品牌如何避免陷入竞争…
- TinyXML学习记录及整理
- 京瓷 打印 打印机 账户_UV打印机买回来成废铁?不是选择不对,而是你想太多了……...
- Uva 10817 校长的烦恼
- 为什么我们一直赚不到钱?
- Mysql调优ref_【总结】mysql调优
- Java——数据结构与算法
- eXtremeComponents 分页列表
- Roberts算子边缘检测原理及实现
- 高德地图可视化3D地图区域上添加棱柱
- 我的春招实习+秋招总结【前端开发】
- 解决 zbrush导出的模型在blender里没有颜色的问题
- CTFSHOW WEB入门
- Redis缓存及缓存粒度
- antd表格显示分页怎么取消_react + Ant Design 实现table表格分页和删除
- python结巴怎么安装pip_Python3.6 结巴分词安装和使用
热门文章
- PyTorch中通过torch.save保存模型和torch.load加载模型介绍
- 667. 优美的排列 II
- 反向传播算法为什么要“反向”
- 中国厢式货车车体市场深度研究分析报告
- cols - 表头参数一览表
- 2022超火的微信小说小程序源码-自带安装教程
- 树莓派OS Lite系统安装LXDE桌面环境
- android 格式化sd咔_如何在Android中格式化SD卡 | MOS86
- Python mysql的常用操作
- 联想小新一键恢复小孔_【联想自带一键重装系统】联想自带一键重装小孔_联想自带一键恢复...