总结:常用的通用数据处理指令

简介: 作者:bakari  时间:2012.4.21   1、 操作数类型 Imm立即操作数 Reg寄存器操作数 Mem内存操作数 2、 操作数寻址方式 立即数寻址 寄存器数寻址 存储器寻址 3、 数据传送类指令 (重点介绍)mov、xchg、push、pop、lea (除标志寄存...

作者:bakari  时间:2012.4.21

 

1、 操作数类型

Imm立即操作数

Reg寄存器操作数

Mem内存操作数

2、 操作数寻址方式

立即数寻址

寄存器数寻址

存储器寻址

3、 数据传送类指令

(重点介绍)movxchgpushpoplea

(除标志寄存器指令外,其余均不影响标志位)

1.1、  通用数据传送指令

1)、Mov传送指令

 

两个操作数的尺寸必须是一致的(但movzxmovsx例外)

两个操作数不能同时为内存操作数(内存数据不能直接传送)

指令规则       目的操作数不能为CSEIPIP(会覆盖原来其指向的数)

立即数不能直接送段寄存器(不允许:mov DS ,Data

两个段寄存器之间不能直接传送数据

(其余指令与此类似)

MOVSX:符号扩展

MOVZX:零扩展

8位或16位扩展为32位,两个操作数的尺寸不一致,目的操作数是寄存器

 

补充:内存内偏移地址的应用   见一段代码:

.data

var1  BYTE  10h

.code

Mov al , var1

方括号:[   ]:可用符号地址代替数值地址(var1是一个符号地址)

.data

Var1  BYTE  10h,20h,30h

.code

Mov al , [var1+2]      ;=mov al , var1+2 al=30h 

 

2)、交换指令XCHG :

----------------------------见一段指令----------------------

.code

Mov axvar1

Xchg axvar2

Mov var2ax

 

1.2、  堆栈操作指令(移动地址遵循低对低,高对高的原则)

1)、进栈指令:push指令 ESP指定栈顶的偏移地址

ESP逐渐减少(记忆:把堆栈想象成一个倒扣的桶,栈底是高地址,进栈数据增多ESP下移)

Push指令只表达源操作数,目的操作数在栈顶,由ESP确定。

---------------------见一段代码---------------------

;进栈指令

Push eax   ;等同于如下两条指令

Sub esp,4   ;减法指令

Mov [esp],eax  ;传送指令

 

2)出栈指令:pop指令

ESP逐渐增多

源操作数在栈顶由ESP确定,pop指令只表达目的操作数,刚好与push指令相反

----------------------用法见一段指令-----------------

;出栈指令

Pop eax   ;等同于如下两条指令

Mov eax , [esp]   ;传送指令

Add esp , 4       ;加法指令

 

-----------------------综合:见一段堆栈操作程序-----------------------

.data

Ten = 10

Dvar DEORD 67762000h , 12345678h

.data

Mov eax , dvar+4            ;eax=12345678h

Push eax                   ;将eax里的内容压入堆栈

Push DWORD ptr ten         ;将立即数以双字量压入堆栈

Push dvar                  ;将变量的第一个数据压入堆栈

Pop eax                    ;将栈顶数据弹出到eax

Pop dvar+4                 ;栈顶数据弹出到DVAR+4的位置

Mov ebx , dvar+4            ebx=0000000AH

Pop ecx                    ;栈顶数据弹出到ecx

 

应用堆栈的几点注意以及应用

1、 注意:

-------------由于堆栈的栈顶和内容随着程序的执行不断变化,所以编程时应该注意进栈和出栈的数据要成对,要保持堆栈平衡。

 

--------------避免1632为两种传送单位的混用。

2、 应用

-------------堆栈指令、子程序调用指令CALL、子程序反回RET指令、中断调用INT指令、中断返回IRET等指令都会使用堆栈,修改ESP值。

 

-------------用来存放数据,以便随时恢复它们,使用pop指令时明确栈顶的数据。

 

-------------可以以随机的方式读取其中的数据,EBP就是以这个目的而设计(见一段代码)

Mov ebp , esp

Mov eax , [ebp+8]

Mov [ebp] , eax

------------利用堆栈实现主程序与子程序间的传递参数

 

------------还常用于子程序的寄存器保护和恢复,进行快速的现场保护和恢复。

1.3、  其他传送指令

1)、地址传送指令:lEA

-----------------------LEA 的一点重点-----------------------------

-LEAoffset的区别

LEACPU的指令,后面课跟标号、常量和表达式

Offset伪指令,后面只能跟标号和常量

------------见一段代码

Buffer dp 100 dup ( 0 )   ;开辟100个连续字节的的初始化为零的空间

                      ;dp WORDBYTE形式类似

                      ;buffer 类似数组名,指向的是数组的首地址

.code

Lea ebx , buffer             ;(送首地址)

Mov ebx , offset  buffer     (送地址)

Mov ebx , buffer      ;(送第一个数 )

Lea ebx , [buffer+50]       ;(送地51个地址)

Mov enx ,offset [buffer+50]    ;ERROR!buffer+50已经是地址,offset有送地址,乱套了!)

一般来说:注意:

mov reg , offset XXX 比 Lea reg , XX 的指令长度少一个字节,快一个时钟,但lea更灵活

                                                                                                                                     

目录
相关文章
|
网络协议 算法 数据库
计算机网络实验(华为eNSP模拟器)——第十四章 RIP协议和OSPF协议
计算机网络实验(华为eNSP模拟器)——第十四章 RIP协议和OSPF协议
计算机网络实验(华为eNSP模拟器)——第十四章 RIP协议和OSPF协议
|
关系型数据库 分布式数据库 数据库
PolarDB常见问题之加了索引但是查询没有使用如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
Java 测试技术 数据库连接
【MyBatisPlus】MyBatisPlus 整合开发
【1月更文挑战第19天】【MyBatisPlus】MyBatisPlus 整合开发
|
8月前
|
运维 数据挖掘 容器
埋点系统客户案例-金融媒体为何选择ClkLog替换10万年费的SaaS平台?
今天,我们继续为大家带来 ClkLog 用户回访系列,本期采访嘉宾是一家国内知名金融媒体平台的运维负责人——严老师。 这家金融媒体平台专注于全球财经新闻、市场动态和投资分析,提供涵盖股票、债券、外汇、大宗商品等领域的实时市场动态、深度分析、行业报告及专家观点。 他们曾使用业内知名的数据分析系统,但出于成本优化的考虑,开启了一轮新的产品选型。最终,ClkLog成功“打动”了他们,让我们一起来看看其中的关键因素。
281 60
埋点系统客户案例-金融媒体为何选择ClkLog替换10万年费的SaaS平台?
|
安全 项目管理
「技术人生」第9篇:如何设定业务目标
本文将讲述如何设定业务目标的所有步骤和关键信息,很多点没有展开论述,读者可以结合个人实际工作情况进行进一步的深入思考。
1274 95
「技术人生」第9篇:如何设定业务目标
|
数据库连接 PHP Apache
PHP在Apache中如何运行?
PHP在Apache中如何运行?
431 5
《黑神话:悟空》中的物理模拟与碰撞检测技术解析
【8月更文第26天】《黑神话:悟空》是一款备受期待的动作角色扮演游戏,以其精致的画面和丰富的物理效果而闻名。为了实现游戏中的真实感和互动性,开发团队使用了先进的物理引擎和碰撞检测系统。本文将深入探讨《黑神话:悟空》中的物理模拟与碰撞检测技术,并通过一些伪代码示例来展示其实现细节。
583 0
|
监控 搜索推荐 Java
实战:基于Java的实时数据流处理平台
实战:基于Java的实时数据流处理平台
|
缓存 Kubernetes Java
在K8S中,如何排查与解决Pod出现OOM的问题?
在K8S中,如何排查与解决Pod出现OOM的问题?
|
存储 Java Spring
SpringBoot异步任务获取HttpServletRequest
这样的操作对于保持异步操作中的请求上下文十分有用,特别是当你需要在日志记录、权限检查或者其他需要请求信息的场景中。确保上下文的正确传递和管理对于构建可靠的,异步处理能力很强的Spring Boot应用至关重要。
315 0

热门文章

最新文章