我是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
发布于 2015-10-16 15:44:46
如“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
发布于 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
ret
https://stackoverflow.com/questions/33173131
复制相似问题