王道408计组汇编语言部分学习总结

2023-09-16 18:09:46

x86汇编语言指令基础

x86处理器中程序计数器PC 通常被称为IP 

高级语言—>汇编语言—>机器语言

x86架构CPU,有哪些寄存器

EAX通用寄存器
EBX
ECX
EDX
ESI

变址寄存器

变址寄存器可用于线性表、字符串的处理
EDI
EBP堆栈基指针堆栈寄存器用于实现函数调用
 
ESP堆栈顶指针
mov eax, ebx       
#寄存器—>寄存器

mov eax, dword ptr [af996h]       
#主存→寄存器

mov eax, 5     
#立即数—>寄存器

moveax, dword ptr[ebx]     
#将ebx所指主存地址的32bit复制到eax寄存器中

mov dword ptr [ebx], eax   
#将 eax的内容复制到ebx所指主存地址的32bit

mov eax, byte ptr [ebx]   
#将ebx所指的主存地址的8bit复制到eax

mov eax, [ebx]   
#若未指明主存读写长度,默认32 bit

mov [af996h], eax   
#将eax的内容复制到af996h所指的地址(未指明长度默认32bit)

mov eax, dword ptr [ebx+8] 
#将ebx+8所指主存地址的32bit复制到eax寄存器中

 常用的x86汇编指令

1. 常见的算数运算指令

addadd d,s#计算d+s,结果存入d
subtractsub d,s#计算d-s,结果存入d
multiplymul d,s#无符号数d*s,乘积存入d
imul d,s#有符号数d*s,乘积存入d
dividediv s#无符号数除法edx:eax/s,商存入eax,余数存入edx(被除数已经放到edx:eax中)
idiv s#有符号数除法edx:eax/s,商存入eax,余数存入edx
取负数negativeneg d#将d取负数,结果存入d
自增++increaseinc d#将d++,结果存入d .
自减--decreasedec d#将d--,结果存入d

d:destination,目的地(如:寄存器或内存)

s:source,来源地(寄存器,主存,常量)

目的操作数d不可以是常量(因为是把s的东西放到d里)

举例:

add <reg>, <reg> / sub Kreg>, <reg>
add <reg>, <mem> / sub <reg>, <mem>
add <mem>, <reg> / sub <mem>, <reg>
add <reg>, <con> / sub <reg>, <con>
add <mem>, <con> / sub <mem>, <con>


<reg> 的意思是:|寄存器|register
<mem> 的意思是:|内存|memory
<con> 的意思是:|常数|constant


sub eax, 10 #eax←eax-10
add byte ptr [var], 10 #10与var值指示的内存地址的一-字节值相加,并将结果
保存在var值指示的内存地址的字节中

2. 常见的逻辑运算指令 

andand d,s#将d、s逐位相与,结果放回d
oror d,s#将d、s逐位相或,结果放回d
notnot d#将d逐位取反,结果放回d
异或exclusive orxor d,s#将d、s逐位异或,结果放回d
左移shift leftshI d,s#将d逻辑左移s位,结果放回d (通常s是常量)
右移shift rightshr d,s#将d逻辑右移s位,结果放回d (通常s是常量)

3. 其他指令

用于实现分支结构、循环结构的指令: cmp、 test、 jmp、 jxxx
用于实现函数调用的指令: push、pop、call、 ret
用于实现数据转移的指令: mov

3.1 无条件转移指令jmp

jmp <地址>
#PC无条件转移至<地址>
jmp 128
#<地址>可以用常数给出
jmp eax
#<地址>可以来自于寄存器
jmp [999]
#<地址>可以来自于主存
jmp NEXT
mov ecx,ebx
NEXT:
mov ecx,eax
#<地址>可以用“标号”锚定

3.2 条件转移指令j***

je <地址>
#jump when equal, 若a==b则跳转
jne <地址>
#jump when not equal, 若a !=b则跳转
jg <地址>
#jump when greater than, 若a>b则跳转
jge <地址>
#jump when greater than or equal to,若a>=b则跳转
jl <地址>
#jump when less than, 若a<b则跳转
jle <地址>
#jump when less than or equal to, 若a<=b则跳转
cmp eax,ebx #比较寄存器eax和ebx里的值
jg NEXT     #若eax > ebx,则跳转到 NEXT:

3.3 函数调用指令

函数调用指令: call<函数名> 
函数返回指令: ret

call指令的作用:
①将IP旧值压栈保存(保存在函数的栈帧顶部)
②设置IP新值,无条件转移至被调用函数的第一条指令
ret指令的作用:
从函数的栈帧项部找到IPI旧值,将其出栈并恢复IP寄存器

 

push eax #将寄存器eax的值压栈
push 985 #将立即数985压栈
push [ebp+8] #将主存地址[ebp+8]里的数据压栈

pop eax #栈项元素出栈,写入寄存器eax
pop [ebp+8] #栈项元素出栈,写入主存地址:[ebp+8]

push. pop指令实现入栈、出栈操作,x86 默认以4字节为单位。指令格式如下:
Push A  //先让esp减4,再将A压入
Pop B  //栈项元素出栈写入B,再让esp加4
注1:A可以是立即数、寄存器、主存地址:
注2:B可以是寄存器、 主存地址
 

更多推荐

ELK部署

一,elk提供了一个分布式多用户能力的全文搜索分析引擎,能对各种类型的数据进行近实时的索引和查询,支持高可用和水平扩展性。作用:1.将日志进行集中化管理2.将日志格式化_(ogstash)并输出到Elasticsearch3.对格式化后的数据进行索引和存储(Elasticsearch)4.前端数据的展示(Kibana)

使用自定义XML配置文件在.NET桌面程序中保存设置

本文将详细介绍如何在.NET桌面程序中使用自定义的XML配置文件来保存和读取设置。除了XML之外,我们还将探讨其他常见的配置文件格式,如JSON、INI和YAML,以及它们的优缺点和相关的NuGet类库。最后,我们将重点介绍我们为何选择XML作为配置文件格式,并展示一个实用的示例。1.背景在.NET桌面程序中,通常使用

Quartz.NET,强大的开源作业调度框架

Quartz.NET是一个强大的开源作业调度框架,专为C#和.NET开发而设计。它允许开发人员在应用程序中调度、执行和管理各种类型的作业,例如定时任务、后台作业、周期性作业等。Quartz.NET具有高度可配置性和灵活性,可以满足各种复杂的调度需求。**作用:**Quartz.NET的作用在于简化作业调度的实现并提供可

高防CDN如何保护电商平台的在线支付系统安全

高防CDN如何保护电商平台的在线支付系统安全?随着移动互联网的快速发展,越来越多的用户选择在手机上进行购物和支付。这种形式的便利性和灵活性推动了电商平台的发展,但同时也给电商平台的安全带来了新的挑战。尤其是在线支付系统,由于其涉及用户的金融信息,成为黑客攻击的重点目标。为了保护电商平台的在线支付系统安全,选择合适的高防

案例实践丨基于SkyWalking全链路监控的微服务系统性能调优实践篇

1背景随着开源社区和云计算的快速推进,云原生微服务作为新型应用系统的核心架构,得到了越来越广泛的应用。根据Gartner对微服务的定义:“微服务是范围狭窄、封装紧密、松散耦合、可独立部署且可独立伸缩的应用程序组件。”微服务之父,马丁.福勒,对微服务概述如下:就目前而言,对于微服务业界并没有一个统一的、标准的定义。但通常

Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

Unity开发人员的城堡游戏引擎概述一、简介2.Unity相当于什么GameObject?3.如何设计一个由多种资产、生物等组成的关卡?4.在哪里放置特定角色的代码(例如生物、物品)?Unity中“向GameObject添加MonoBehaviour”相当于什么?5.Unity子目录相当于什么Assets?6.支持哪些

git基本使用

一、Git简介Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCase等版本控制工具。1.版本控制的三个阶段版本控制

深度解析Java虚拟机(JVM)的垃圾回收机制

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

浅谈大数据背景下用户侧用电数据在电力系统的应用与发展分析

安科瑞华楠摘要:随着能源互联网、互联网+、新型传感技术的持续推进,电力用户侧用电数据呈现指数级剧增、异构性增强的情况,逐渐构成了用户侧用电行为大数据。然而目前对电力领域的数据价值挖掘于电网内部和电源端,用户侧庞大且蕴含丰富价值的电力数据而未能得到很好利用。文章主要是在用户侧用电行为大数据的基础上,对用户侧电力数据价值在

机器学习(16)---聚类(KMeans)

聚类一、聚类概述1.1无监督学习与聚类算法1.2sklearn中的聚类算法二、KMeans2.1基本原理2.2簇内误差平方和三、sklearn中的KMeans3.1所用模块3.2聚类算法的模型评估指标3.3轮廓系数3.4CHI(卡林斯基-哈拉巴斯指数)四、KMeans做矢量量化4.1概述4.2案例一、聚类概述1.1无监

负载均衡算法介绍及应用连接池负载不均问题分析

在分布式系统架构下,为了满足高并发和高扩展性的要求,负载均衡设备得以广泛的使用。结合应用连接池的配置,在实际使用过程中可能会出现负载不均的问题。本文简单介绍了负载均衡算法、Druid连接池配置以及连接池负载不均的问题分析及优化方法。1、负载均衡基本概念1.1负载均衡介绍在分布式架构下随着逻辑业务的快速发展,系统架构也随

热文推荐