当前位置: 技术问答>linux和unix
linux下编程中gcc编译提示“段错误”怎么办?
来源: 互联网 发布时间:2015-09-17
本文导语: 我在linux下面编以下程序: asm("movb $0x3fb,%dxnt" "mov $0x2b,%alnt" "out %al,%dx"); 编译通过了,但是执行的时候说“段错误”,我的目的是想用汇编语言控制8250控制器。请问是哪里出错了?谢谢!!!分不够...
我在linux下面编以下程序:
asm("movb $0x3fb,%dxnt"
"mov $0x2b,%alnt"
"out %al,%dx");
编译通过了,但是执行的时候说“段错误”,我的目的是想用汇编语言控制8250控制器。请问是哪里出错了?谢谢!!!分不够可以再给!
asm("movb $0x3fb,%dxnt"
"mov $0x2b,%alnt"
"out %al,%dx");
编译通过了,但是执行的时候说“段错误”,我的目的是想用汇编语言控制8250控制器。请问是哪里出错了?谢谢!!!分不够可以再给!
|
你为什么不用,inb,outb等C函数呢?
你上面的代码:
movb $0x3fb,%dxnt
为什么用movb?0x3fb端口号已经超过256,你应该用DX来缓存该地址,你做的是对的,
但用movb岂不是只移动了0xfb到dl吗?这样下面的out %al,%dx本身就不合法(小于256端口地址只能用立即数来表达,如:out %al,$0xfb; x86的死规定)。何况你现在想输出的端口号实际上是0x3fb。
你上面的代码:
movb $0x3fb,%dxnt
为什么用movb?0x3fb端口号已经超过256,你应该用DX来缓存该地址,你做的是对的,
但用movb岂不是只移动了0xfb到dl吗?这样下面的out %al,%dx本身就不合法(小于256端口地址只能用立即数来表达,如:out %al,$0xfb; x86的死规定)。何况你现在想输出的端口号实际上是0x3fb。
|
汇编不太太懂
不过用C函数inb,outb应该可以满足你的要求。
不过用C函数inb,outb应该可以满足你的要求。
|
提示段错误大多数是因为内存错误引起的,检查一下程序对内存的操作地方吧