SS的基地址要等于DS的基地址.
举例说明为何要这样.
这是一循环C代码:
while(i!=100)
{
demo_function()
i++;
}
对应的汇编代码:
lea eax,dword ptr[ebp+10]
inc dword ptr [eax]
cmp dword ptr[ebp+10],100
je end_loop
call demo_function
jmp loop_again
下面,来解释为什么SS的基地址要等于DS的基地址.
第一句:lea eax,dword ptr[ebp+10]是将ebp+10付给eax,注意是堆栈的偏移地址付给eax.
第二句:inc dword ptr [eax],是让eax所指向的地方加一;问题就出在这里!本语句使用的基地址是DS的,然而,eax(经付值后)是一个指向堆栈的指针,也就是说,eax是一个以SS的基地址为偏移地址的指针,因此,inc dword ptr [eax]并没有修改 ebp+10所指向的地方.因此这段代码将是个死循环.
解决的方法就是让ss.base=ds.base,顺便说一下,eax,ebx,ecx,edx,esi,edi的默认基地址是DS的,EBP,ESP就是SS的了.
举例说明为何要这样.
这是一循环C代码:
while(i!=100)
{
demo_function()
i++;
}
对应的汇编代码:
lea eax,dword ptr[ebp+10]
inc dword ptr [eax]
cmp dword ptr[ebp+10],100
je end_loop
call demo_function
jmp loop_again
下面,来解释为什么SS的基地址要等于DS的基地址.
第一句:lea eax,dword ptr[ebp+10]是将ebp+10付给eax,注意是堆栈的偏移地址付给eax.
第二句:inc dword ptr [eax],是让eax所指向的地方加一;问题就出在这里!本语句使用的基地址是DS的,然而,eax(经付值后)是一个指向堆栈的指针,也就是说,eax是一个以SS的基地址为偏移地址的指针,因此,inc dword ptr [eax]并没有修改 ebp+10所指向的地方.因此这段代码将是个死循环.
解决的方法就是让ss.base=ds.base,顺便说一下,eax,ebx,ecx,edx,esi,edi的默认基地址是DS的,EBP,ESP就是SS的了.