pushl %ebp
movl %esp, %ebp
subl $36, %esp //allocate 36 btyes for local vars
movl 8(%ebp), %eax // eax = n
andl $1, %eax //how can u andl a parameter? parameter can be greater than 1
testl %eax, %eax
jmp .L4
cmpl $2, 8(%ebp)
jne .L6
.L4:
movl 8(%ebp), %eax //eax = n
movl %eax, -28(%ebp) //x = eax
movl $1431655766, -32(%ebp) //y = 1431655766
movl -32(%ebp), %eax //eax = y
imull -28(%ebp) //edx = x * eax
movl %edx, %ecx //ecx = edx
movl -28(%ebp), %eax //eax = x
sarl $31, %eax //eax = eax >> 31
movl %ecx, %edx //edx = ecx
subl %eax, %edx //edx = edx - eax
movl %edx, -24(%ebp) //z = edx
movl -24(%ebp), %eax //eax = z
addl %eax, %eax //eax = eax+eax
addl -24(%ebp), %eax //eax = z+eax
movl -28(%ebp), %ecx //ecx = x
subl %eax, %ecx //ecx = ecx-eax
movl %ecx, -24(%ebp) //z = ecx
cmpl $0, -24(%ebp) //compare z and 0
jne .L7 //if not equal jmp to .L7
cmpl $3, 8(%ebp) //compare n and 3
jne .L6 //if not equal jmp .L6
好的我有這個程序集片段,我想知道你怎麼能夠和$ 1和一個參數,參數可以大於1。此外,testl似乎沒用,因爲jmp跳轉不管。有什麼想法嗎?謝謝。andl帶參數? x86程序集
編輯:我更新了代碼,不確定是否所有的正確推理。非常困惑imull -28(%ebp)
編譯是否進行優化? – 2014-11-01 19:11:24
這應該是沒有優化。 – gensou 2014-11-01 19:19:46
在未優化的裝配轉儲中偶爾發現無用的指令時不要感到驚訝。 – 2014-11-01 19:21:33