《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。
有待在虚拟机上测试一下。