2016-09-11 2 views
0

Ich versuche Assembler-Code zurück in C-Code zu übersetzen, aber ich bemerkte diese eine Operation namens Sarq. Ich denke, q ist für welche Größe die Adresse ist, aber ich weiß nicht, was der Sarq mit der Adresse tut. Ich habe kommentiert, was ich glaube, dass der Code tut.Assemblersprache - was macht sarq im Code?

.LC0 .string "ans %d\n" 
main: 
.LFB0:     val = -8(%rbp), result = -12(%rbp) 
     pushq %rbp 
     movq %rsp, %rbp 
     subq $16, %rsp 
     movabsq $53162464113523643, %rax 
     movq %rax, -8(%rbp)  //val(variable) address -8,inputs value in %rax 
     movl $0, -12(%rbp)  //result(variable) address -12, inputs 0 
     jmp  .L2   //starts loop 
.L3: 
     movq -8(%rbp), %rax  //moves value in val into rax 
     andl $1, %eax  //dunno what eax is but adds 1 into it 
     xorl %eax, -12(%rbp)  //compares the value of eax and result to see if they are not equal. so compares 1 to 0 
     sarq -8(%rbp)  //does something to val? 
.L2: 
     cmpq $0, -8(%rbp)  //compares val to 0 
     jg  .L3   //if greater, goes to L3 
     movl -12(%rbp), %eax  //else, moves value from result into eax 
     movl %eax, %esi  //moves eax into esi 
     movl $.LC0, %edi  //Moves w/e $.LC0 is into edi. Based on the top, edi now holds that string? 
     movl $0, %eax  //moves 0 into eax 
     call printf   //print statement 
     leave 
     ret 
+0

[SAR ist in Intels insn set ref Handbuch dokumentiert] (http://www.felixcloutier.com/x86/SAL:SAR:SHL:SHR.html). Siehe auch http://StackOverflow.com/Tags/X86/info –

Antwort

1

sar ist eine arithmetische Rechtsverschiebung. Die einzelne Operandenform verschiebt ihren Operanden um eine Stelle und füllt das oberste Bit mit dem Vorzeichen der Zahl. Das Suffix q zeigt an, dass der Operand ein 64-Bit-Operand (ein Vierfachwort) ist. Somit verschiebt sarq -8(%rbp) das Quadwort acht Bytes unter %rbp um einen Platz.

+0

Also würde ich diese Top-Nummer in Binär konvertieren, verschiebe es über 1 und fügen Sie eine 0 infront davon? Also wäre die Operation, wenn Ergebnis! = 1, dann verschiebe es? –

+0

@JMei: b63 (das höchstwertige Bit) behält seinen Wert (Zeichen). Für die Bits b62 bis b0 bedeutet die Verschiebung um eine Stelle, dass b_i = b_old_i + 1. Also wird 0xAAAAAAAAAAAAAAAA zu 0xD555555555555555. 'shr' würde b63 mit Null füllen. 'sal' und' shl' verschieben beide Werte nach links (gleiches Ergebnis). 'sarq' ist fast eine Division der Ganzzahl, außer' sar (-1) == -1'. Warum überprüfen Sie nicht einfach den Referenzleitfaden für den x86-Befehlssatz und suchen dann nach einem Tutorial für Anweisungen zum Bit-Shifting? Wenn Sie etwas RE haben möchten, sollten Sie die Anweisung ref. von Hand sowieso. :) – Ped7g

3

andl $1, %eax //dunno what eax is but adds 1 into it

Uhmm ... eax niedriger 32b Teil rax. Und es ist nicht add, aber and. So wird vom Quad-Wert nur das niedrigstwertige Bit (b0) in eax verbleiben.

Dieser wird mit dem Ergebniswert xor-ed (zunächst Null).

Und der Quad-Wert ist nach rechts verschoben, durch vorzeichenbehaftete Verschiebung, aber die Konstante ist positiv (0x00BCDEFABCDEFBBB), ist also egal. Andernfalls würde dieser Code in der Endlosschleife enden, für die negative Konstante! Der menschliche Programmierer würde in diesem Fall shr verwenden, so dass die Funktion für jeden 64b-Wert funktionieren würde.

Also berechnet der ganze Code Parität dieser langen Konstante (in ziemlich unwirksamer Weise, plus sieht wie nicht optimierter Code aus) und druckt dann als "ans # \ n", wobei # 0 ist (gerade Anzahl der gesetzten Bits) oder 1 (ungerade).

(Ich habe es nicht debuggen, nur nach einem kurzen Blick darauf, also vielleicht habe ich etwas verpasst, sollten Sie im Debugger versuchen, was es wirklich tut).


BTW, gute Arbeit mit diesen Kommentaren, zumindest war es einfach, Ihnen ein anderes Problem zu zeigen. Ohne sie würde niemand bemerken, und nur sarq würde beantwortet werden.