我是AT& T程序集的新手,我正在学习使用减量运算符decl
来创建一个打印Hello world!
5次的程序。
以下是代码:
.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
答案 0 :(得分:2)
这将对您有所帮助:
call _puts
保留%rax。所以push
和pop
。call _puts
保留标志。请将decq %rax
放在jnz loop
之前。这是循环:
loop:
leaq hello(%rip), %rdi
pushq %rax
call _puts
popq %rax
decq %rax
jnz loop
RET
将建议添加到call loop
:
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
movl $5, %rax
CALL loop
movl $0, %rax
leave
ret
答案 1 :(得分:0)
由@Fifoernik和@Jester提供:
%eax
更改为%rax
push
和pop
decq
来电由@rhkb提供,最后一块拼图:
leave
和ret
插入loop
共:
.data
hello:
.asciz "Hello world!"
.text
loop:
leaq hello(%rip), %rdi
pushq %rax
call _puts
popq %rax
decq %rax
jnz loop
movq $0, %rax
leave
ret
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
movq $5, %rax
jmp loop