汇编语言—寄存器

寄存器

一个CPU由寄存器,运算器,控制器组成,寄存器负责存储数据。通用寄存器:AX,BX,CX,DX。8086CPU的寄存器都是16位的,能存放两个字节。一个寄存器又能分为两个部分,一个高位字节如AH,还有一个地位字节如AL。这两个部分可以单独看成一个八位寄存器来用。当寄存器当整体来看时,它可以进行16位的二进制运算,当分成高位低位来看时,只能算八位的。就比如当mov AL,N。当N化成二进制大于8位时,存在AL中的数据只有N的后八位,第一位要舍去。而当看成整体计算时,就会进一位,不会舍去。

一些基本的知识我们得知道,后面这些真的枯涩。
1.存储单元:存储器被划分为若干个存储单元,一个存储单元有一个字节也就是八个bit,也就是八位。可以存储八个二进制位。

2.地址总线:地址总线的寻址能力由地址总线的宽度决定,宽度用多少根线来表示,比如有十根地址总线,那么宽度就是十。假设宽度是N,那么这台电脑能寻找2的N次方个存储单元。

内存地址空间:一个CPU的地址总线关系到构成这CPU的内存地址空间,地址总线宽度为N,那么这个CPU只能寻到2的N次方的内存地址空间,这可寻到的2的N次方的内存单元就是这CPU的内存地址空间。 因为一个内存单元为一字节,所以地址总线的寻址能力通常也可以用KB,MB,GB来表示。如宽度为十,2的10次方。寻址能力就是1KB,都是表示1024个内存单元。

逻辑存储器(内存地址空间):一个假想的存储器,CPU将系统中各类存储器看成一个逻辑存储器,就是现在对CPU来说,只有一个存储器,就是这个逻辑存储器,而各类存储器相当于这个逻辑存储器里面的不同段的地址空间。

3.数据总线

数据总线的宽度决定了CPU与外界传输数据的速度。宽度为8,那么一次就能传输8位二进制数,为16就能传输16位二进制数,一次一根线传输一位二进制数。

4.控制总线

控制总线是由许多根有不同控制功能的线组成,每根线的控制能力都不一样,所以CPU控制总线的宽度决定了CPU对外部器件的控制能力。

1.通用寄存器
8086CPU的所有寄存器是16位的,可以存放两个字节。AX,BX.CX.DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。

AX分为AH和AL;
BX分为BH和BL

汇编语言—寄存器_第1张图片
AX的低8位构成了AL寄存器,AX的高8位构成了AH寄存器。

2 字在寄存器中的存储
字节:Byte,一个字节由8个bit组成,可以存在8位寄存器中。
字:word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。
汇编语言—寄存器_第2张图片

3 8086CPU的物理地址
汇编语言—寄存器_第3张图片
物理地址=段地址16+偏移地址
汇编语言—寄存器_第4张图片
一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
段地址
16表示以二进制形式存放的段地址左移4位,十六进制形式存放的段地址左移1位。

4 段
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。
比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。

5 CS和IP
CS为代码段寄存器,IP为指令指针寄存器。
汇编语言—寄存器_第5张图片
CPU的工作流程:
1.从CS:IP指向的内存单元读取指令,读取的指令进入指令缓存区
2. IP=IP+所读指令的长度,进而指向下一条指令
3. 执行指令,然后再跳转到第一步,继续这个过程
当然这只是个概述,实际的比这复杂的多。

攻防世界的re1
打开发现是个这
汇编语言—寄存器_第6张图片

然后你随便输入
汇编语言—寄存器_第7张图片
所以找到正确的flag之后就会显示正确。
拉进IDA中
这道题有个简便的方法就是直接去搜索中文字符串(不知为何在我这儿并不能看到中文)
然后缩小范围再去寻找
汇编语言—寄存器_第8张图片
我们看到有个flag get ,这个应该就是获取到正确的flag了
点进去上下翻一翻
汇编语言—寄存器_第9张图片这就发现了两段很长的字符串,然后用R键将其转化为ASCII码表示的字符
其实这就是一个习惯,看到这么长的字符,就上去R一下看看。
汇编语言—寄存器_第10张图片
这就发现了flag
还有就是这是个反过来的flag,所以还要认真地去转换一下。

————
当然这只是一种比较巧妙的方法。
常规操作,拖进IDA之后F5,转换为C语言代码形式
汇编语言—寄存器_第11张图片
分析if函数,可以知道flag的得出与v3的值有关,而v3是v5和v9作比较所得的。当v3为0时会输出unk_413E90,进去就是flag get,而v3为0时即是v5与v9相等之时,v9就是我们所要输入的flag,这说明v5中就是存储着flag
我们先看一下V5
汇编语言—寄存器_第12张图片
啥都没有,一开始不知怎么回事,我们就在同一行都点点,发现只有行尾xmmword_413E34能进去,而且还不是空的。可以猜测前面这个函数应该就是把后面的值赋给v5
而xmmword_413E34进去就能看到两段字符串
汇编语言—寄存器_第13张图片用r转换为字符,得到flag
汇编语言—寄存器_第14张图片

你可能感兴趣的:(汇编语言)