逆向工程汇编代码

Reverse engineering assembly code

我正在努力学习组装/倒车。例如,我正在努力寻找只有一个参数的 idiv 和 imul 的文档,并且还了解 sub/add 中哪个参数是第一个和最后一个。我得到了以下代码(根据我在评论中的理解)

start:
mov 24, %rax ; move int value 1024 to register rax
mov 96, %rbx ; move int value 4096 to register rbx
mov 48, %rcx ; move int value 2048 to rax rcx
xor %rdx, %rdx ; rcx XOR rcx. rcx = 0
sub %rcx, %rbx ; sucstract rcx from rbx? rbx = 2048?
cmp %rbx, %rax ; compare rbx to rax
jge loopa ; if rax > rbx, jump to loopa ? (false first time)
jmp loopb ; else jump to loopb
loopa: ; start loop a 
cmp , %rdx ; compare int value 4 to register rdx
jg end ; if rdx > 4 jump to end 
inc %rdx ; rdx++ (rdx = 1 first time)
loopb:
xchg %rax, %rbx ; (switch value of rax and rbx)
idiv %rbx ; signed divide, but divide on what? 
add %rdx, %rax ; add rdx to rax ?
imul %rcx ; (multiple what? )
jmp loopa ; jump to loopa
end:

这是 x86 程序集的特定方言吗?我搜索了说明,发现它们有所不同。在参数、语法等方面。

可能打错了,但无论如何我想让你注意到:在这一行 jge loopa ; if rax > rbxjge表示如果大于或等于则跳转,所以if rax >= rbx。请记住,每个 AT&T(是的,它是英特尔语法的一种方言)指令都有这种模式:指令源,目标。因此,对于算术或比较指令,您必须从第二个操作数开始 "thinking"。

关于idivimul说明,你应该阅读this