2016-09-11 71 views
0

我想將彙編代碼轉換回C代碼,但我注意到這一個操作稱爲sarq。我認爲q是地址的大小,但我不知道sarq對地址做了什麼。我評論了我相信代碼的作用。彙編語言 - sarq在代碼中做了什麼?

.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記錄在英特爾的insn set ref手冊中](http://www.felixcloutier.com/x86/SAL:SAR:SHL:SHR.html)。另請參閱http://stackoverflow.com/tags/x86/info –

回答

1

sar是一種算術右移。單一操作數形式將其操作數右移一位,用數字符號填充最高位。後綴q指示操作數是64位操作數(四字)。因此sarq -8(%rbp)%rbp以下的八字節右移一位。

+0

所以我會將該頂部數字轉換爲二進制數字,將其轉換爲1並將其添加到0的前面?因此,如果結果!= 1,那麼操作將會結束? –

+0

@JMei:b63(最高位)保持它的值(符號)。對於位b62至b0,右移一位表示b_i = b_old_i + 1。所以0xAAAAAAAAAAAAAAAA將變成0xD555555555555555。 'shr'會填滿b63零。 'sal'和'shl'都會左移數值(相同的結果)。 'sarq'幾乎被整數除法,除了'sar(-1)== -1'。爲什麼不簡單檢查x86指令集參考指南,然後搜索一些位移指令的教程?如果你想要任何東西,你應該有指令集ref。無論如何。 :) – Ped7g

3

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

Uhmm ... eaxrax下32B的一部分。它不是add,而是and。因此,從四位值只有最低有效位(b0)將保留在eax

這是一個帶結果值(最初爲零)的異或。

四值通過有符號移位向右移動,但常數爲正值(0x00BCDEFABCDEFBBB),所以無所謂。否則,該代碼將以無限循環結束,對於負常數!在這種情況下,人類程序員將使用shr,所以該函數將適用於任何64b值。

因此,整個代碼計算該長常量的奇偶校驗(以相當無效的方式,再加上它看起來像未優化的代碼),然後將其打印爲「ans#\ n」,其中#爲0(即使計數爲「 )或1(奇數)。 (我沒有調試它,只是快速查看它,所以也許我錯過了一些東西,你應該嘗試在調試器中,它真的做了什麼)。


順便說一句,這些評論很好,至少很容易指出你的另一個問題。沒有他們沒有人會注意到,只有sarq將被回答。