int $0x80 段错误

《Linux C编程一站式学习》中第 18 章 x86汇编程序基础 1. 最简单的汇编程序

.section .data # 全局变量区
.section .text # 代码区
.global _start # _start要被链接器用到,在目标文件的符号表中是全局符号
_start:
movl $1, %eax # _exit系统调用号为1
movl $4, %ebx # ebx值传给_exit,表示退出状态
int $0x80

编译链接通过,运行时段错误

书中给出了习题

1、把本节例子中的int $0x80指令去掉,汇编、链接也能通过,但是执行的时候出现段错误,你能解释其原因吗?

而实际上,我这里不去掉int $0x80也是段错误。

 

带调试信息编译汇编程序

$ as --gstabs 111.s -o 111.o
$ ld 111.o -o 111.exe
$ gdb 111.exe
(gdb) start
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Temporary breakpoint 1 (main) pending.
Starting program: /cygdrive/c/18_x86_assembly/111.exe
[New Thread 5036.0x1f74]

Program received signal SIGSEGV, Segmentation fault.
start () at 111.s:32
32       int $0x80      # this wakes up the kernel to run

分析:

判断还是因为Windows系统下用MinGW或Cygwin的原因,没有真正的Linux kernel。

有待在虚拟机上测试一下。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值