我是AT & T汇编的新手,我正在学习使用递减运算符decl
创建一个打印Hello world!
5次的程序。%eax不会递减? (ATT汇编)
下面的代码:
.data
hello:
.ascii "Hello world!"
.text
loop:
decl %eax
leaq hello(%rip), %rdi
call _puts
jnz loop
leave
ret
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
movl $5, %eax
jmp loop
movl $0, %eax
leave
ret
然而,程序打印Hello world!
无限期虽然它没有错误编译,怎么了?
编辑
的建议后:
- 变化从
%eax
到%rax
- 添加
push
和pop
- 重新排序
decq
呼叫 call
loop
代替jmp
这里是生成的代码:
.data
hello:
.asciz "Hello world!"
.text
loop:
leaq hello(%rip), %rdi
pushq %rax
call _puts
popq %rax
decq %rax
jnz loop
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
movq $5, %rax
call loop
movq $0, %rax
leave
ret
按照常规调用约定,eax不会被'call _puts'保留。你可以用'push eax'和'pop eax'来包围你的'call'。你也应该使用'.asciz'或'.string'来让你的字符串零终止。 – Jester
@Jester 好了,这里是(用于\ n#)新一:# pushl%eax中# 呼叫_puts# popl等EAX%# # 但它返回一个错误: hello.s :45:9:错误:指令需要:不64位模式 推%eax中 ^ hello.s:47:9:错误:指令需要:不64位模式 弹出%eax中 ^ –
哦对不起,它是64位。然后使用'%rax'。 – Jester