我是学习集会的新手。我有一个任务,将switch语句反向工程为C.我有点卡在这一部分对我来说,似乎是有条件的。变量n传递给rsi。我的问题是,当操作n-50完成时,该值是否保留在rsi中直接用于比较操作?还是rsi得到重置? **注意.L7是跳转表的开头。
subq $50, %rsi
cmpq $5, %rsi
ja .L2
jmp *.L7(,%rsi,8)
//jump table
L7:
.quad .L3
.quad .L2
.quad .L3
.quad .L4
.quad .L5
.quad .L6
.text
我的C代码应该是这样的吗?
result = n - 50;
if result == 5
GOTO .L2
else
GOTO .L7
或者因为.ja意味着跳跃,如果超过,应该是
result = n - 50;
if result > 5
GOTO .L2
else
GOTO .L7
这是完整的汇编代码
.file "switch_prob-soln.c"
.text
.globl switch_prob
.type switch_prob, @function
switch_prob:
.LFB0:
.cfi_startproc
subq $50, %rsi
cmpq $5, %rsi
ja .L2
jmp *.L7(,%rsi,8)
.section .rodata
.align 8
.align 4
.L7:
.quad .L3
.quad .L2
.quad .L3
.quad .L4
.quad .L5
.quad .L6
.text
.L3:
leaq 0(,%rdi,4), %rax
ret
.L4:
movq %rdi, %rax
sarq $2, %rax
ret
.L5:
leaq (%rdi,%rdi,2), %rdi
.L6:
imulq %rdi, %rdi
.L2:
leaq 10(%rdi), %rax
ret
.cfi_endproc
.LFE0:
.size switch_prob, .-switch_prob