我刚刚写了下面的代码来计算2 ^ 3 + 2 ^ 5的魔法和。我有一些问题。
1.在x86_64调用约定中,参数在寄存器%rdi,%rsi,%rdx,%rcx,%r8和%r9中传递。但是,当我试图在%rdi中调用exit值时,编译它然后echo $?
它给我的值为0.如果我将值转移到%rbx,如下所示它给我正确的结果。
2.最初我的代码在文件末尾以标签exit:
退出,我做了jmp exit
而不是_start中的最后三行。这给了我一个分段错误。为什么呢?
3.从命令行获取基础和电源需要做什么? argv在哪里?
.data
.globl _start
_start:
movq $2, %rdi
movq $3, %rsi
call power
pushq %rax
movq $2, %rdi
movq $5, %rsi
call power
popq %rdi
addq %rax, %rdi
movq $1, %rax
movq %rdi, %rbx
int $0x80
power:
pushq %rbp
movq %rsp, %rbp
movq %rsi, %rcx
decq %rcx
subq $8, %rsp
movq %rdi, -8(%rbp)
loop_power:
movq -8(%rbp), %rax
imulq %rdi, %rax
movq %rax, -8(%rbp)
loop loop_power
exit_power:
movq -8(%rbp), %rax
movq %rbp, %rsp
popq %rbp
retq
更新
.data
.text
.globl _start
_start:
movq $2, %rdi
movq $3, %rsi
call power
pushq %rax
movq $2, %rdi
movq $5, %rsi
call power
popq %rdi
addq %rax, %rdi
jmp exit
power:
pushq %rbp
movq %rsp, %rbp
movq %rsi, %rcx
decq %rcx
subq $8, %rsp
movq %rdi, -8(%rbp)
loop_power:
movq -8(%rbp), %rax
imulq %rdi, %rax
movq %rax, -8(%rbp)
loop loop_power
exit_power:
movq -8(%rbp), %rax
movq %rbp, %rsp
popq %rbp
retq
exit:
movq $60, %rax
syscall