2017-08-25 2 views
-3

J'essaie d'apprendre l'assemblage/l'inversion. Je me bats pour trouver de la documentation pour idiv et imul avec un seul argument par exemple, et je comprends aussi pour quel argument est premier et dernier dans sub/add. On m'a donné le code suivant (avec ma compréhension dans les commentaires)Reverse engineering code d'assemblage

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: 

Est-ce un dialecte donné d'assembleur x86? J'ai cherché des instructions, et je vois qu'elles diffèrent. Tant dans les arguments, la syntaxe et ainsi de suite.

+7

C'est [syntaxe at & t] (https://sourceware.org/binutils/docs/as/i386_002dVariations.html). Quant à idiv et imul, ils sont bien sûr décrits en détail dans le [manuel de référence du jeu d'instructions officiel d'intel] (https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm -vol-2abcd.pdf), et divers [copies sur internet] (http://x86.renejeschke.de/). – Jester

+1

'IDIV' fonctionne exactement comme' DIV' (sauf qu'il traite les arguments comme signés). Le dividende devrait être dans 'AX' /' DX: AX'/'EDX: EAX'. http://www.felixcloutier.com/x86/IDIV.html – Thilo

+0

C'est une sorte de syntaxe AT & T incomplète, les instructions peuvent avoir un suffixe de taille paire, c.-à-d. 'cmpq% rbx,% rax' car cela fonctionne avec les registres de type' qword' , ou 'cmpb% bl,% al' s'il utilisait seulement les types byte, ce qui est encore une source de confusion si vous n'êtes pas au courant de l'existence de la syntaxe AT & T et quelqu'un vous montrera un tel assemblage x86 ... (généralement je suggère plutôt apprendre + utiliser la syntaxe Intel, si vous êtes libre de choisir) – Ped7g

Répondre

2

probablement une faute de frappe, mais je veux vous faire remarquer de toute façon: dans cette ligne jge loopa ; if rax > rbx, jge signifie Saut si plus ou égal, si if rax >= rbx. Rappelez-vous que chaque AT & T (oui, c'est une sorte de dialecte de la syntaxe Intel) l'instruction a ce modèle: source d'instruction , destination. Donc, pour l'instruction arithmétique ou de comparaison, vous devez commencer à "penser" à partir du deuxième opérande.

A propos de l'instruction idiv et imul, vous devriez lire this.