我正在学习AT& T汇编程序的基础知识,我遇到了问题。当开始简单的算术运算时,我有错误:分段错误。
我的工作环境是Linux 32位。 问题出在启动时,编译后......
我在哪里犯错?
.globl _start
.section .text
_start:
mov $4, %AX
mov $3, %BX
sub %AX, %BX
int $0x80
答案 0 :(得分:1)
您没有进行简单算术,至少您明确使用了系统调用。
如果这些行都是您的代码,那么导致段错误的问题本身并不存在,它是>那些行后的空代码。
请参阅here linux 32bit的系统调用列表。当%eax
为4时,呼叫为write
。所以用C语言写的,你正在调用
// write(unsigned int fd, const char * buf, size_t count);
write(0xffff, 0, 0);
在int 0x80
之前,您的注册表为%ebx=0xffff
,%ecx=0
,%edx=0
。此调用将返回错误,但不会导致段错误,因为0xffff
不是有效的文件描述符。
然后系统调用返回,程序恢复执行。此后没有计划代码,但CPU仍会执行此内存点之后的内容,通常只有很多零,这些垃圾执行会导致段错误。
如果希望程序集程序正常终止,则需要显式调用另一个系统调用sys_exit
。为了更好地理解您的简单装配程序,请使用gdb逐步查看其效果。