2017-08-25 77 views
-3

我正在学习装配/倒车。例如,我只用一个参数来查找idiv和imul的文档,同时也明白哪个参数是第一个和最后一个是在sub/add中。我已被给予以下代码(与我的理解在评论)逆向工程汇编代码

start: 
mov $1024, %rax ; move int value 1024 to register rax 
mov $4096, %rbx ; move int value 4096 to register rbx 
mov $2048, %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 $4, %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汇编方言吗?我已经寻找指示,我发现他们有所不同。无论在参数,语法等。

+7

这是[at&t语法](https://sourceware.org/binutils/docs/as/i386_002dVariations.html)。至于idiv和imul,它们当然在[官方英特尔指令集参考手册]中以极小的细节描述(https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm -vol-2abcd.pdf)和各种[互联网上的副本](http://x86.renejeschke.de/)。 – Jester

+1

'IDIV'就像'DIV'一样工作(除了将参数视为有符号)。股息预计在'AX' /'DX:AX' /'EDX:EAX'。 http://www.felixcloutier.com/x86/IDIV.html – Thilo

+0

这是一种不完整的AT&T语法,说明可能有大小后缀,即'cmpq%rbx,%rax',因为它与'qword'类型的寄存器一起工作,或者'cmpb%bl,%al',如果它只使用字节类型的话,如果你不知道AT&T语法是否存在,并且有人会告诉你这样的x86程序集,这又是另一个混​​乱的来源......(通常我建议而是学习+使用英特尔语法,如果您可以自由选择) – Ped7g

回答

2

可能是输入错误,但我想让你注意无论如何:在这行 jge loopa ; if rax > rbxjge意味着如果跳大或等于,所以if rax >= rbx。请记住,每个AT指令(是的,这是intel语法的一种方言)指令都有这种模式:指令源,目标地址为。因此,对于算术或比较指令,您必须从第二个操作数开始“思考”。

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