内存调试初步

汇编语言

  用汇编语言翻译机器语言,对人类更友好。要理解汇编语言,需要知道寄存器、基本指令、中断等基础知识。由于汇编语言偏向底层,所以不同的系统上汇编语言是不一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 用汇编语言实现对话框弹出helloworld


extern MessageBoxA // 引入MessageBox

//代码段
section .text
golbal main

main:
push dword 0
push dword title
push dword text
push dword 0 // 传递四个参数
call MessageBoxA //调用MessageBoxA
ret //返回



//数据段
section .data
text: db 'Hello World',0
title: db 'MessageBox',0

常见寄存器

  • 通用寄存器:
    • 数据寄存器:EAX、EBX、ECX、EDX
    • 变址寄存器:ESI、EDI
    • 指针寄存器:ESP、EBP
  • 段寄存器:CS、DS、ES、SS、GS
  • 指令寄存器:EIP
  • 标志寄存器:CF、PF、AF、ZF、SF、OF

常见基本语句

  • 基本运算:INC(加法)、ADD(加法)、DEC(减法)、SUB(减法)、mul(乘法)、div(除法)
  • 循环、跳转:loop(循环)、call(函数调用)、jmp(跳转)、ret(返回)
  • 数据移动:mov、lea
  • 栈操作:PUSH、POP
  • 逻辑运算:AND、OR、XOR(异或)、NOT
  • 比较运算:cmp、test

中断

  汇编语言需要和底层打交道,这里就需要有中断机制

  • 内中断:和cpu直接交互
  • int指令
  • 端口:对应硬件设备的交互
  • 外中断:来自外设的中断

  

从汇编看函数栈

  在编程语言中函数是以栈结构来设计的,先调用的函数后返回。

1
2
3
4
5
6
7
8
9
10
11
12
void firstCall(int x, int y)
{
int z = x + y;
int a = 1;
}

int main()
{
firstCall(1, 2);
return 0;
}