我是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更改为%raxpush和popdecq调用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发布于 2015-10-16 15:44:46
如“Fifoernik”和“Jester”所作:
%eax更改为%raxpush和popdecq调用正如@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发布于 2015-10-16 14:57:45
这将帮助你:
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
rethttps://stackoverflow.com/questions/33173131
复制相似问题