前言:

  此文章收录在本人的《学习笔记分享》分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长。附上分类链接:

  https://www.cnblogs.com/tibbors/category/1729804.html

学习内容:堆栈

  • 堆栈的优点:临时存储大量数据,便于查找
  • 堆栈中越往顶部地址编号越小
  • 压栈出栈变的都是栈顶

堆栈的操作分解:

前提操作:
MOV EBX,13FFDC //BASE
MOV EDX,13FFDC //TOP 操作一:压入数据
法一:
MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA //先压入数据
SUB EDX,4 //再上移地址(寄存器) 法二:
SUB EDX,4 //先上移地址(寄存器)
MOV DWORD PTR DS:[EDX],0xBBBBBBBB //再压入数据 法三:
MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD //先压入数据
LEA EDX,DWORD PTR DS:[EDX-4] //再通过LEA指令上移地址(寄存器) 法四:
LEA EDX,DWORD PTR DS:[EDX-4] //先通过LEA指令上移地址(寄存器)
MOV DWORD PTR DS:[EDX],0xEEEEEEEE //再压入数据 操作二:读取某个数据
法一:
//通过[BASE+偏移量]读取
MOV ESI,DWORD PTR DS:[EBX-4] 法二:
//通过[TOP+偏移量]读取
MOV EDI,DWORD PTR DS:[EDX+4] 操作三:弹出数据
法一:
MOV ECX,DWORD PTR DS:[EDX] //先弹出数据(保存到其他存储空间)
LEA EDX,DWORD PTR DS:[EDX+4] //再下移地址(寄存器) 法二:
MOV ESI,DWORD PTR DS:[EDX] //先弹出数据(保存到其他存储空间)
ADD EDX,4 //再下移地址(寄存器) 法三:
LEA EDX,DWORD PTR DS:[EDX+4] //先下移地址(寄存器)
MOV EDI,DWORD PTR DS:[EDX-4] //再弹出(下移前地址)数据(保存到其他存储空间)

堆栈的专用操作:

  • 操作系统默认把ESP当栈底,EBP当栈顶
  • PUSH(压栈) = 操作一
  • POP(出栈) = 操作三






学习内容:标志寄存器(EFLAGS)

  1. 进位标志寄存器CF(Carry Flag)(针对无符号数):

    进位标志CF用于反映无符号数加减运算中最高位是否有进位。

    • 有:1

    • 无:0

    e.g.

    MOV AL,0xEF

    ADD AL,2

    MOV AL,0xFE

    ADD AL,2

  2. 溢出标志寄存器OF(Overflow Flag)(针对有符号数):

    溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

    (如果运算结果超过当前运算位数所能表示的范围,则称为溢出)

    • 溢出:1
    • 未溢出:0
    O位计算过程:
    
    符号位有进位:1;无进位:0
    
    最高有效数值位向符号位有进位:1;无进位:0
    
    对 符号位有无进位 和 最高有效位有无进位 进行异或:所得值即为OF位的值

补充(CF与OF):

在有符号的运算中,有如下的规律:

  • 正 + 正 = 正 如果结果是负数,则说明有溢出

  • 负 + 负 = 负 如果结果是正数,则说明有溢出

  • 正 + 负 永远都不会有溢出

    可根据右图理解无符号数和有符号数不同情况:

    也可根据此图找出以下四种情况:

    无符号、有符号都不溢出 无符号溢出、有符号不溢出
    MOV AL,8 ADD AL,8 MOV AL,FF ADD AL,2
    无符号不溢出、有符号溢出 无符号、有符号都溢出
    MOV AL,7F ADD AL,2 MOV AL,FE ADD AL,80
  1. 符号标志SF(Sign Flag):

    符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

    e.g.

    细心观察S位变化

    MOV EAX,0x0A7F

    ADD EAX,2

    SUB EAX,2

    ADD AL,2

    SUB AL,2

    可以发现:S位只看参与运算的宽度的符号位的值是1还是0
    同样的结果,用EAX将32位全部参与运算时不论怎样,S值都为0,因为最高位为0
    而用AL只运算后八位时,S值被置为1,因为此时参与运算部分的最高位为1
  2. 辅助进位标志AF(Auxiliary Carry Flag):

    在发生下列情况时,辅助进位标志AF的值被置为1,否则被置为0:

    (粗略理解:只要发生除最高位以外的进位或借位就会被置为1)

    ①在字操作时,低字节向高字节进位或借位

    ②在字节操作时,低4位向高4位进位或借位

    e.g.

    MOV EAX,55EEFFFF

    ADD EAX,2

    MOV AX,5EFE

    ADD AX,2

    MOV AL,4E

    ADD AL,2

  3. 奇偶标志PF(Parity Flag):

    奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。

    • 偶数个1:1
    • 奇数个1:0

    e.g.

    MOV EAX,AEF

    ADD EAX,2

    从上图可以看出,虽然0x0B00(即0000 1011 0000 0000)有奇数个1,P位应该为0

    因此,对于P位寄存器,只看最低有效字节(低8位(十六进制的后两位))(不管是多少位寄存器)
  4. 零标志ZF(Zero Flag):

    零标志ZF用来反映运算结果是否为0。

    • 为0:1
    • 不为0

    e.g.

    XOR EAX,EAX     //功能为清零



    注意:

     MOV EAX,0和XOR EAX,EAX虽然结果一样,但是意义不一样,因为MOV不是运算符,而XOR是,因此若用MOV,EFLAGS寄存器就不会有变化

  5. 方向标志DF(Direction Flag):

    方向标志DF用来决定 ① 执行MOVS指令时[ESI]和[EDI]中存储的地址 ② 执行STOS指令时的 加/减

    • 为0:加
    • 为1:减

学习笔记分享之汇编---3. 堆栈&标志寄存器的更多相关文章

  1. 大学四年的Python学习笔记分享之一,内容整理的比较多与仔细

    翻到以前在大学坚持记录的Python学习笔记,花了一天的时间整理出来,整理时不经回忆起大学的时光,一眨眼几年就过去了,现在还在上学的你们,一定要珍惜现在,有个充实的校园生活.希望这次的分享对于你们有学 ...

  2. 学 Win32 汇编[20]: 洞察标志寄存器

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向 ...

  3. JavaScript学习笔记之 数组方法一 堆栈 和队列

    数组的方法 以及 堆栈的操作的方法 JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型.在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操 ...

  4. ARM学习笔记9——ARM汇编汇编语言中的伪指令

    ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令.ARM伪指令包含ADR.ADRL.MOV32和LDR.一.ADR伪指令 1.作用 ADR是小范围地址读取伪指令,基于P ...

  5. 字节跳动内部微服务架构-Docker实战学习笔记分享 真香

    前言 基于 Spring Cloud 的微服务设计和开发,已经越来越多地得到了更多企业的推广和应用,而 Spring Cloud 社区也在不断的迅速发展壮大之中,近几年时间,Spring Cloud ...

  6. MVC学习笔记(分享)

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  7. JavaScript01天学习笔记分享

    01知识点 JavaScript 代码运行在浏览器(后缀名.js) 和java完全不同的东西,只是名称类型而已 src 引用脚本   <Script></Script> ale ...

  8. JavaScript构造函数学习笔记分享

    构造函数就是一个普通的函数,创建方式和普通函数没有区别 不同的是构造函数名习惯上首字母大写 普通函数是直接调用,而构造函数需要使用new关键字来调用 构造函数的执行流程: 立刻创建一个新的对象 将新建 ...

  9. JavaScript数组的方法 | 学习笔记分享

    数组 数组的四个常用方法 push() 该方法可以向数组的末尾添加一个或多个元素,并返回数组的新长度 可以将要添加的元素作为方法的参数传递,这些元素将会自动添加到数组的末尾 pop() 该方法可以删除 ...

随机推荐

  1. Rust入坑指南:齐头并进(下)

    前文中我们聊了Rust如何管理线程以及如何利用Rust中的锁进行编程.今天我们继续学习并发编程, 原子类型 许多编程语言都会提供原子类型,Rust也不例外,在前文中我们聊了Rust中锁的使用,有了锁, ...

  2. springboot集成axis1.4

    1.首先通过axis工具根据wsdl文件生成java代码和wsdd文件 set Axis_Lib=/Users/apple/configuration/axis-1_4/lib //lib文件目录se ...

  3. 记录一次云主机部署openstack的血泪史

    看见这个部署成功的留下了激动的泪水 经过长时间的BUG苦肝终于成功部署成功  部署的环境2vCPU 8GB 阿里云主机,部署成功以后内存占用确实蛮高的 记录这一次踩坑,给后来者避免踩坑时间,个人踩坑踩 ...

  4. 数据库-第三章 关系数据库标准语言SQL-3.3 数据查询

    数据查询 例: 一.单表查询 1.定义 是指仅涉及一个表的查询 2.选择表中的若干列 查询指定列 例: 查询全部列 例: 查询经过计算的值 例: 3.选择表中的若干元组 消除取值重复的行 例: 查询满 ...

  5. 启动/关闭oracle服务

    写一个脚本就可以很方便的打开服务和关闭服务,但是记住要以管理员的身份运行哦! 首先建立两个文件:启动.txt 和关闭.txt [在下面代码里启动的服务名称可能版本不一样,有可能名字不一样,自己对照看看 ...

  6. python浅学【网络服务中间件】之MongoDB

    一.关于MongoDB: MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...

  7. Android课程设计——博学谷1.0

    本文讲述了如何应用大三下学期智能移动终端开发技术课程所学知识,完成包含服务器端.客户端程序的应用——博学谷登录模块的开发,结合java语言基本知识,例如:字符串.列表.类.数据库读写等,设计.实现一个 ...

  8. 【i春秋综合渗透测试】《我很简单,请不要欺负我》

      第2题:获取目标网站管理员的密码 扫到了后台(/admin),本来想用sqlmap跑一下,但是随便试了个弱口令(admin888)就进去了...   第3题: getshell 配置插马:登录后台 ...

  9. VirtualBox 版本 6.1.2 r135662, ubuntu18 配置共享文件夹、openssh-server

    续上章安装完ubuntu18. 输入账号密码,登录成功. 但是使用ssh工具,却登录失败. 1.安装openssh-server sudo apt install openssh-server 2.检 ...

  10. Building Applications with Force.com and VisualForce (DEV401)(五):Application Essential: Introducing Business Logic

    Dev 401-005 Application Essential: Introducing Business Logic Module Agenda1.Custom object Queues2.W ...