jmp

汇编语言中短转移指令jmp short指令偏移地址计算

巧了我就是萌 提交于 2020-10-03 13:49:11
汇编语言中,jmp short指令是8位转移指令,可以修改ip寄存器的范围为-128~127 (8位补码的表示范围,因为偏移地址计算使用的是补码) 短转移指令的机器码格式为EB??,其中??表示8位偏移地址,接下来研究??的计算方法。 一、公式介绍 要计算jmp short的偏移地址,我们要记住公式: 偏移地址=标记处的偏移地址-CPU读完该jmp指令后的ip寄存器值 二、方法步骤 1.后跳转 我们引入MASM中的代码片段 DATAS SEGMENT DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX jmp short s mov ax,1000H mov ax,1000H mov ax,1000H s:mov bx,ax MOV AH,4CH INT 21H CODES ENDS END START s位于jmp指令的后面。 编译后进行debug,使用u指令查看汇编指令,如下图: 可以看到标记s处的偏移地址为0010H,CPU读取完jmp指令后ip指向了0007H,找到了这两个关键数据后套用公式:偏移地址=标记地址-ip地址,即0010H-0007H。 在计算机中,减法运算是转换成加法进行,即-x转化成+(x)补,需要将减号后面的数字转换成补码:

汇编语言(王爽 第三版)检测点

╄→尐↘猪︶ㄣ 提交于 2020-09-27 13:06:39
这本书购于2015.11.30,我大概从2016.3月开始读,历时大概三个月,我们学校开《微机原理与汇编语言》这门课,不过让人感觉很不爽,课本一开始就丢给你一堆东西,意欲让你记住这一大堆东西,然后开始编程,我对编程语言的学习方面要求比较高,所以开始读这本王爽老师写的汇编语言,目前为止,这本书给我的感觉就是,你能学到很多底层的东西,尤其是像键盘的读写原理,屏幕的显示,特别是对内存的操作和管理,不像课本上给你一个中断让你就能显示字符之类的,它会一步一步教你怎么把要显示的东西写到显存里面,这本书显得比较浅显易懂,让人感觉不错,特别是读了这本书再去看那些难度较高的汇编代码及微机原理,效率会高很多,下面是我读这本书的过程中对书中检测点的解答,仅代表个人观点。 第一章 检测点1. 1 1 ) 13   (8kb = 8 * 1024 = 2 ^ 13)   2 ) 1024 0 1023 3 ) 8 * 1024 1024   ( 1 byte = 8 bit,计算机以byte为存储单位) 4 ) 1024 ^ 3 1024 ^ 2 1024 5 ) 2 ^ 6 1 2 ^ 4 2 ^ 2   (kb = 2 ^ 10 Mb = 2 ^ 20 Gb = 2 ^ 30) 6 ) 1 1 2 2 4 7 ) 512 256   (8086的寄存器为16位寄存器,一次可以读取两个字节

22年前雷军写的代码,你见过吗?

隐身守侯 提交于 2020-08-17 07:00:44
作为小米科技的创始人、董事长和首席执行官,雷军的名字如雷贯耳。网上出现一篇“刘强东的代码水平如何”的文章,有网友在下面回复“代码只服雷军”。雷军的代码水平真的很牛吗? 原来雷军年轻的时候,也是一名程序员,而且一干就是10年。雷军在22年前的作文中写道:我会当一辈子程序员,由此可以看出雷军对编程有着狂热的爱好。 还有网友分享了一篇雷军22年前写的代码,废话不多说,直接贴代码。 雷军写的这篇代码,是不是看起来很牛逼?简直就是亮瞎眼! 前方高能…… ; ; RI.ASM Revision 2.12 [ July 12, 1994 ] Revision equ 'V2.12 ' ; ; ; ; RAMinit Release 2.0 ; Copyright (c) 1989-1994 by Yellow Rose Software Co. ; Written by Mr. Leijun ; ; Function: ; Press HotKey to remove all TSR program after this program ; ; ; .......................................................................... ; Removed Softwares by RI: ; SPDOS v6.0F, WPS v3

mingw32 exception在sjlj与dwarf差别-反汇编分析

天大地大妈咪最大 提交于 2020-08-17 06:52:05
sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现。sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用dwarf-2版,那么两者之间有多少差异,本文就这问题对两版的异常代码的反汇编进行分析比较。 我使用mingw-w65-i686-810的sjlj与dwarf-2两个版本对下面异常代码编译。 __attribute__((dllimport)) int dllfunc(); int main() { dllfunc(); // _create_locale(LC_ALL, "C"); printf( " abc " ); // return 0; try { try { throw std::exception(); } catch (std::exception& )   { std::rethrow_exception(std::current_exception());   } } catch ( int ) { } catch (std::exception& e) { std::cout << e.what() << std::endl; } catch (...) { std::cout << " unknown " << std::endl; } return 0 ; }

长链剖分

百般思念 提交于 2020-08-17 03:43:22
看到标题估计大家也猜到了,其实和 树链剖分 所用到的重链剖分挺像。 重链剖分中,每个点所选取的重儿子是它儿子中子树最大的那一个儿子,他们之间的连线被称为重边;在整棵树中,许多重边组成的链即重链。重链相互不重合的划分了整棵树。 重剖和长剖唯一不同的是:重链剖分中一个点的重儿子是子树最大(管辖节点最多)的儿子,而长链剖分选择的是 子树深度最大的那个儿子(子树深度:一个点的子树中深度最大的点的深度)。 (图:重链剖分和长链剖分的对比) 看明白是长链剖分是怎么划分了后,我们先来了解一下长链剖分的两个性质。 性质1: 对树长链剖分后,树上所有长链的长度和为$n$ 这个不必解释吧... 性质2: 对于树上任意一点$x$,它的$K$级祖先$y$所在长链的长度一定$>=K$ 这个恐怕就没那么显然了.. 不过还是好懂。如果$x$就在$y$所在的长链里,那么既然$x$上跳$K$步后都还在该长链里,这条长链的长度铁定$>=k$咯 那么如果$x$不在$y$所在的长链里呢?也简单,我们思考一下,$x$没在$y$所在的长链的原因是什么?就是因为x的深度没有$y$所在长链的 最大深度 大,所以才被分到了轻儿子里。那既然$y$所在长链的最大深度$>=$x的深度,这条长链的长度自然$>=K$了 (图:x不在y所在的长链的情况) 性质3: 任何一个点向上跳到根所经过的轻边不会超过$\sqrt{n}$条

计算机组成原理笔记(二)

我是研究僧i 提交于 2020-08-16 12:13:21
我的博客: https://www.luozhiyun.com/ 浮点数和定点数 我们先来看一个问题,在Chrome浏览器里面通过开发者工具,打开浏览器里的Console,在里面输入“0.3 + 0.6”: >>> 0.3 + 0.6 0.8999999999999999 下面我们来一步步解释,为什么会这样。 定点数 如果我们用32个比特表示整数,用4个比特来表示0~9的整数,那么32个比特就可以表示8个这样的整数。 然后我们把最右边的2个0~9的整数,当成小数部分;把左边6个0~9的整数,当成整数部分。这样,我们就可以用32个比特,来表示从0到999999.99这样1亿个实数了。 这种用二进制来表示十进制的编码方式,叫作BCD编码。这种小数点固定在某一位的方式,我们也就把它称为定点数。 缺点: 第一,这样的表示方式有点“浪费”。本来32个比特我们可以表示40亿个不同的数,但是在BCD编码下,只能表示1亿个数。 第二,这样的表示方式没办法同时表示很大的数字和很小的数字。 浮点数 我们在表示一个很大的数的时候,通常可以用科学计数法来表示。 在计算机里,我也可以用科学计数法来表示实数。浮点数的科学计数法的表示,有一个IEEE的标准,它定义了两个基本的格式。一个是用32比特表示单精度的浮点数,也就是我们常常说的float或者float32类型。另外一个是用64比特表示双精度的浮点数

汇编语言(王爽 第三版)检测点

爷,独闯天下 提交于 2020-08-16 12:11:37
这本书购于2015.11.30,我大概从2016.3月开始读,历时大概三个月,我们学校开《微机原理与汇编语言》这门课,不过让人感觉很不爽,课本一开始就丢给你一堆东西,意欲让你记住这一大堆东西,然后开始编程,我对编程语言的学习方面要求比较高,所以开始读这本王爽老师写的汇编语言,目前为止,这本书给我的感觉就是,你能学到很多底层的东西,尤其是像键盘的读写原理,屏幕的显示,特别是对内存的操作和管理,不像课本上给你一个中断让你就能显示字符之类的,它会一步一步教你怎么把要显示的东西写到显存里面,这本书显得比较浅显易懂,让人感觉不错,特别是读了这本书再去看那些难度较高的汇编代码及微机原理,效率会高很多,下面是我读这本书的过程中对书中检测点的解答,仅代表个人观点。 第一章 检测点1. 1 1 ) 13   (8kb = 8 * 1024 = 2 ^ 13)   2 ) 1024 0 1023 3 ) 8 * 1024 1024   ( 1 byte = 8 bit,计算机以byte为存储单位) 4 ) 1024 ^ 3 1024 ^ 2 1024 5 ) 2 ^ 6 1 2 ^ 4 2 ^ 2   (kb = 2 ^ 10 Mb = 2 ^ 20 Gb = 2 ^ 30) 6 ) 1 1 2 2 4 7 ) 512 256   (8086的寄存器为16位寄存器,一次可以读取两个字节

Linux内核jump label与static key的原理与示例

蹲街弑〆低调 提交于 2020-08-15 07:24:40
jump label机制进入Linux内核已经很多很多年了,它的目的是 消除分支。 为了达到这个目的,jump label的手段是 修改分支处的代码。 ~把代码当做数据,代码和数据在冯诺伊曼计算机中得到了统一~ 本质上,jump label作用于下面的逻辑: var = false ; . . . if var do_true else do_false 静态拆分成了下面的两个逻辑,其一是: jmp l_true do_false ret l_true : do_true 或者,其二是: nop do_false ret l_true : do_true 但二者不能同时共存。 显然,这破坏了通用性和灵活性,带来了高效! 这相当于一个硬熔断,具体详情参见: https://blog.csdn.net/dog250/article/details/6123517 【PS:这篇文章是我上周找到的,看完了才发现,竟然是我自己写的】 本文来一点可以看得见的东西,演示一下真实的jump label & static key。 先看下面的C代码: # include <stdio.h> int main ( int argc , char * * argv ) { int E1 , E2 ; E1 = atoi ( argv [ 1 ] ) ; E2 = atoi ( argv [ 2 ] )

全国大学生信息安全竞赛三等奖virusTotal论文展示

烂漫一生 提交于 2020-08-14 13:18:31
基于API调用行为的二进制通用脱壳方法 注:本人去年参赛的作品,欢迎大家对不足之处提出宝贵的意见,谢谢。 完整图文论文请看我的另一篇博客: https://blog.csdn.net/ITxiaoangzai/article/details/106156192 摘要 加壳技术被广泛应用于恶意代码的自我保护,用于对抗躲避反病毒软件的检测,使得反病毒软件检测率大大降低。所以设计一个能够自动化的通用脱壳系统具有重要的理论和现实意义。 基于上述动机,本文设计和实现了基于API调用行为的二进制通用脱壳系统。本系统利用加壳代码"先重建后调用"的API调用行为特征进行脱壳。整个系统采用B/S架构模式。Browser端负责上传样本到Server端以及向用户反馈分析结果;Server端接收样本后,在沙盒环境中动态运行,通过监控"先重建后调用"的API调用行为特征进行动态脱壳。 本文实现了原型系统VirusMore()。实验结果表明,VirusMore能广泛用于不同的软件壳并进行成功脱壳,提高反病毒软件检测恶意代码的准确率和降低对正常程序的误报率。 第一章 作品概述 1.1 背景分析 伴随着信息技术的不断发展,网络给人们带来便利的同时,网络安全威胁问题也日益突出,网络安全风险不断向政治、经济、文化、社会、生态和国防等各个领域传导渗透。据CNCERT抽样监测,2018年

汇编语言(王爽 第三版)检测点

本秂侑毒 提交于 2020-08-14 12:11:04
这本书购于2015.11.30,我大概从2016.3月开始读,历时大概三个月,我们学校开《微机原理与汇编语言》这门课,不过让人感觉很不爽,课本一开始就丢给你一堆东西,意欲让你记住这一大堆东西,然后开始编程,我对编程语言的学习方面要求比较高,所以开始读这本王爽老师写的汇编语言,目前为止,这本书给我的感觉就是,你能学到很多底层的东西,尤其是像键盘的读写原理,屏幕的显示,特别是对内存的操作和管理,不像课本上给你一个中断让你就能显示字符之类的,它会一步一步教你怎么把要显示的东西写到显存里面,这本书显得比较浅显易懂,让人感觉不错,特别是读了这本书再去看那些难度较高的汇编代码及微机原理,效率会高很多,下面是我读这本书的过程中对书中检测点的解答,仅代表个人观点。 第一章 检测点1. 1 1 ) 13   (8kb = 8 * 1024 = 2 ^ 13)   2 ) 1024 0 1023 3 ) 8 * 1024 1024   ( 1 byte = 8 bit,计算机以byte为存储单位) 4 ) 1024 ^ 3 1024 ^ 2 1024 5 ) 2 ^ 6 1 2 ^ 4 2 ^ 2   (kb = 2 ^ 10 Mb = 2 ^ 20 Gb = 2 ^ 30) 6 ) 1 1 2 2 4 7 ) 512 256   (8086的寄存器为16位寄存器,一次可以读取两个字节