【发布时间】:2021-08-04 20:27:35
【问题描述】:
我是汇编新手,正在尝试一次打印一个字符串的一个字符,目前为止。
.equ STDOUT,1
.equ WRITE,4
.equ EXIT,1
char_string:
.asciz "hello, world"
.text
.globl _start
_start:
movl $char_string, %eax
call print_str
movl $EXIT, %eax
int $0X80
print_str:
mov (%eax), %ebx
movl $WRITE, %eax
movl $STDOUT, %ebx
movl $char_string, %ecx
movl $1, %edx
int $0x80
inc %eax
cmpl $0, %ebx
jne print_str
je out_of_loop
out_of_loop:
ret
但是,当我尝试编译时,我在该行遇到了分段错误
move (%eax), %ebx
这有什么问题?我该如何解决?我试图将字符串的指向字符移动到 %ebx 以进行打印,然后我增加 eax 以移动到字符串中的下一个字符。
【问题讨论】:
-
write系统调用需要一个指针。所以mov (%eax), %ebx第一次就错了,它只是没有崩溃。eax被用作返回值,所以这就是为什么它会被破坏并导致第二次崩溃。 -
所以我应该使用 [eax] 而不是 (%eax) 吗?
-
啊,我明白你想做什么了。
[eax]是 intel 语法,你不能使用它,你还是会覆盖ebx。