AT& T asembler中的简单算术运算和分段故障

时间:2018-01-28 20:38:43

标签: assembly att

我正在学习AT& T汇编程序的基础知识,我遇到了问题。当开始简单的算术运算时,我有错误:分段错误。

我的工作环境是Linux 32位。 问题出在启动时,编译后......

我在哪里犯错?

.globl _start
        .section .text
        _start:

mov $4, %AX
mov $3, %BX
sub %AX, %BX
int $0x80

1 个答案:

答案 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逐步查看其效果。