中易网

linux汇编,ld toupper.o -lc -dynamic-linker /lib/ld-linux.so.2 执行a.out出现memory fault 求教大神

答案:1  悬赏:80  
解决时间 2021-01-12 20:55
  • 提问者网友:十年饮冰
  • 2021-01-12 02:09
linux汇编,ld toupper.o -lc -dynamic-linker /lib/ld-linux.so.2 执行a.out出现memory fault 求教大神
最佳答案
  • 二级知识专家网友:拜訪者
  • 2021-01-12 03:25
你机器是64位cpu吧,你按32位汇编教材上的例子,

64位机器上直接跑一旦涉及到内存地址必然会报段错误的。

64位机器上函数调用方法也和32位不同了,即使不扯到内存地址,

你的程序也没法达到目的的。
追问:我用的是虚拟机装的suse 11,32位系统。其它测试程序将数据放入lcomm的buffer都好使,这个死活不好使了,我核对过好多遍程序,觉得没问题。所以不知道怎么办了。但是在continue_read_loop:后直接call printf,能将文件中的内容输出到屏幕,而且可以将hey.s文件里的小写字母转成大写写入hey文件。我实在不懂了。
追答:那就用GDB调试一下呗,跑下单步一下就知道哪出问题了
追问:试了,next跑不下去呀。stepi也不行。报program is not runing。设置breakpoint,跑到fgets就中断了。但是去掉convert_to_upper函数,就可以将文件读出来写入到指定文件里。
追答:从原书PDF下扒下来了原代码,你试试看吧,我这环境都是64位的一时半会也调不了32位代码。


用diffuse对比了一下你的代码和原书代码,发现根本没啥区别,就是一个文件IO方法不同。

追问:恩人,我调试好了。调用fgets后,按照调用原则,会将fgets读取的字节数放入eax中,但是eax的值非常大,所以调用convert转换会溢出。在convert函数中加个\0的判断就可以。但是问题又来了,fgets怎么会返回给eax那么大的值呢?用c和c++也不这样呀。
追答:看下手册fgets是返回的字符指针,就应该是个挺大的值。

你的代码照搬原书的例子,原书是调用的read系统调用,eax确实是返回的读取字节数。

但是换成fgets就不对了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息