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

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所指主存地址的32bitmov eax, byte ptr [ebx]   
#将ebx所指的主存地址的8bit复制到eaxmov eax, [ebx]   
#若未指明主存读写长度,默认32 bitmov [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.hqwc.cn/news/116334.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC MySQL任意文件读取分析

JDBC MySQL任意文件读取分析 文章首发于知识星球-赛博回忆录。给主管打个广告&#xff0c;嘿嘿。 在渗透测试中&#xff0c;有些发起mysql测试流程(或者说mysql探针)的地方&#xff0c;可能会存在漏洞。在连接测试的时候通过添加allowLoadLocalInfileInPath,allowLoadLocalInf…

Steam VR Plugin 2.7.3爬坑指南

因为项目有VR串流的需要&#xff0c;于是就用起了PicoSteam VR串流&#xff0c;真是一把心酸泪&#xff0c;坑还真不少。有些解决了&#xff0c;有些没有&#xff0c;等待后续更新或者有好心人指点一下啊&#xff0c;进入正题。 &#xff08;1&#xff09;导入插件之后&#xf…

2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)

10. 灾后重建 Pear市一共有N&#xff08;<50000&#xff09;个居民点&#xff0c;居民点之间有M&#xff08;<200000&#xff09;条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近&#xff0c;一次严重的地震毁坏了全部M条道路。 震后…

92 # express 中的中间件的实现

上一节实现 express 的优化处理&#xff0c;这一节来实现 express 的中间件 中间件的特点&#xff1a; 可以决定是否向下执行可以拓展属性和方法可以权限校验中间件的放置顺序在路由之前 中间件基于路由&#xff0c;只针对路径拦截&#xff0c;下面是中间件的匹配规则&#…

Spring Cloud Alibaba快速整合OpenFeign

文章目录 spring cloud alibaba 整合OpenFeign整合流程1.导入依赖2. 编写调用接口2.1 service&#xff08;这里写的是clients&#xff09;2.2 controller 3.设置其最大链接时间3.1 配置文件3.2 client3.3 接口3.4 被访问的controller spring cloud alibaba 整合OpenFeign Fore…

MySQL8.0版安装教程 + Workbench可视化配置教程(史上最细、一步一图解)

文章目录 一、安装MySQL1、选择版本&#xff0c;点击“Download”进行下载2、双击下载好的安装包&#xff0c;点击运行3、选择安装类型为“Custom”4、依次进行选择&#xff0c;选到MySQL Servers 8.0.33 -X64&#xff0c;点击向右的箭头5、选中MySQL Servers 8.0.33 -X64&…

Docker搭建DNS服务器--nouse

前言 DNS服务器是(Domain Name System或者Domain Name Service)域名系统或者域名服务,域名系统为Internet上的主机分配域名地址和IP地址。 安装 2.1 实验环境 IP 系统版本 角色 192.168.40.121 Ubuntu 22.10 DNS服务器 192.168.40.122 Ubuntu 22.10 测试机器 2.2 …

day03_基础语法

今日内容 零、复习昨日 一、Idea安装&#xff0c;配置 二、Idea使用 三、输出语句 四、变量 五、数据类型 附录: 单词 零、 复习昨日 1 装软件(typora,思维导图) 2 gpt(学会让他帮你解决问题) 3 java发展(常识) 4 HelloWorld程序 5 编码规范 6 安装jdk,配置环境变量 电脑常识 任…

Django的设计模式及模板层

Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller&#xff0c;用于处理请求、获取数据、返回结果(重要) 作…

PHP8的类与对象的基本操作之成员变量-PHP8知识详解

成员变量是指在类中定义的变量。在类中可以声明多个变量&#xff0c;所以对象中可以存在多个成员变量&#xff0c;每个变量将存储不同的对象属性信息。 例如以下定义&#xff1a; public class Goods { 关键字 $name; //类的成员变量 }成员属性必须使用关键词进行修饰&#xf…

stm32之ADC

ADC是什么&#xff1f;模拟数字转换器&#xff08;Analog-to-Digital Converter&#xff09;。 一、ADC概述 stm32f013c8t6有两个ADC&#xff0c;精度为 12 位&#xff0c;每个 ADC 最多有 16 个外部通道、2个内部通道&#xff08;温度传感器、内部参考电压&#xff09;。实际s…

【Cpp】位图Bitmap

code #include <iostream> #include <vector> #include <stdio.h> #include <stdint.h>class Bitmap { private:std::vector<uint8_t> data; // 存储位图数据的字节数组uint32_t size; // 位图的大小&#xff08;以位为单位&#x…