【发布时间】:2012-09-26 15:06:54
【问题描述】:
我正在学习 AT&T x86 汇编语言。我正在尝试编写一个采用整数 n 的汇编程序,然后返回结果 (n/2+n/3+n/4)。这是我所做的:
.text
.global _start
_start:
pushl $24
call profit
movl %eax, %ebx
movl $1, %eax
int $0x80
profit:
popl %ebx
popl %eax
mov $0, %esi
movl $4, %ebp
div %ebp
addl %eax, %esi
movl %ecx, %eax
movl $3, %ebp
div %ebp
addl %eax, %esi
movl %ecx, %eax
movl $2, %ebp
div %ebp
addl %eax, %esi
movl %esi, %eax
cmpl %ecx, %esi
jg end
pushl %ebx
ret
end:
mov %ecx, %eax
ret
问题是我遇到了分段错误。问题出在哪里?
【问题讨论】:
-
您是否尝试使用调试器单步执行代码以查看发生了什么?
-
AT&T 分支到处理器? (-:
-
tripleee:“AT&T 语法”指的是上面的汇编语法,最初用于 SysV Unix。它将操作数大小作为后缀放在指令中,使用“%”标记寄存器名称,并将目标寄存器放在列表的末尾。它是 linux 上的 GNU 汇编器支持的语法。它与 PC 行业更常用的“Intel”语法完全不同。
-
如果您要学习英特尔汇编语言,请使用英特尔语法。在一个体面的世界里,你称之为 AT&T 语法的可憎行为永远不会存在。