.text:0000000000401550 ; =============== S U B R O U T I N E =======================================
.text:0000000000401550
.text:0000000000401550 ; Attributes: bp-based frame
.text:0000000000401550
.text:0000000000401550 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:0000000000401550 public main
.text:0000000000401550 main proc near ; CODE XREF: __tmainCRTStartup+242↑p
.text:0000000000401550 ; DATA XREF: .pdata:000000000040506C↓o
.text:0000000000401550
.text:0000000000401550 var_8 = dword ptr -8
.text:0000000000401550 var_4 = dword ptr -4
.text:0000000000401550
.text:0000000000401550 push rbp
.text:0000000000401551 mov rbp, rsp
.text:0000000000401554 sub rsp, 30h
.text:0000000000401558 call __main
.text:000000000040155D mov [rbp+var_8], 0
.text:0000000000401564 mov [rbp+var_4], 1
.text:000000000040156B jmp short loc_401577
.text:000000000040156D ; ---------------------------------------------------------------------------
.text:000000000040156D
.text:000000000040156D loc_40156D: ; CODE XREF: main+2B↓j
.text:000000000040156D mov eax, [rbp+var_4]
.text:0000000000401570 add [rbp+var_8], eax
.text:0000000000401573 add [rbp+var_4], 1
.text:0000000000401577
.text:0000000000401577 loc_401577: ; CODE XREF: main+1B↑j
.text:0000000000401577 cmp [rbp+var_4], 64h ; 'd'
.text:000000000040157B jle short loc_40156D
.text:000000000040157D mov eax, [rbp+var_8]
.text:0000000000401580 mov edx, eax
.text:0000000000401582 lea rcx, Format ; "a=%d\n"
.text:0000000000401589 call printf
.text:000000000040158E mov eax, 0
.text:0000000000401593 add rsp, 30h
.text:0000000000401597 pop rbp
.text:0000000000401598 retn
.text:0000000000401598 main endp
.text:0000000000401598
.text:0000000000401598 ; ---------------------------------------------------------------------------
var_8= dword ptr -8
var_4= dword ptr -4
这部分是.data的数据段部分:
1、
- var_8、var_4符号名称,相当于变量。
- “=”:等号伪指令(equal-sign directive)把一个符号名称与一个整数表达式连接起来
2、dword 是标准汇编数据类型,代表着双字的意思。
3、ptr 运算符可以用来重写一个已经被声明过的操作数的大小类型。ptr 必须与一个标准汇编数据类型一起使用。只要试图用不同于汇编器设定的大小属性来访问操作数,那么这个运算符就是必需的。
4、-8、-4 这些是整数常量
.data myDouble DWORD 12345678h
.code mov ax,myDouble
push rbp
mov rbp, rsp
sub rsp, 30h
call __main
mov [rbp+var_8], 0
mov [rbp+var_4], 1
jmp short loc_401577
这一段是代码块部分:
汇编指令:
- push
push(压栈) 指令首先减少 ESP 的值,再将源操作数复制到堆栈。 - mov
mov 指令将源操作数复制到目的操作数。 - sub
sub 指令从目的操作数中减去源操作数。sub dest, source
- call
call 指令调用一个过程,指挥处理器从新的内存地址开始执行。过程使用 RET(从过程返回)指令将处理器转回到该过程被调用的程序点上。 - jmp
jmp 指令无条件跳转到目标地址
栈寄存器:
- rsp
ESP是堆栈指针寄存器。运行时堆栈是内存数组,CPU 用 ESP(扩展堆栈指针,extended stack pointer)寄存器对其进行直接管理,该寄存器被称为堆栈指针寄存器(stack pointer register)。
- rbp
EBP是基址指针寄存器