cygwin中不能int 0x80吗?
偶尝试在Cygwin下写汇编,好像不行~
代码(test.s):
.section .data
output:
.ascii "This is a sample outputn"
.section .text
.globl start
_start:
#exit(0)
movl $1, %eax
movl $0, %ebx
int $0x80
as -o test.o test.s
ld -o test test.o
编译后执行./test出现异常,不知为何,请达人指点一二,感激不尽~
[ 本帖最后由 hlinzhou 于 2006-10-20 19:28 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
更多
发布评论
评论(4)
这想这样应该是绕过了cygwin层
当然崩溃。这个中断是让显卡输出的,不是在 win32 的 csrss (控制台的子系统)中输出,两个是不同的概念,呵呵
win32/nt 上,又转换至对 ntoskrnl 的调用。
你用 write(1,"Hello, world.n",15) 看看?
另外,软中断应该在内核空间吧,怎么跑到用户空间代码里了?你是在精简代码,对么?
[ 本帖最后由 langue 于 2006-10-20 21:05 编辑 ]
偶在Win下反汇编看下……汗……
00401000 > $ B8 01000000 mov eax, 1
00401005 . BB 00000000 mov ebx, 0
0040100A . CD 80 int 80
newlib不会用……redhat上那个即使make过了,偶也不一定有能力把它用到汇编里去……
还是用俺那个可怜的Bochs吧……
P.S.
不过gcc编译的结果满怪的,生成的exe无比复杂,没有直接int 80,而是调用了N多的cygwin1.dll的函数,可惜也崩溃了……
俄,这个中断的后果……
呵呵,Cygwin 最终还是遵从 win32 的,所以这个 int 0x80 绝对不会打印到 “屏幕” 上去……并且,后果也是可观的。
另外,Cygwin,所以还是用 newlib 的库函数吧。
BTW,newlib 是被 Cygwin 用来提供 C 接口的库。