首页
社区
课程
招聘
内联汇编求助
发表于: 2010-11-14 22:33 4210

内联汇编求助

2010-11-14 22:33
4210
我的驱动里写了一个函数来做判断
形如:
function()
{
if()
{
   __asm
   {
    jmp xxxx
   }
}

if()
{
   __asm
   {
    jmp xxxx
   }
}
}
这里遇上了问题,上面两个if判断,如果任意其中一个都是没问题的
但是如果同时把两个if(){_asm{jmp xxxx}}写在函数里就蓝屏了
我试着同时写2个if 然后只在任意其中一个if中内联汇编,另一个if里什么都没写,这样就没问题
求解

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 439
活跃值: (1284)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
会不会是你的if语句的逻辑问题
或者你这样试验一下

fun()
{
    if(……)
        __asm{jmp no1}
    else
        __asm{jmp no2}
__asm
{
no1:jmp xxxxxx
no2:jmp xxxxxx
}
}
2010-11-14 22:52
0
雪    币: 64
活跃值: (10)
能力值: ( 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;
		}
	}
}

2010-11-14 23:19
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
你是LZ吗?我建议你从应用层开始学习汇编,不要从驱动里面学,蓝你没商量。
从这段内联写法,可以看出你对汇编的函数调用原理根本就没有理解。
另外LZ的那段代码,如果jmp到另外一段内联汇编,你必须保证寄存器的值是否正确,而一般来说这点你是无法保证的(没出错也只是环境巧合),所以一般不会有内联汇编从这段汇编jmp到不是同一段的其他汇编代码中。如果你需要跳转的目标位置与源位置在同一个函数中,可以使用goto,他会保证寄存器值的正确性,如果不在同一个函数,建议修改为函数调用。
2010-11-15 09:46
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
jmp只是跳转过去了而已,肯定不会将eip压栈,对于你在2L给出的那个程序别用jmp用call就是了,但是有必要么?直接调用就是了,没必要内联汇编。

顺便说一句,对于两个或更多的if语句最多只有一个能执行的这种情况,还是用else if吧,能减少一次比较和跳转。
2010-11-15 10:56
0
雪    币: 64
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我不是楼主,而且我的代码只是测试,上面的jmp a改成call a 就不会出现问题,而且我说了会奔溃,因为一些数据没有压栈。
2010-11-15 11:22
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
问题找到了 问题不在这里 后续指令关联寄存器的值的原因
2010-11-16 08:29
0
游客
登录 | 注册 方可回帖
返回
//