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 <iostream>
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]