帮我看一下semget的汇编代码 欢迎讨论 圣诞快乐
我用gdb反汇编semget
得到如下结果:
0x80485d0 <semget>: jmp *0x804a1c4
0x80485d6 <semget+6>: push $0x58
0x80485db <semget+11>: jmp 0x8048510 <_init+24>
第一个jmp后那个地址加*号有什么含义?
问题点数:88、回复次数:9Top
1 楼bnwxf(有一种感觉叫从容)回复于 2002-12-18 20:06:49 得分 0
自己来upTop
2 楼ahalf(ahalf)回复于 2002-12-19 15:18:54 得分 0
指针Top
3 楼bnwxf(有一种感觉叫从容)回复于 2002-12-19 21:41:21 得分 0
to ahalf:
老兄,我上一个贴子(esp多跳一段距离的那个),你就这么言简意赅的来了一句[这叫标准帧],这次能不能说的详细点?
我跟踪过了,jmp *0x804a1c4,*号是用来表示间址的。
等有时间了,我把整个sys_semget的反汇编代码贴出来。请大家讨论。
Top
4 楼ahalf(ahalf)回复于 2002-12-23 08:58:54 得分 0
上一个我已经回你了
这个我不懂Top
5 楼ahalf(ahalf)回复于 2002-12-23 09:01:50 得分 20
我的理解是,这是一个带符号表的程序,可能是说明目的地址的产生方式
如果是发行程序,反汇编结果没有任何指示Top
6 楼bnwxf(有一种感觉叫从容)回复于 2002-12-23 11:17:13 得分 0
to ahalf:
言词不当之处,请老兄不要介意。
看来兄台对汇编很熟,我用gdb反汇编,的确见到一个_GLOBAL_OFFSET_TABLE。程序是用gcc编译出来的,我指定了-g选项。
其实我的主要目的是想知道semget到底作了些什么--我只找到了sys_semget的源代码,没有semget这个库函数的代码。所以一直不清楚当指定sem_num为零时,semget到底干了些什么。
再次感谢你对上一个问题的赐教。
p.s.:
ahalf兄是如何学汇编的,能不能给兄弟推荐一本好的汇编教材?
我在学校里学过清华出的那本汇编,好像没有我这两个问题相关的内容。
明天结贴。
Top
7 楼DoItFreely(Freely)回复于 2002-12-23 11:29:56 得分 10
0x80485d0 <semget>: jmp *0x804a1c4
0x80485d6 <semget+6>: push $0x58
0x80485db <semget+11>: jmp 0x8048510 <_init+24>
有些汇编语言的语法跟masm/tasm不相同,*0x804a1c4估计跟[0x804a1c4]同义,而push $0x508,就是立即数操作,即push 0x508,jmp 0x8048510 <_init+24>不怎么懂,好象是jmp 0x8048510,而该地址在模块/函数_init偏移量0x24的地方Top
8 楼970361(是猫就应该抓老鼠)回复于 2002-12-23 13:20:30 得分 58
如果不知道semget是干什么用的话请查看帮助
bash>man semget
这是一个和信号有关的函数,具体是干什么的你可以仔细阅读。semget本身不是 一个系统调用,
0x804a1c4存放的应该是个函数的入口地址,可能是一个系统调用的吧。
在内核中很多系统调用是用一个符号表来保存函数的入口地址的,所以会在地址前加上一个* 0x804a1c4。符号表就是c语言中的指正数组数组里存放的是函数的入口地址
Top
9 楼bnwxf(有一种感觉叫从容)回复于 2002-12-24 23:55:41 得分 0
to 970361:
多谢在此援手。
其实兄弟也是在unix/linux下混饭吃,只是有些问题从c语言的级别想不清楚,
就来汇编这里来请教请教。
从这段代码看来,semget这个库函数只是作一次承上启下的工作,那所有的奥妙
全在sys_semget上了。
结贴了,请各位笑纳。Top




