能力值:
( LV8,RANK:120 )
|
-
-
2 楼
会不会是你的if语句的逻辑问题
或者你这样试验一下
fun()
{
if(……)
__asm{jmp no1}
else
__asm{jmp no2}
__asm
{
no1:jmp xxxxxx
no2:jmp xxxxxx
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
你好,我按照你的方式写了一段代码,能够正常跳入函数执行,不会出现蓝屏现象啊,只是在函数执行完后程序会奔溃,因为没有将eip压栈,我的环境是xp+vc6,
#include <stdio.h>
void A()
{
printf("A");
}
void B()
{
printf("B");
}
int main()
{
typedef void (*point)();
point a = A, b = B;
int i;
scanf("%d", &i);
if (0 == i)
{
__asm
{
jmp a;
}
}
if (1 == i)
{
__asm
{
jmp b;
}
}
}
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
你是LZ吗?我建议你从应用层开始学习汇编,不要从驱动里面学,蓝你没商量。
从这段内联写法,可以看出你对汇编的函数调用原理根本就没有理解。
另外LZ的那段代码,如果jmp到另外一段内联汇编,你必须保证寄存器的值是否正确,而一般来说这点你是无法保证的(没出错也只是环境巧合),所以一般不会有内联汇编从这段汇编jmp到不是同一段的其他汇编代码中。如果你需要跳转的目标位置与源位置在同一个函数中,可以使用goto,他会保证寄存器值的正确性,如果不在同一个函数,建议修改为函数调用。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
jmp只是跳转过去了而已,肯定不会将eip压栈,对于你在2L给出的那个程序别用jmp用call就是了,但是有必要么?直接调用就是了,没必要内联汇编。
顺便说一句,对于两个或更多的if语句最多只有一个能执行的这种情况,还是用else if吧,能减少一次比较和跳转。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我不是楼主,而且我的代码只是测试,上面的jmp a改成call a 就不会出现问题,而且我说了会奔溃,因为一些数据没有压栈。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
问题找到了 问题不在这里 后续指令关联寄存器的值的原因
|
|
|