<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>汇编 on 映屿</title>
    <link>https://blog.verdant.ee/tags/%E6%B1%87%E7%BC%96/</link>
    <description>Recent content in 汇编 on 映屿</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    
      <managingEditor>i@glowisle.me (五葉地錦)</managingEditor>
    
    
      <webMaster>i@glowisle.me (五葉地錦)</webMaster>
    
    
    
    <lastBuildDate>Tue, 29 Apr 2025 13:44:13 +0000</lastBuildDate>
    
    
    <atom:link href="http://blog.verdant.ee/tags/%E6%B1%87%E7%BC%96/atom.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>x86-64汇编学习笔记</title>
      <link>https://blog.verdant.ee/posts/x86-64%E6%B1%87%E7%BC%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Tue, 29 Apr 2025 13:44:13 +0000</pubDate><author>i@glowisle.me (五葉地錦)</author>
      <guid>https://blog.verdant.ee/posts/x86-64%E6%B1%87%E7%BC%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;机器指令和机器语言&#34;&gt;机器指令和机器语言&lt;/h2&gt;&#xA;&lt;p&gt;机器指令，二进制数字，机器语言全局机器指令的集合，CPU通过执行一系列的机器指令完成计算工作。&lt;/p&gt;&#xA;&lt;p&gt;汇编语言就是为了代替机器指令，使人类能够更加简单地编写程序而诞生的。汇编语言就是机器码的助记符。&lt;/p&gt;&#xA;&lt;p&gt;编译器将汇编代码再编译为真正的机器码。&lt;/p&gt;&#xA;&lt;h2 id=&#34;内存与硬盘&#34;&gt;内存与硬盘&lt;/h2&gt;&#xA;&lt;p&gt;内存指内存条，即RAM，临时存储，读写快容量小。&lt;/p&gt;&#xA;&lt;p&gt;硬盘长期存储，读写慢但容量大。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ROM并非硬盘&lt;/strong&gt;，ROM&lt;strong&gt;只读存储器&lt;/strong&gt;（Read Only Memory），其内容在写入后就不能更改。&lt;/p&gt;&#xA;&lt;h2 id=&#34;存储单元&#34;&gt;存储单元&lt;/h2&gt;&#xA;&lt;p&gt;物理内存被划分为很多个存储单元，一个存储单元能存储8bit内容，也就是1字节。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;内存的最小单元是字节，不是位。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1B = 8bit&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1KB = 1024B&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1MB = 1024KB&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;每一个存储单元都有相应的编号，也就是内存地址。运行程序时，操作系统会把程序载入内存中，随后CPU读取和写入程序中的某些数据并执行代码。&lt;/p&gt;&#xA;&lt;p&gt;无论是读取还是写入、执行，这些都是需要通过CPU总线进行的。&lt;/p&gt;&#xA;&lt;p&gt;总线分为数据线、地址总线、控制总线&lt;/p&gt;&#xA;&lt;p&gt;简而言之，地址总线负责寻址，控制总线负责发出控制指令，如读写，数据总线负责各个组件之间的数据传输。&lt;/p&gt;&#xA;&lt;h2 id=&#34;cpu的寻址能力&#34;&gt;CPU的寻址能力&lt;/h2&gt;&#xA;&lt;p&gt;CPU的寻址能力是由地址总线的位数决定的。&lt;/p&gt;&#xA;&lt;p&gt;通常认为32位系统有32位的寻址能力，64位同理，但不绝对。&lt;/p&gt;&#xA;&lt;h2 id=&#34;虚拟内存&#34;&gt;虚拟内存&lt;/h2&gt;&#xA;&lt;p&gt;物理内存即真实存在的内存，虚拟内存是建立在页表的基础上，由操作系统实现的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;寄存器&#34;&gt;寄存器&lt;/h2&gt;&#xA;&lt;p&gt;基本的程序执行寄存器分为以下四类&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;通用目的寄存器&lt;/li&gt;&#xA;&lt;li&gt;段寄存器&lt;/li&gt;&#xA;&lt;li&gt;标志寄存器&lt;/li&gt;&#xA;&lt;li&gt;指令指针寄存器&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;16位通用寄存器中的高位和低位&#34;&gt;16位通用寄存器中的高位和低位&lt;/h3&gt;&#xA;&lt;p&gt;16位通用寄存器中，ax,bx,cx,dx可以只使用其高8位或低8位。&lt;/p&gt;&#xA;&lt;p&gt;高8位用字符&lt;code&gt;h&lt;/code&gt;表示，低8位用字母&lt;code&gt;l&lt;/code&gt;表示。&lt;/p&gt;&#xA;&lt;h3 id=&#34;32位通用目的寄存器&#34;&gt;32位通用目的寄存器&lt;/h3&gt;&#xA;&lt;p&gt;将16位通用寄存器扩展到32位，就得到了以下寄存器。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;EAX&lt;/li&gt;&#xA;&lt;li&gt;EBX&lt;/li&gt;&#xA;&lt;li&gt;EDX&lt;/li&gt;&#xA;&lt;li&gt;ESI&lt;/li&gt;&#xA;&lt;li&gt;EDI&lt;/li&gt;&#xA;&lt;li&gt;ESP&lt;/li&gt;&#xA;&lt;li&gt;EBP&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;64位通用目的寄存器&#34;&gt;64位通用目的寄存器&lt;/h3&gt;&#xA;&lt;p&gt;将32扩展到64位，就得到了以下寄存器&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RAX&lt;/li&gt;&#xA;&lt;li&gt;RBX&lt;/li&gt;&#xA;&lt;li&gt;RCX&lt;/li&gt;&#xA;&lt;li&gt;RDX&lt;/li&gt;&#xA;&lt;li&gt;RSI&lt;/li&gt;&#xA;&lt;li&gt;RDI&lt;/li&gt;&#xA;&lt;li&gt;RSP&lt;/li&gt;&#xA;&lt;li&gt;RDP&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;R是通用前缀，取自单词Register。&lt;/p&gt;&#xA;&lt;p&gt;此外还有R8-R15。&lt;/p&gt;&#xA;&lt;h3 id=&#34;同名寄存器之间的关系&#34;&gt;同名寄存器之间的关系&lt;/h3&gt;&#xA;&lt;p&gt;同名寄存器之间并不是许多个相互独立的寄存器，而是共同属于一个寄存器。&lt;/p&gt;&#xA;&lt;p&gt;以RAX为例：&lt;/p&gt;&#xA;&lt;p&gt;RAX是整个64位寄存器，EAX指的是RAX的低32位，AX指的是RAX的0-15位。AH指的是RAX的8-15位，AL指的是RAX的0-7位。&lt;/p&gt;&#xA;&lt;p&gt;1 word = 2 byte&lt;/p&gt;&#xA;&lt;p&gt;1 double word = 4 byte&lt;/p&gt;&#xA;&lt;h2 id=&#34;段寄存器&#34;&gt;段寄存器&lt;/h2&gt;&#xA;&lt;p&gt;段寄存器CS、DS、SS、ES、FS、GS都保存着16位段选择子。用于标识内存中特定的段。&lt;/p&gt;&#xA;&lt;p&gt;CS指向代码段，SS指向栈段，DS、ES、FS、GS指向数据段。&lt;/p&gt;&#xA;&lt;p&gt;内存可以被分为不同的段，访问内存时通过段基址+偏移的方式来访问。&lt;/p&gt;&#xA;&lt;p&gt;注意：物理内存本身是连续的，并没有被分隔开，分段是CPU的寻址方式。&lt;/p&gt;&#xA;&lt;p&gt;到了64位，段的概念被进一步弱化。&lt;/p&gt;&#xA;&lt;p&gt;内存变成平坦模型，即无分段式内存。所有对内存的访问都在同一个地址空间内进行。&lt;/p&gt;&#xA;&lt;p&gt;此外，对于段的保护也被弱化，64位更强调对页的保护。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;看来段寄存器没什么用了啊&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;段寄存器最初的存在目的是辅助寻址，在32位下基本不再用于寻址，而是用于保护，而64位中其保护作用进一步被削弱。&lt;/p&gt;&#xA;&lt;h2 id=&#34;标志寄存器&#34;&gt;标志寄存器&lt;/h2&gt;&#xA;&lt;p&gt;标准寄存器存储了机组标志，分别是状态标志、控制标志、系统标志。&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-caption&#34;&gt;&#xA;    &lt;img src=&#34;https://images.glowisle.me/image-20250429142959416.webp&#34; alt=&#34;标志寄存器结构示意图&#34;&gt;&#xA;    &lt;figcaption&gt;标志寄存器结构示意图&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&lt;/p&gt;&#xA;&lt;p&gt;简单地来说，系统中的某些状态与指令的执行结果会存在这个寄存器当中。&lt;/p&gt;&#xA;&lt;p&gt;标志寄存器在32位和64位中分别叫&lt;strong&gt;EFLAGS&lt;/strong&gt;和&lt;strong&gt;RFLAGS&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;RFLAGS的高32位是保留为，低32位与EFLAGS相同。&lt;/p&gt;&#xA;&lt;h2 id=&#34;指令指针寄存器&#34;&gt;指令指针寄存器&lt;/h2&gt;&#xA;&lt;p&gt;简而言之，他存储的是CPU即将执行的下一条指令的地址，通常用ip/eip/rip替代  （16，32，64位）&lt;/p&gt;&#xA;&lt;h2 id=&#34;进制&#34;&gt;进制&lt;/h2&gt;&#xA;&lt;p&gt;简单来说，n进制就是逢n进一。计算机当中，除了10进制，还有2进制和6进制。&lt;/p&gt;&#xA;&lt;h2 id=&#34;小端序和大端序&#34;&gt;小端序和大端序&lt;/h2&gt;&#xA;&lt;p&gt;小端序是指低字节在低地址，高字节在高地址。&lt;/p&gt;&#xA;&lt;p&gt;优点：字节高低位与地址高低位序列相同。&lt;/p&gt;&#xA;&lt;p&gt;缺点：不符合人类阅读顺序。&lt;/p&gt;&#xA;&lt;p&gt;如：64 00 00 00&lt;/p&gt;&#xA;&lt;p&gt;大端序与之相反。&lt;/p&gt;&#xA;&lt;p&gt;如 00 00 00 64&lt;/p&gt;&#xA;&lt;h2 id=&#34;mov指令&#34;&gt;MOV指令&lt;/h2&gt;&#xA;&lt;p&gt;MOV取自英文单词move，移动。&lt;/p&gt;&#xA;&lt;p&gt;例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d6cbb4;background-color:#252b2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MOV RAX, RCX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;意思是，把RCX寄存器的值赋值给RAX&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
