我是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