x86汇编比较运算符

时间:2016-11-11 01:33:36

标签: c assembly switch-statement x86-64 reverse-engineering

我是学习集会的新手。我有一个任务,将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

0 个答案:

没有答案