哨兵值

  • 数据结构与算法随笔之------哨兵变量(编程思想与技巧)
  • 编程技巧1_哨兵值(sentinel)
  • 为什么“哨兵值”没有解决错误处理问题

while 循环中的变量 i 控制着最终的循环次数。这是非常流行的一个表示法,具有这个作用的变量有时也称为哨兵变量(Sentinel variable)。

两个元素的遍历比较过程中,可能会出现一个数组提前遍历结束的情况,为了避免这样的情况,我们可以引入哨兵值,该值是一个比较关系中的最大值或者最小值

  • 这个哨兵值会被我们放在数组的最后一个元素,含有哨兵值的数组会比原数组多一个元素。
  • 这样的好处在于,遍历比较过程永远也不会出现提前结束的现象。

sentinel ,就是用来指定一个位置的特殊元素.
比如快速排序里面,需要选一个变量作为中间值,这个值就是一个 sentinel,又比如用来指示一个队列尾部位置的变量

用处:合理的使用哨兵可以简化对边界条件的处理。

在数组的最后一个元素放入“哨兵”值(通常是0、-1或者NULL),这样代码不需要数组大小也可以确定数组的长度:
int array[] = {1, 2, 3, -1};

c++中怎么定义第一个元素为哨兵的整型数组?

void insertSort(int inputArray[] , const int arrayLength)
{  int i,j;  int tempArray[arrayLength+1];  //inputArray重新复制到tempArray里面  for (i = 0; i < arrayLength; ++i)  {  tempArray[i+1]=inputArray[i];  }  tempArray[0]=INT_MIN;  //下面开始对带有哨兵的 tempArray进行排序  for (i = 1; i <= arrayLength; ++i)  {  int temp = inputArray[i];  for (j = i; temp < tempArray[j-1] ; --j)  {  tempArray[j]=tempArray[j-1];  }  tempArray[j]=temp;  }  for (i = 0;i<arrayLength; ++i)  {  inputArray[i]=tempArray[i+1];  }
}

INT_MIN

转载

INT_MIN在标准头文件limits.h中定义。

#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)

在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。

C中int类型是32位的,范围是-2147483648到2147483647 。

  1. 最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN;
  2. 最严重的上溢是INT_MAX + INT_MAX :结果是-2;
  3. 最轻微的下溢是INT_MIN - 1:结果是是INT_MAX;
  4. 最严重的下溢是INT_MIN + INT_MIN:结果是0 。

突然得知的无聊知识

  • %eax这个寄存器的e代表什么?全称是什么?x代表什么,全称是什么?
  • 最早的x86的累加寄存器叫ax, 高位為ah, 低位為al, 拼在一起叫ax. IA-32時代以后叫eax, 擴展(extend)為32位, 這個e就是extend, a是accumulate, x其實是h加l的意思

一个疑问:为什么要使用“movl$1,%eax”而不是“movb$1,%eax”

二进制炸弹实验

  1. 参考:2018
  2. 详细参考
  3. 【CSAPP】二进制炸弹 实验分析
  4. zucc–二进制炸弹第1,2,3,4,5,6,secret_phase关卡(binarybomb)
  5. 二进制炸弹实验
  6. CS:APP二进制炸弹开篇
  7. 添加链接描述

GDB使用

参考链接

C语言中内存对齐问题

  • C语言中内存对齐问题
  • 结构体的总大小,必须要是其内部最大成员的整数倍,不足的要补齐。
  • 内存对齐规则

函数调用前的典型汇编码如下:

push    %eax
call    0x401394 <test__Fc>
add     $0x10,%esp

首先,入栈的是实参的地址。由于被调函数都是对地址进行操作,所以就能够理解值传递的原理和参数是引用时的情况了。

Call ***: 调用函数。后面的地址,就是函数的入口地址。

Call指令等价于
PUSH IP
JMP ***

首先把当前的执行地址IP压栈,然后跳转到函数执行。
执行完后,被调函数要返回,就要执行RET指令。RET等价于POP IP,恢复CALL之前的执行地址。所以一旦使用CALL指令,堆栈指针SP就会自动减2,因为IP的值进栈了。

函数的参数进栈的顺序是从右到左,这是C与其它语言如pascal的不同之处。
函数调用都以以下语句开始

push    %ebp
mov     %esp,%ebp

首先保存BP的值,然后将当前的堆栈指针传递给BP。那么现在BP+2就是IP的值(16位register的情况),BP+4放第一个参数的值,BP+6放第二个参数……。函数在结束前,要执行POP BP。


xor eax,eax
异或运算,操作数两数相反为1;两数相同为0。由于这两个数相同,异或后等于清0,要比mov eax,0效率高

C++右值引用及使用

C++右值引用及使用

  push ebp ;保存当前ebpmov ebp,esp ;EBP设为当前堆栈指针sub esp, xxx ;预留xxx字节给函数临时变量.
  • 这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作mov esp,ebp/pop ebp/ret 即可.

  • ESP专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。

  • EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元
  • ESI、EDI、ESP、EBP:為si,di,sp,bp的延伸,32位元
  • eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。


增加了一个eax寄存器参与运算,从不优化的指令

addl   $0x1,-0x4(%ebp)

变成了现在的

 add    $0x1,%eax mov    %eax,-0x4(%ebp)  mov    %eax,-0x8(%ebp)

寄存器的工作处理数据比用存储器快,先用寄存器自加再将结果写入存储器。


[祭祖作业一]二进制炸弹破解笔记2相关推荐

  1. 作业_二进制炸弹_手把手教学讲解

    简单的前言 最近的作业有个二进制炸弹问题,具体点说就是使用汇编语言完成一些小问题,形式比较有趣,一起看看吧. 题目描述 实验目的 通过对一个二进制可执行程序(称为"二进制炸弹")的 ...

  2. 计算机系统实验:二进制炸弹+缓冲区炸弹 (自我学习笔记)

    本来没想写个博客,结果得知还要验收,发现自己全忘了,那就趁着复习的功夫再捋一遍吧>-< 一.使用工具:IDA-pro 简单使用方式: 1.打开IDA,open需要反汇编的exe. 选则wi ...

  3. CSAPP实验二:二进制炸弹(Bomb Lab)

    本系列文章为中国科学技术大学计算机专业学科基础课<计算机系统>布置的实验,上课所用教材和内容为黑书CSAPP,当时花费很大精力和弯路,现来总结下各个实验,本文章为第二个实验--二进制炸弹( ...

  4. 二进制安全学习笔记(2)

    2022-3-9 二进制安全学习笔记(2) 二进制安全入门题目下载链接为:https://github.com/LiveOverflow/liveoverflow_youtube 使用的工具为rada ...

  5. CS:APP二进制炸弹phase2

    写在前面 在前文<CS:APP二进制炸弹phase1>中成功"破解"了phase_1,毕竟是第一个阶段,非常简单.本篇来破解第二阶段.let's go!!! 分析 反汇 ...

  6. 哈工大 计算机系统 二进制炸弹实验报告

    实验报告 实 验(三) 题     目 Binary Bomb 二进制炸弹 专       业 计算机学院 学    号 班    级 学       生 指 导 教 师 实 验 地 点 实 验 日 ...

  7. Binary Bomb 二进制炸弹

    实验报告 实 验(三) 题     目 Binary Bomb 二进制炸弹 计算机科学与技术学院 目  录 第1章 实验基本信息... - 3 - 1.1 实验目的... - 3 - 1.2 实验环境 ...

  8. CSAPP实验——逆向工程拆除“二进制炸弹”程序

    计算机系统基础的实验课,引用了国外的实验,非常好 文章目录 一.实验目的: 二.实验要求 三.实验内容(所修改函数代码,功能以及重要代码的解释): 1.phase_1 2.phase_2 3.phas ...

  9. 计算机系统二进制炸弹实验报告,二进制拿炸弹实验报告完整版.doc

    课程名称:计算机系统原理实验 实验课时:32课时 实验项目名称:BombLab二进制炸弹 实验材料:可执行文件bomb.源代码bomb.c.说明README 实验环境:Linux操作系统(安装虚拟机和 ...

最新文章

  1. 禁止服务器的协议,Windows 服务器禁用 SSL 2 和 SSL 3 协议
  2. Apache的详细安装教程和遇到的问题解决方案
  3. JavaWeb学习笔记——JSTL核心标签库
  4. 《STL源码剖析》学习--6章--power算法分析
  5. gitlab mysql启动不了_gitlab不支持mysql,这就是我学习PostgreSQL的原因
  6. linux下用u盘安装xp系统安装教程,全新Linux笔记本电脑用U盘装Win7/XP系统教程
  7. s905各种型号的区别_梯式桥架和槽式桥架的区别介绍
  8. linux 创建用户和修改新增用户默认的家目录
  9. 解析网上的XML文件
  10. javaweb基础 02--javaweb基础概念
  11. 在VMware中的Ubuntu虚拟机安装open-vm-tools调整屏幕可以复制粘贴
  12. 利用大数据构建智能交通
  13. 实操教程 | 深度学习pytorch训练代码模板(个人习惯)
  14. Git 可视化管理工具 - Sourcetree 使用指南
  15. ubuntu下vscode字体高与缩进不成比
  16. 如何制作一个高转化的广告落地页(文末有福利)
  17. Android面试整理
  18. react 项目框架的搭建(一)
  19. 题目:中国有句俗话叫“三天打渔,两天晒网”,某人从2010年1月1日期开始“三天打渔,两天晒网” 问这个人在以后的某一天是“打渔”还是“晒网”。用C或着C++语言实现程序解决问题。
  20. 黑马程序员UI设计学院公开课,10月18日开讲啦!

热门文章

  1. 2022年R1快开门式压力容器操作考试总结及R1快开门式压力容器操作操作证考试
  2. 基于javaweb的物资配送管理系统_基于JavaWeb的网上鲜花销售与分析系统任务书
  3. 基于有限状态机在Unity3D中实现的简单搓招系统
  4. python初中必背语法_初中英语语法知识点总结 中考必背重点知识归纳
  5. Selection用法
  6. matlab wchar_t,C++中wchar_t与wstring理解及中文编码的处理
  7. hdoj--2030汉字统计
  8. kali息屏时间设置
  9. 关于Surface Pro 6 SD卡频繁掉卡问题解决方法
  10. Google Earth Engine(GEE)——下载矢量数据过程中出现Property joinedWaterFeature has type Feature错误