就是现在 發表於 2021-2-7 11:28:00

杂记001. 计算机底层-汇编语言

<h1 id="一二进制"><strong>一、二进制</strong></h1>
<p>1、<strong>打开计算机</strong>:Windows + R + 'calc'</p>
<p>2、<strong>进制代码</strong>:十六进制HEX</p>
<p>​                        十进制DEC</p>
<p>​                        八进制OCT</p>
<p>​                        二进制BIN</p>
<p>3、<strong>进制的运算</strong>:<strong>查表</strong> --&gt; 每一种进制都有完美的运算规律,不必将其他进制转化为十进制后再运算</p>
<p>4、<strong>为什么要学习理解二进制?</strong></p>
<p>​        寄存器、内存、位!底层的每一个位都是有含义的。是汇编入门的基础!</p>
<p>​        汇编高级:了解程序的深层、操作系统的内核</p>
<h1 id="二数据宽度">二、数据宽度</h1>
<p>计算机的内存是有限制的,所以要给数据增加数据宽度!</p>
<p>​        位 0 ~ 1</p>
<p>​        字节 0 ~ 0xFF</p>
<p>​        字 0 ~ 0xFFFF</p>
<p>​        双字 0 ~ 0xFFFFFFFF</p>
<p>​        <strong>在计算机中,每一个数据都需要给它定义数据类型,就是要给它定义宽度,划分它占用的内存空间!</strong></p>
<h1 id="三有符号数与无符号数">三、有符号数与无符号数</h1>
<p>数据都是有宽度的,每个数据代表什么意思呢?</p>
<h2 id="规则"><strong>规则</strong></h2>
<p>给二进制解码规定一个规则!</p>
<p>无符号数规则:<strong>你这个数是什么就是什么</strong></p>
<pre><code class="language-shell">1        0        0        1        1        0        1        0 十六进制:0x9A
</code></pre>
<p>有符号数规则:<strong>最高位是符号位</strong></p>
<pre><code class="language-shell">#最高位是符号位1(负数)0(正数)
1        0        0        1        1        0        1        0
</code></pre>
<p><strong>如何转换?</strong></p>
<h2 id="原码反码和补码">原码反码和补码</h2>
<p>位运算基础</p>
<h3 id="有符号数的编码规则"><strong>有符号数的编码规则</strong></h3>
<p><strong>原码</strong>:最高位为符号位,对其他的位进行本身的绝对值即可。</p>
<p><strong>反码:</strong></p>
<ul>
<li>正数:反码与原码一致</li>
<li>负数:符号位一定是1,其余位与原码相反</li>
</ul>
<p><strong>补码</strong>:</p>
<ul>
<li>正数:补码和原码相同。</li>
<li>负数:符号位一定是1,反码+1</li>
</ul>
<h3 id="测试"><strong>测试</strong></h3>
<pre><code class="language-shell"># 以下均为八位

1
#原码 0        0        0        0        0        0        0        1       
#反码 0        0        0        0        0        0        0        1
#补码 0        0        0        0        0        0        0        1

-1
#补码 1        0        0        0        0        0        0        1
#反码 1        1        1        1        1        1        1        0
#补码 1        1        1        1        1        1        1        1

#二进制的标志
2        10
4        100
8        1000
16        10000f 1111
……
</code></pre>
<h1 id="四位运算理解">四、位运算理解</h1>
<p>寄存器:mov 寄存器,值</p>
<p>很多底层调试器,都需要通过位来判断CPU的状态。</p>
<p><strong>与运算(and &amp;)</strong></p>
<p><img src="https://img2020.cnblogs.com/blog/2299587/202102/2299587-20210207112004650-1826286693.png" alt="" loading="lazy"></p>
<pre><code class="language-shell">1011 0001
1101 1000
---------&amp; and
1001 0000
</code></pre>
<p><strong>或运算(or |)</strong></p>
<p><img src="https://img2020.cnblogs.com/blog/2299587/202102/2299587-20210207112029698-278438778.png" alt="" loading="lazy"></p>
<pre><code class="language-shell">1011 0001
1101 1000
---------| or
1111 1001
</code></pre>
<p><strong>异或运算(xor ^)</strong></p>
<p>不一样就是一</p>
<p><img src="https://img2020.cnblogs.com/blog/2299587/202102/2299587-20210207112048754-1510096295.png" alt="" loading="lazy"></p>
<pre><code class="language-shell">1011 0001
1101 1000
--------- ^ xor
0110 1001
</code></pre>
<p><strong>非运算(单目运算符 not ~)</strong></p>
<p>0就是1,1就是0</p>
<pre><code class="language-shell">1011 0001
--------- ~ not
0100 1110
</code></pre>
<p><strong>与非运算(NAND)</strong></p>
<p>有0出1,全1出0</p>
<p><strong>或非运算(NOR)</strong></p>
<p>有1出0,全0出1</p>
<hr>
<h2 id="位运算移动位左移2右移2">位运算(移动位,左移*2,右移/2)</h2>
<pre><code class="language-shell">0000 0001        1
0000 0010        2
0000 0100        4
0000 1000        8
</code></pre>
<p><strong>左移(shl &lt;&lt;)</strong></p>
<pre><code class="language-shell">0000 0001        @所有二进制位全部左移若干位,高位丢弃,低位补0
0000 0010
</code></pre>
<p><strong>右移(shr &gt;&gt;)</strong></p>
<pre><code class="language-shell">0000 0001        @所有二进制位全部右移若干位,低位丢弃,高位补0或1(由符号位决定)
0000 0000
</code></pre>
<h1 id="五位运算的加减乘除">五、位运算的加减乘除</h1>
<p>计算4+5=?计算机是怎么实现的呢?</p>
<pre><code class="language-shell">#计算4+5
0000 0100
0000 0101
--------- +:计算机是不会直接加的
0000 1001

#计算机实现的原理

#第一步:异或,如果不考虑进位,异或就可以直接得到答案
0000 0100
0000 0101
--------- xor
0000 0001

#第二步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0100
0000 0101
--------- and
0000 0100

#第三步:将与运算的结果,左移一位
0000 1000 #进位的结果

#第四步:异或,将第一步和第三步的结果异或
0000 0001
0000 1000
--------- xor
0000 1001

#第五步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0001
0000 1000
--------- and
0000 0000

#所以最终的结果就是与运算为0的结果的上一个异或运算
#结果为1001
</code></pre>
<p><strong>4-5=?</strong></p>
<pre><code class="language-shell">#计算4-5
#转化为4+(-5)
4        0000 0100
-5        1000 0101(原码)        -&gt;        1111 1010(反码)        -&gt;        1111 1011(补码)

0000 0100
1111 1011
--------- +
1111 1111

#计算机运算
#第一步:异或运算
0000 0100
1111 1011
--------- xor
1111 1111

#第二步:与运算
0000 0100
1111 1011
--------- and
0000 0000

#最终结果:1111 1111(补码)-&gt; 1111 1110(补码的反码)-&gt; 1000 0001(反码的原码)
</code></pre>
<p>减:x-y,就是x+(-y)</p>
<p>乘:x*y,就是y个x相加,本质还是加法</p>
<p>除:x/y,本质就是减法,就是x能减去多少个y</p>
<p><strong><mark>所以说,计算机只会做加法!</mark></strong></p>
<p>机器语言就是位运算,都是通过电路来实现的,这就是计算机最底层的本质!</p>
<h1 id="六汇编语言环境说明">六、汇编语言环境说明</h1>
<p>通过指令来代替我们的二进制编码。</p>
<p>通过汇编指令可以给计算机发一些操作,然后让计算机执行。这又关系到编译器的发展</p>
<p>学习汇编之前,大家需要先掌握环境的配置(1、Vc6(程序到汇编的理解) 2、OD 3、抓包工具 4、加密解密工具)</p>
<p><strong>学汇编不是为了写代码,而是为了理解程序的本质!</strong></p>
<p>寄存器、内存和汇编指令</p>
<h2 id="通用寄存器可以存储任意的值"><mark>通用寄存器,可以存储任意的值</mark></h2>
<p>存储数据:CPU&gt;内存&gt;硬盘</p>
<p>32位CPU        8        16        32</p>
<p>64位CPU          8        16        32        64</p>
<p><strong>通用寄存器</strong></p>
<pre><code class="language-shell">#32位的通用寄存器只有8个
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2299587/202102/2299587-20210207112233945-932316571.png" alt="" loading="lazy"></p>
<p>存值范围:0~FFFFFFFF</p>
<p><strong>计算机如何向寄存器存值?</strong></p>
<p><strong>mov指令</strong></p>
<pre><code class="language-shell">mov 存的地址,存的数
mov 存的地址1,存的地址2
</code></pre>
<p>可以将数字写入到寄存器,也可以将寄存器中的值存入到寄存器中。</p>
<p><strong>不同的寄存器</strong></p>
<table>
<thead>
<tr>
<th style="text-align: center">FFFFFFFF</th>
<th>FFFF</th>
<th>FF</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">32位</td>
<td>16位</td>
<td>8位</td>
</tr>
<tr>
<td style="text-align: center">EAX</td>
<td>AX</td>
<td>AL</td>
</tr>
<tr>
<td style="text-align: center">ECX</td>
<td>CX</td>
<td>CL</td>
</tr>
<tr>
<td style="text-align: center">EDX</td>
<td>DX</td>
<td>DL</td>
</tr>
<tr>
<td style="text-align: center">EBX</td>
<td>BX</td>
<td>BL</td>
</tr>
<tr>
<td style="text-align: center">ESP</td>
<td>SP</td>
<td>AH</td>
</tr>
<tr>
<td style="text-align: center">EBP</td>
<td>BP</td>
<td>CH</td>
</tr>
<tr>
<td style="text-align: center">ESI</td>
<td>SI</td>
<td>DH</td>
</tr>
<tr>
<td style="text-align: center">EDI</td>
<td>DI</td>
<td>BH</td>
</tr>
<tr>
<td style="text-align: center"></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>8位:L低8位,H高8位</p>
<p><strong>除了通用寄存器以外,其他的寄存器每一位都有自己特定的功能!</strong></p>
<hr>
<h2 id="内存">内存</h2>
<p>寄存器很小,不够用,所以数据放到内存。</p>
<p>每个程序进程都有4GB的内存空间,空头支票。</p>
<p><img src="https://img2020.cnblogs.com/blog/2299587/202102/2299587-20210207112426023-1734252484.png" alt="" loading="lazy"></p>
<p>程序真正运行的时候,才会用到物理内存</p>
<p>1B = 8bit</p>
<p>1KB = 1024B</p>
<p>1MB = 1024KB</p>
<p>1GB = 1024MB</p>
<p>4G的内存,最终计算为位</p>
<p>计算机中内存地址很多,空间很大。</p>
<p><strong>内存地址</strong></p>
<p>存一个数:占用的大小,数据宽度-&gt;存到哪里?</p>
<p>计算机中内存地址很多,空间很大,所以要给每一个空间分配一个地址,名字!</p>
<p><img src="https://img2020.cnblogs.com/blog/2299587/202102/2299587-20210207112447417-200143561.png" alt="" loading="lazy"></p>
<p>这些给内存起的编号,就是我们的内存地址。(32位 8个16进制的值)</p>
<p>32位:寻址能力,4GB</p>
<p>FFFFFFFF +1 = 100000000 ,最大的值</p>


</div>
<div id="MySignature" role="contentinfo">
    高山仰止, 景行行止; 虽不能至, 心向往之.<br><br>
来源:https://www.cnblogs.com/WuDaijie2001/p/AnyTask_Others_001.html
頁: [1]
查看完整版本: 杂记001. 计算机底层-汇编语言