jge这个判断语句在汇编指令里面是
JGE/JNL 大于或等于转移.
其实就是应对源码里面那个最小数是否大于最大数 如果大于就不跳了往下走
这条 00401079 . B8 00000000 mov eax,0x0
给eax赋值一个0然后走jmp
jmp是无条件跳转的意思,jmp是跳转到尾部返回0的
那么
我们就明白了 参数1是ebp+8 参数2是 ebp+c
这个是怎么看出来呢!我们在寄存器ebp的位置右击然后堆栈窗口跟随就可以看到我们的参数了
前面让大家看寄存器与堆栈的关系这里应该有点简略的理解了
点了之后堆栈下面会自动定位过来了,堆栈就在寄存器下面
我们双击栈顶就可以指定位置了。
我们是ebp堆栈窗口跟随过来所以这里的指针就是ebp+XX的
我们直接对着加+8右击一下选择修改就可以看到数值,分别是100和700 所以说易语言子程序中给定的参数他会加载到堆栈空间里面
我们知道参数来源之后就可以用它了继续往下看
00401083 > \51 push ecx
00401084 . 52 push edx
00401085 . 0F31 rdtsc
00401087 . B9 17000000 mov ecx,0x17
0040108C . F7E1 mul ecx
0040108E . 83C0 07 add eax,0x7
PUSH 把字压入堆栈. 就是把ecx的值压进栈中
下面也是同理 把edx的值压进栈中
RDTSC - 读取时间标签计数器 将处理器的时间标签计数器的当前值加载到 EDX:EAX 寄存器。
这个我看了其他汇编取随机数的源码 应该等价于我们的置随机数种子 因为易语言通过支持库取随机数也是需要置随机数种子
然后mov ecx,17不用说了吧 这个是给exc传输(赋值)17
MUL 无符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算), 结果返回给eax
add不用说了把,就是加法 操作数就是 eax,加7 最后保存在eax里面
00401091 . 8B4D 0C mov ecx,dword ptr ss:[ebp+0xC]
00401094 . 2B4D 08 sub ecx,dword ptr ss:[ebp+0x8]
00401097 . 41 inc ecx
00401098 . 33D2 xor edx,edx
这条前面第一条条就不说了把前面讲过了 就是就是读取ebp+c的值传输给ecx
这个sub是减法 操作数是 ecx的值跟ebp+8的值相减 结果保存在ecx里面
inc这个指令是加1的意思 操作数是ecx 功能是ecx本身的值加1
xor这个指令异或运算. 最后的结果保存在edx里面 操作数是edx
后面这几段一次性讲完吧!
0040109A . F7F1 div ecx
0040109C . 0355 08 add edx,dword ptr ss:[ebp+0x8]
0040109F . 8BC2 mov eax,edx
004010A1 . 5A pop edx
004010A2 . 59 pop ecx
004010A3 . C9 leave
004010A4 . C2 0800 retn 0x8
DIV 无符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).
add edx,dword ptr ss:[ebp+0x8] edx的值加ebp+8的值 返回给edx
最后把edx的值传送给eax 就是这段 0040109F . 8BC2 mov eax,edx
然后通过pop指令出栈 我们前面进栈现在要出栈了 (据说是为了堆栈平衡)
释放当前子程序在堆栈中的局部变量,使BP和SP恢复成最近一次的ENTER指令被执行前的值然后返回一个8回去
子程序返回eax的值 信息框读取eax的值显示出来
本文虽然内容短小,但是收获甚大,我们总结出以下知识点
一个子程序的参数或者变量都是在子程序被调用之后把他们的数据分别压入堆栈中
大家可以看这里
ebp+8参数1 (变量1) ebp+c 参数2 (变量2)以此类推下去 你明白了吗。
最后就是返回的解释了 我们看代码结尾是先把edx的值赋值给eax 然后出栈 平衡堆栈然后有一个返回,其实就是子程序把代码执行完毕了,然后把eax的值返回回去,因为我们的子程序是有返回值的
可以用信息框接收子程序的返回内容