医生我觉得我可以再抢救一下 發表於 2022-4-1 15:06:00

6.汇编语言

<p>汇编语言与机器指令一一对应。汇编语言编写的代码需要经过汇编转为机器代码,机器代码经过反汇编转为汇编代码。</p>
<p>汇编后的程序分为几个段:<br>
_DATA:初始化的全局变量<br>
_BSS:未初始化的全局变量<br>
_TEST:汇编代码<br>
栈</p>
<p>32位windows支持32位寻址,程序运行映射到4G内存地址空间。高位地址 0x7fffffff~0xffffffff 这2g由内核占用。低2g内存由用户程序使用。windows 为一个进程默认分配 1M的栈空间。栈空间由高地址向低地址空间生长。push后 sp的值减小,pop后sp的值增大。</p>
<details>
<summary>点击查看代码</summary>
<pre><code>#include &lt;iostream&gt;
int add(int a, int b){
    return a + b;
}
int main(){
    int a = 123;
    int b = 456;
    int c = add(a,b);
    printf("%d", c);
}

</code></pre>
</details>
<pre><code>汇编如下:
    int a = 123;
009B2265mov         dword ptr ,7Bh
    int b = 456;
009B226Cmov         dword ptr ,1C8h
//声明的变量a,b需要通过 dword ptr 来操作。

    int c = add(a,b);
009B2273mov         eax,dword ptr
009B2276push      eax
009B2277mov         ecx,dword ptr
009B227Apush      ecx                //将两个变量值存入eax,ecx中并压栈

009B227Bcall      add (09B1311h)   //调用add函数,add就是一个地址
009B2280add         esp,8            //由被调用函数清理两个变量栈空间
009B2283mov         dword ptr ,eax//把c的值变入eax中作为函数返回值

    printf("%d", c);
009B2286mov         eax,dword ptr
009B2289push      eax
009B228Apush      offset string "%d" (09B9B30h)
009B228Fcall      _printf (09B1424h)
009B2294add         esp,8
</code></pre><br><br>
来源:https://www.cnblogs.com/computer-technique/p/16087061.html
頁: [1]
查看完整版本: 6.汇编语言