Skip to content

Commit 4b933cf

Browse files
authored
Merge pull request #20 from zjyzh/zjy
add some annotation in ASMgenerator
2 parents 2d7877e + 1520ca7 commit 4b933cf

File tree

3 files changed

+114
-19
lines changed

3 files changed

+114
-19
lines changed

common/util/AsmCode.h

+43-8
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,44 @@
11
#ifndef ASMCODE_H
22
#define ASMCODE_H
33

4-
// Asm instructor
4+
// 首先介绍我们会经常看到的一些寄存器:
5+
// 4个数据寄存器(EAX、EBX、ECX和EDX)
6+
// 2个变址和指针寄存器(ESI和EDI)
7+
// 2个指针寄存器(ESP和EBP)
8+
// Eax可以存储的数字是DWORD(双字)
9+
// Eax用来保存所有API函数的返回值。
10+
11+
// 寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
12+
// 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
13+
// 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
14+
// 寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
15+
16+
// Asm instructor 各种各样的指令,转移、相加、push等等
517
#define ASM_MOV "mov"
618
#define ASM_ADD "add"
719
#define ASM_XOR "xor"
8-
#define ASM_NEG "neg"
20+
#define ASM_NEG "neg" //NEG是汇编指令中的求补指令,NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位取反后加1。
921
#define ASM_SUB "sub"
1022
#define ASM_MUL "mul"
1123
#define ASM_DIV "div"
1224
#define ASM_PUSH "push"
1325
#define ASM_POP "pop"
1426
#define ASM_CALL "call"
15-
#define ASM_RET "ret"
16-
#define ASM_CMP "cmp"
27+
#define ASM_RET "ret" // 返回指令
28+
#define ASM_CMP "cmp"
1729
#define ASM_ENTER "enter"
30+
// ENTER 指令为被调用过程自动创建堆栈帧。它为局部变量保留堆栈空间,把 EBP 入栈。具体来说,它执行三个操作:
31+
// 把 EBP 入栈 (push ebp)
32+
// 把 EBP 设置为堆栈帧的基址 (mov ebp, esp)
33+
// 为局部变量保留空间 (sub esp, numbytes)
34+
// ENTER 有两个操作数:第一个是常数,定义为局部变量保存的堆栈空间字节数;第二个定义了过程的词法嵌套级。
35+
// ENTER numbytes, nestinglevel
36+
// 这两个操作数都是立即数。Numbytes 总是向上舍入为 4 的倍数,以便 ESP 对齐双字边界。Nestinglevel 确定了从主调过程堆栈帧复制到当前帧的堆栈帧指针的个数。在示例程序中,nestinglevel 总是为 0。
1837
#define ASM_LEAVE "leave"
38+
// LEAVE 指令
39+
// LEAVE 指令结束一个过程的堆栈帧。它反转了之前的 ENTER 指令操作:恢复了过程被调用时 ESP 和 EBP 的值
1940

20-
// Jump instructor
41+
// Jump instructor 跳转指令,加条件判断等等等等
2142
#define ASM_JUMP "jmp"
2243
#define ASM_JE "je"
2344
#define ASM_JG "jg"
@@ -26,18 +47,32 @@
2647
#define ASM_JLE "jle"
2748
#define ASM_JNE "jne"
2849

29-
// 32-bit asm register
50+
// 32-bit asm register 32位asm寄存器
51+
// 2个重要的指针寄存器(ESP和EBP)
3052
#define ASM_EAX "eax"
3153
#define ASM_EBX "ebx"
3254
#define ASM_ECX "ecx"
3355
#define ASM_EDX "edx"
3456
#define ASM_EBP "ebp"
3557
#define ASM_ESP "esp"
58+
// 那么ESP和EBP指的分别是什么呢?
59+
60+
// (1)ESP:栈指针寄存器(extended stack pointer),
61+
// 其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
62+
// (2)EBP:基址指针寄存器(extended base pointer),
63+
// 其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
64+
65+
// 在这里要注意由于在intel系统中栈是向下生长的(栈越扩大其值越小,堆恰好相反)
66+
67+
// pop ebp;出栈 栈扩大4byte 因为ebp为32位
68+
69+
// push ebp;出栈,栈减少4byte
70+
3671

37-
// Date type
72+
// Date type 双字节字长?
3873
#define DOUBLE_WORD "dword"
3974

40-
// Other characters
75+
// Other characters
4176
#define ASM_LB "["
4277
#define ASM_RB "]"
4378
#define ASM_COMMA ","

0 commit comments

Comments
 (0)