6.汇编语言
汇编语言与机器指令一一对应。汇编语言编写的代码需要经过汇编转为机器代码,机器代码经过反汇编转为汇编代码。
汇编后的程序分为几个段:
_DATA:初始化的全局变量
_BSS:未初始化的全局变量
_TEST:汇编代码
栈
32位windows支持32位寻址,程序运行映射到4G内存地址空间。高位地址 0x7fffffff~0xffffffff 这2g由内核占用。低2g内存由用户程序使用。windows 为一个进程默认分配 1M的栈空间。栈空间由高地址向低地址空间生长。push后 sp的值减小,pop后sp的值增大。
点击查看代码
#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);
}
汇编如下:
int a = 123;
009B2265 mov dword ptr [a],7Bh
int b = 456;
009B226C mov dword ptr [b],1C8h
//声明的变量a,b需要通过 dword ptr 来操作。
int c = add(a,b);
009B2273 mov eax,dword ptr [b]
009B2276 push eax
009B2277 mov ecx,dword ptr [a]
009B227A push ecx //将两个变量值存入eax,ecx中并压栈
009B227B call add (09B1311h) //调用add函数,add就是一个地址
009B2280 add esp,8 //由被调用函数清理两个变量栈空间
009B2283 mov dword ptr [c],eax //把c的值变入eax中作为函数返回值
printf("%d", c);
009B2286 mov eax,dword ptr [c]
009B2289 push eax
009B228A push offset string "%d" (09B9B30h)
009B228F call _printf (09B1424h)
009B2294 add esp,8

浙公网安备 33010602011771号