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

news2024/11/25 6:42:41

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可以是寄存器、 主存地址
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LESS的叶绿素荧光模拟实现与操作

LESS的叶绿素荧光模拟实现与操作 前情提要FLUSPECT模型荧光的三维面元冠层辐射传输过程日光诱导叶绿素荧光模拟 前情提要 本文默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有…

2023华为杯研究生数学建模研赛E题出血脑卒中完整论文(含28个详细预处理数据及结果表格)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了全国研究生数学建模竞赛&#xff08;数模研赛&#xff09;E题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。…

高级运维学习(十)系统安全

kali 实际上它就是一个预安装了很多安全工具的Debian Linux [rootmyhost ~]# kali reset kali reset OK. 该虚拟机系统用户名为:kali,密码为:kali 基础配置 $ ip a s # 查看网络IP地址&#xff0c;本例中查看到的是192.168.88.40 $ sudo systemctl start ssh # 启s…

java面试题-并发编程基础

1.线程的基础知识 1.1 线程和进程的区别&#xff1f; 难易程度&#xff1a;☆☆ 出现频率&#xff1a;☆☆☆ 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在指令运行过程中还需要…

驱动开发,基于gpio子系统编写LED灯的驱动,亮灭控制

1.gpio子系统介绍 一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动&#xff0c;我们当前只需要调用对应的厂商驱动即可完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多&#xff0c;这里linux内核对厂商驱动做了一些封装&#xff0c;提供了一系列的…

中秋国庆内卷之我爱学习C++

文章目录 前言Ⅰ. 内联函数0x00 内联函数和宏的比较0x01 内联函数的概念0x02 内联函数的特性 Ⅱ. auto&#xff08;C 11)0x00 auto的概念0x01 auto的用途 Ⅲ. 范围for循环(C11)0x00 基本用法0x01 范围for循环(C11)的使用条件 Ⅳ. 指针空值nullptr(C11)0x00 概念 前言 亲爱的夏…

leetcode Top100(17)矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

C++ -- 类型转换

目录 C语言中的类型转换 为什么C需要四种类型转换 C 类型转换 static_cast reinterpret_cast const_cast 添加关键字 volatile dynamic_cast 补充 RTTI 总结 C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型…

如何搜索浏览器添加印象笔记中搜藏的结果

在印象笔记记录的东西多了&#xff0c;就放在哪里不动&#xff0c;失去记录的意义了 1、如何将浏览器中添加印象笔记一块的搜索结果 2、需要两个步骤 第一&#xff1a;将浏览器中添加印象笔记的插件 第二&#xff1a;将印象笔记中的搜索方法勾上&#xff0c;如下 结果如下&…

【从0学习Solidity】41. WETH

【从0学习Solidity】41. WETH 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开发…

反射详细说明

反射概述 反射是指对于任何一个Class类&#xff0c;在"运行的时候"都可以直接得到这个类全部成分。 在运行时,可以直接得到这个类的构造器对象&#xff1a;Constructor。 在运行时,可以直接得到这个类的成员变量对象&#xff1a;Field。 在运行时,可以直接得到这…

【从0学习Solidity】 40. ERC1155

【从0学习Solidity】40. ERC1155 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开…

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)

7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素&#xff1a; 缺少的成分&#xff1a;数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中&#xff0c;ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…

Spring后处理器-BeanPostProcessor

Spring后处理器-BeanPostProcessor Bean被实例化后&#xff0c;到最终缓存到名为singletonObjects单例池之前&#xff0c;中间会经过bean的初始化过程&#xff08;&#xff08;该后处理器的执行时机&#xff09;&#xff09;&#xff0c;例如&#xff1a;属性的填充、初始化方…

第 364 场 LeetCode 周赛题解

A 最大二进制奇数 降序排序字符串&#xff0c;然后将最后一个 1 与最后一位交换 class Solution { public:string maximumOddBinaryNumber(string s) {sort(s.begin(), s.end(), greater<>());for (int i s.size() - 1;; i--)if (s[i] 1) {swap(s[i], s.back());break;…

【Oracle】Oracle系列之八--SQL查询

文章目录 往期回顾前言1. 基本查询&#xff08;1&#xff09;All&#xff08;2&#xff09;in/exists 子查询&#xff08;3&#xff09;union/except/intersect&#xff08;4&#xff09;group by&#xff08;5&#xff09;having&#xff08;6&#xff09;聚集函数&#xff1a…

SLAM从入门到精通(用c++实现机器人运动控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前的一篇文章&#xff0c;我们知道了可以通过wpr_simulation包仿真出机器人和现场环境。如果需要控制机器人&#xff0c;这个时候就需要rqt_robo…

AcWing 5153. 删除(AcWing杯 - 周赛)(结论+枚举)

思路&#xff1a; ACcode: #include<bits/stdc.h> using namespace std; #define int long long string s; void solve() {cin>>s;s"00"s;int lens.size();for(int i0; i<len; i) {for(int ji1; j<len; j) {for(int kj1; k<len; k) {int xs[i]*…

leetcode:2446. 判断两个事件是否存在冲突(python3解法)

难度&#xff1a;简单 给你两个字符串数组 event1 和 event2 &#xff0c;表示发生在同一天的两个闭区间时间段事件&#xff0c;其中&#xff1a; event1 [startTime1, endTime1] 且event2 [startTime2, endTime2] 事件的时间为有效的 24 小时制且按 HH:MM 格式给出。 当两个…

Windows 基于Visual Studio 开发Qt 6 连接MySQL 8

前提条件&#xff1a; 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 3、MySQL 8 Qt 6 配置MySQL 8 动态/静态连接库和MySQL 8 驱动。 libmysql.dll 和libmysql.lib是QT所需的动态和静态链接库&#xff1b;qsqlmysql.dll 和qsqlmysql.dll.debug是Qt所需的mysql驱…