nikezhi 发表于 2016-10-16 01:46:03

请问这短代码实现的功能

nikezhi 发表于 2016-10-16 01:57:56

好像是子程序调用。不知道这命令有没有bug

xieglt 发表于 2016-10-16 06:16:04

通常,高级语言的函数编译后的代码中,寄存器EBP是用来访问栈的。PUSH   EBP      MOVEBP,ESP   访问的是参数,访问的是临时变量。这段代码应该是调用一个函数,该函数的参数在EBP+12,EBP+16里,EBP+8是函数的地址

xieglt 发表于 2016-10-16 06:18:48

保存了返回地址,保存了原EBP

xieglt 发表于 2016-10-16 06:20:30

Ret12是调整堆栈返回,说明该函数有3个参数

nikezhi 发表于 2016-10-16 14:38:22

xieglt 发表于 2016-10-16 06:16
通常,高级语言的函数编译后的代码中,寄存器EBP是用来访问栈的。PUSH   EBP      MOVEBP,ESP   

恩,分析的很棒,但是程序一开始没有保存寄存器的值,这样调用后会不会出错

xieglt 发表于 2016-10-16 18:18:51

恩,应该是会出错的
完整的写法:

PUSHEBP
MOV   ESP,ESP
SUB    ESP,XXXX


ADD   ESP,XXXX ;这一句其实可以不要,不过高级语言编译后的函数通常都有这一句。
MOVESP,EBP
POP   EBP
RET   12

xieglt 发表于 2016-10-16 18:22:28

LEAVE 指令 即相当于

MOV   ESP,EBP
POP    ESP

nikezhi 发表于 2016-10-16 21:22:29

xieglt 发表于 2016-10-16 18:18
恩,应该是会出错的
完整的写法:



如果这些寄存器不小心改错了电脑会坏掉吗?

xieglt 发表于 2016-10-17 08:19:40

电脑不会坏掉,系统不会崩溃,但是你的程序会死掉。Windows是在保护模式下运行。系统在ring0下运行。你的程序在ring3下运行,破坏不了系统。

nikezhi 发表于 2016-10-19 14:25:29

xieglt 发表于 2016-10-17 08:19
电脑不会坏掉,系统不会崩溃,但是你的程序会死掉。Windows是在保护模式下运行。系统在ring0下运行。你的程 ...

只要电脑不会坏掉就好,程序死了可以复活{:5_109:}

Yvonne! 发表于 2016-10-21 22:40:01

xieglt 发表于 2016-10-16 18:18
恩,应该是会出错的
完整的写法:



学习了,谢谢分享!
页: [1]
查看完整版本: 请问这短代码实现的功能