PageSourceSearch

https://lexonblog.pages.dev/assets/%E6%B1%87%E7%BC%96%E5%AD%A6%E4%B9%A0.html-CGOKEc9g.js

js lexonblog.pages.dev collected 2026-10-03 05:24:24 UTC 20,138 bytes, 44 lines download raw bytes

1import{_ as n}from"./plugin-vue_export-helper-DlAUqK2U.js";import{c as a,b as p,o as e}from"./app-Bsu0UZzf.js";const i={};function l(d,s){return e(),a("div",null,[...s[0]||(s[0]=[p(`<h1 id="汇编" tabindex="-1"><a class="header-anchor" href="#汇编"><span>汇编</span></a></h1><h2 id="流程" tabindex="-1"><a class="header-anchor" href="#流程"><span>流程</span></a></h2><div class="language-unix-assembly line-numbers-mode" data-highlighter="shiki" data-ext="unix-assembly" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-unix-assembly"><span class="line"><span>.file   &quot;example.c&quot; #定义文件名称  </span></span>
2<span class="line"><span>        .text #定义文件类型  </span></span>
3<span class="line"><span>        .globl  add_a_and_b #定义变量名称为全局变量名称  </span></span>
4<span class="line"><span>        .type   add_a_and_b, @function #定义类型为函数  </span></span>
5<span class="line"><span>add_a_and_b: #定义  </span></span>
6<span class="line"><span>.LFB0: #局部函数块的开始.lfb[x] 这里[x]指代的是区域编号  </span></span>
7<span class="line"><span>        .cfi_startproc #起始调用帧指令  </span></span>
8<span class="line"><span>        pushq   %rbp # pushq为指令 %rbp为寄存器 目的是将寄存器压入栈中  </span></span>
9<span class="line"><span>        .cfi_def_cfa_offset 16 #定义当前堆栈指针  </span></span>
10<span class="line"><span>        .cfi_offset 6, -16 #定义堆栈偏移量 目标是6号寄存器空间 -16是堆栈指针  </span></span>
11<span class="line"><span>        movq    %rsp, %rbp #将%rbq寄存器移动到%rsp中  </span></span>
12<span class="line"><span>        .cfi_def_cfa_register 6 #定义当前指针使用的寄存器 在这里6号寄存器指的是%rbp  </span></span>
13<span class="line"><span>        movl    %edi, -4(%rbp) #将%edi寄存器的值移动到%rbp偏移4个字节的内存地址位置  </span></span>
14<span class="line"><span>        movl    %esi, -8(%rbp) #将%esi寄存器的值移动到%rbp偏移8个字节的内存地址位置  </span></span>
15<span class="line"><span>        movl    -4(%rbp), %edx #将%rbp寄存器偏移4个字节的值移动到%edx的内存地址位置  </span></span>
16<span class="line"><span>        movl    -8(%rbp), %eax #将%rbp寄存器偏移8个字节的值移动到%eax的内存地址位置  </span></span>
17<span class="line"><span>        addl    %edx, %eax #把两个寄存器的值相加  </span></span>
18<span class="line"><span>        popq    %rbp #rbq退出堆栈  </span></span>
19<span class="line"><span>        .cfi_def_cfa 7, 8 #在当前堆栈定义七号寄存器,8个字节的偏移量  </span></span>
20<span class="line"><span>        ret #函数返回指令  </span></span>
21<span class="line"><span>        .cfi_endproc #标记函数结束  </span></span>
22<span class="line"><span>.LFE0: #定义局部函数块结束  </span></span>
23<span class="line"><span>        .size   add_a_and_b, .-add_a_and_b #指定函数大小 首先定义符号为函数名,其次返回当前位置,那么就可以得到函数大小了  </span></span>
24<span class="line"><span>        .globl  main #声明全局变量 这里则是声明入口变量  </span></span>
25<span class="line"><span>        .type   main, @function #将main定义为函数  </span></span>
26<span class="line"><span>main:  </span></span>
27<span class="line"><span>.LFB1:#1号局部函数域  </span></span>
28<span class="line"><span>        .cfi_star tproc #声明堆栈开始  </span></span>
29<span class="line"><span>        pushq   %rbp #将寄存器%rbp压入堆栈中  </span></span>
30<span class="line"><span>        .cfi_def_cfa_offset 16 #定义堆栈大小为16个字节  </span></span>
31<span class="line"><span>        .cfi_offset 6, -16 #定义偏移量  </span></span>
32<span class="line"><span>        movq    %rsp, %rbp #同上  </span></span>
33<span class="line"><span>        .cfi_def_cfa_register 6 #注册6号寄存器至堆栈中  </span></span>
34<span class="line"><span>        movl    $3, %esi #将立即数3添加到%esi  </span></span>
35<span class="line"><span>        movl    $2, %edi #将立即数2添加到%edi中  </span></span>
36<span class="line"><span>        call    add_a_and_b #函数调用  </span></span>
37<span class="line"><span>        popq    %rbp #%rbp退出函数  </span></span>
38<span class="line"><span>        .cfi_def_cfa 7, 8 #定义7号寄存器,8个字节的偏移量  <
38/span></span>
39<span class="line"><span>        ret #函数变量  </span></span>
40<span class="line"><span>        .cfi_endproc #函数结束  </span></span>
41<span class="line"><span>.LFE1:#1号函数域结束  </span></span>
42<span class="line"><span>        .size   main, .-main #定义函数大小  </span></span>
43<span class="line"><span>        .ident  &quot;GCC: (Debian 10.2.1-6) 10.2.1 20210110&quot; #定义程序元信息  </span></span>
44<span class="line"><span>        .section        .note.GNU-stack,&quot;&quot;,@progbits #定义新的代码段或数据段</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>gpt解释:</p><blockquote><p>这段代码的大致结构是:</p><ol><li><p>定义文件信息(<code>.file</code> 和 <code>.ident</code>)</p></li><li><p>定义代码段(<code>.text</code>)</p></li><li><p>声明全局变量 <code>add_a_and_b</code> 为函数类型</p></li><li><p>定义函数 <code>add_a_and_b</code></p></li><li><p>定义局部函数块 <code>.LFB0</code></p></li><li><p>一系列汇编指令用于设置堆栈帧和执行函数的操作</p></li><li><p><code>.cfi_endproc</code> 标记函数结束</p></li><li><p>使用 <code>.size</code> 定义函数大小</p></li><li><p>声明全局变量 <code>main</code> 为函数类型</p></li><li><p>定义函数 <code>main</code></p></li><li><p>定义局部函数块 <code>.LFB1</code></p></li><li><p>一系列汇编指令用于设置堆栈帧、调用函数和执行函数的操作</p></li><li><p><code>.cfi_endproc</code> 标记函数结束</p></li><li><p>使用 <code>.size</code> 定义函数大小</p></li><li><p>定义程序元信息</p></li><li><p>定义新的代码段(<code>.note.GNU-stack</code>)</p></li></ol></blockquote><h3 id="根据上下文-第-34-行和第-35-行的代码针对立即数的作用如下" tabindex="-1"><a class="header-anchor" href="#根据上下文-第-34-行和第-35-行的代码针对立即数的作用如下"><span>根据上下文,第 34 行和第 35 行的代码针对立即数的作用如下:</span></a></h3><p>34 行:<code>movl $3, %esi</code> 这一行的作用是将立即数值 3 移动到寄存器 <code>%esi</code> 中。在 x86 汇编中,<code>$</code> 符号用于表示立即数(即直接的数值),这表示不是从内存中读取数据,而是直接将数值加载到寄存器。因此,<code>movl $3, %esi</code> 将数值 3 直接加载到 <code>%esi</code> 寄存器,这里可能表示一个参数或临时变量的赋值。</p><p>35 行:<code>movl $2, %edi</code> 这一行的作用是将立即数值 2 移动到寄存器 <code>%edi</code> 中。同样,<code>$</code> 符号表示立即数,这里将数值 2 直接加载到 <code>%edi</code> 寄存器,可能表示另一个参数或临时变量的赋值。 综合来看,这两行指令在上下文中可能是为了准备函数 <code>add_a_and_b</code> 的参数。它们将数值 3 和 2 分别加载到 <code>%esi</code> 和 <code>%edi</code> 寄存器,以便在后续的函数调用中使用。根据上下文,这可能是将这两个值传递给 <code>add_a_and_b</code> 函数进行计算。</p><h2 id="总结" tabindex="-1"><a class="header-anchor" href="#总结"><span>总结</span></a></h2><ol><li>定义文件信息和元信息。</li><li>
44定义代码段和全局变量。</li><li>定义函数 <code>add_a_and_b</code>: <ul><li>设置堆栈帧并保存寄存器。</li><li>计算两个参数之和。</li><li>恢复堆栈和寄存器状态。</li><li>返回结果。</li></ul></li><li>定义函数 <code>main</code>: <ul><li>设置堆栈帧并保存寄存器。</li><li>设置函数参数。</li><li>调用函数 <code>add_a_and_b</code>。</li><li>恢复堆栈和寄存器状态。</li><li>返回。</li></ul></li><li>结束程序。</li></ol>`,10)])])}const r=n(i,[["render",l]]),t=JSON.parse('{"path":"/posts/architecture/os/%E6%B1%87%E7%BC%96%E5%AD%A6%E4%B9%A0.html","title":"汇编","lang":"zh-CN","frontmatter":{"icon":"structure","date":"2024-01-03T00:00:00.000Z","category":["os"],"tags":["basis-design","assembly","os"],"lastUpdated":true,"sidebar":false,"editLink":false,"description":"汇编 流程 gpt解释: 这段代码的大致结构是: 定义文件信息(.file 和 .ident) 定义代码段(.text) 声明全局变量 add_a_and_b 为函数类型 定义函数 add_a_and_b 定义局部函数块 .LFB0 一系列汇编指令用于设置堆栈帧和执行函数的操作 .cfi_endproc 标记函数结束 使用 .size 定义函数大小 声...","head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"汇编\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2024-01-03T00:00:00.000Z\\",\\"dateModified\\":\\"2025-05-22T13:29:42.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Mr.Lexon\\",\\"url\\":\\"https://rookiesnotenet.top\\"}]}"],["meta",{"property":"og:url","content":"https://mister-hope.github.io/posts/architecture/os/%E6%B1%87%E7%BC%96%E5%AD%A6%E4%B9%A0.html"}],["meta",{"property":"og:site_name","content":"Lexon的网站"}],["meta",{"property":"og:title","content":"汇编"}],["meta",{"property":"og:description","content":"汇编 流程 gpt解释: 这段代码的大致结构是: 定义文件信息(.file 和 .ident) 定义代ç 
44æ®µï¼ˆ.text) 声明全局变量 add_a_and_b 为函数类型 定义函数 add_a_and_b 定义局部函数块 .LFB0 一系列汇编指令用于设置堆栈帧和执行函数的操作 .cfi_endproc 标记函数结束 使用 .size 定义函数大小 声..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2025-05-22T13:29:42.000Z"}],["meta",{"property":"article:tag","content":"os"}],["meta",{"property":"article:tag","content":"assembly"}],["meta",{"property":"article:tag","content":"basis-design"}],["meta",{"property":"article:published_time","content":"2024-01-03T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2025-05-22T13:29:42.000Z"}]]},"git":{"createdTime":1704346415000,"updatedTime":1747920582000,"contributors":[{"name":"Webnew-b","username":"Webnew-b","email":"[email protected]","commits":1,"url":"https://github.com/Webnew-b"},{"name":"Lexon","username":"Lexon","email":"[email protected]","commits":1,"url":"https://github.com/Lexon"}]},"readingTime":{"minutes":4.01,"words":1204},"filePathRelative":"posts/architecture/os/汇编学习.md","excerpt":"\\n<h2>流程</h2>\\n<div class=\\"language-unix-assembly line-numbers-mode\\" data-highlighter=\\"shiki\\" data-ext=\\"unix-assembly\\" style=\\"--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34\\"><pre class=\\"shiki shiki-themes one-light one-dark-pro vp-code\\"><code class=\\"language-unix-assembly\\"><span class=\\"line\\"><span>.file &nbsp; \\"example.c\\" #定义文件名称  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .text #定义文件类型  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .globl  add_a_and_b #定义变量名称为全局变量名称  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .type &nbsp; add_a_and_b, @function #定义类型为函数  </span></span>\\n<span class=\\"line\\"><span>add_a_and_b: #定义  </span></span>\\n<span class=\\"line\\"><span>.LFB0: #局部函数块的开始.lfb[x] 这里[x]指代的是区域编号  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_startproc #起始调用帧指令  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  pushq &nbsp; %rbp # pushq为指令 %rbp为寄存器 目的是将寄存器压入栈中  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_def_cfa_offset 16 #定义当前堆栈指针  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_offset 6, -16 #定义堆栈偏移量 目标是6号寄存器空间 -16是堆栈指针  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movq &nbsp;  %rsp, %rbp #将%rbq寄存器移动到%rsp中  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_def_cfa_register 6 #定义当前指针使用的寄存器 在这里6号寄存器指的是%rbp  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movl &nbsp;  %edi, -4(%rbp) #将%edi寄存器的值移动到%rbp偏移4个字节的内存地址位置  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movl &nbsp;  %esi, -8(%rbp) #将%esi寄存器的值移动到%rbp偏移8个字节的内存地址位置  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movl &nbsp;  -4(%rbp), %edx #将%rbp寄存器偏移4个字节的值移动到%edx的内存地址位置  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movl &nbsp;  -8(%rbp), %eax #将%rbp寄存器偏移8个字节的值移动到%eax的内存地址位置  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  addl &nbsp;  %edx, %eax #把两个寄存器的值相加  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  popq &nbsp;  %rbp #rbq退出堆栈  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_def_cfa 7, 8 #在当前堆栈定义七号寄存器,8个字节的偏移量  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  ret #函数返回指令  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_endproc #标记函数结束  </span></span>\\n<span class=\\"line\\"><span>.LFE0: #定义局部函数块结束  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .size &nbsp; add_a_and_b, .-add_a_and_b #指定函数大小 首先定义符号为函数名,其次返回当前位置,那么就可以得到函数大小了  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .globl  main #声明全局变量 这里则是声明入口变量  <
44/span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .type &nbsp; main, @function #将main定义为函数  </span></span>\\n<span class=\\"line\\"><span>main:  </span></span>\\n<span class=\\"line\\"><span>.LFB1:#1号局部函数域  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_star tproc #声明堆栈开始  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  pushq &nbsp; %rbp #将寄存器%rbp压入堆栈中  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_def_cfa_offset 16 #定义堆栈大小为16个字节  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_offset 6, -16 #定义偏移量  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movq &nbsp;  %rsp, %rbp #同上  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_def_cfa_register 6 #注册6号寄存器至堆栈中  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movl &nbsp;  $3, %esi #将立即数3添加到%esi  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  movl &nbsp;  $2, %edi #将立即数2添加到%edi中  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  call &nbsp;  add_a_and_b #函数调用  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  popq &nbsp;  %rbp #%rbp退出函数  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_def_cfa 7, 8 #定义7号寄存器,8个字节的偏移量  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  ret #函数变量  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .cfi_endproc #函数结束  </span></span>\\n<span class=\\"line\\"><span>.LFE1:#1号函数域结束  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .size &nbsp; main, .-main #定义函数大小  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .ident  \\"GCC: (Debian 10.2.1-6) 10.2.1 20210110\\" #定义程序元信息  </span></span>\\n<span class=\\"line\\"><span> &nbsp; &nbsp; &nbsp;  .section &nbsp; &nbsp; &nbsp;  .note.GNU-stack,\\"\\",@progbits #定义新的代码段或数据段</span></span></code></pre>\\n<div class=\\"line-numbers\\" aria-hidden=\\"true\\" style=\\"counter-reset:line-number 0\\"><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div><div class=\\"line-number\\"></div></div></div>","autoDesc":true}');export{r as comp,t as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.