X86汇编代码从未使用内存中加载的值

时间:2014-02-19 04:39:13

标签: gcc assembly x86 cpu-registers

我正在研究我的研究项目的汇编代码。我刚刚注意到一个JPEG程序的汇编代码片段,这对我来说有点混乱。在某些时候,一个值被加载到寄存器(%rcx)中,但是在代码的后面再次为它分配了另一个值而没有使用前一个值。这是我缺少的东西还是在编译器中是正常的东西?

我使用gcc 4.7.3编译带-O3优化的代码。为了获取汇编代码,我使用以下命令:

  

objdump --prefix-addresses --disassemble -dSlr

我已经突出了我正在讨论的代码部分。

00000000004186d7 <jpc_encsigpass.isra.0+0x847> mov    (%rbx),%rdx
00000000004186da <jpc_encsigpass.isra.0+0x84a> movzbl %dl,%eax
00000000004186dd <jpc_encsigpass.isra.0+0x84d> test   %eax,%eax
00000000004186df <jpc_encsigpass.isra.0+0x84f> je     00000000004181b4
00000000004186e5 <jpc_encsigpass.isra.0+0x855> test   $0x50,%dh
00000000004186e8 <jpc_encsigpass.isra.0+0x858> jne    00000000004181b4

00000000004186ee mov(%r15),%rcx

00000000004186f1 <jpc_encsigpass.isra.0+0x861> mov    %ecx,%edi
00000000004186f3 <jpc_encsigpass.isra.0+0x863> sar    $0x1f,%edi
00000000004186f6 <jpc_encsigpass.isra.0+0x866> xor    %edi,%ecx
00000000004186f8 <jpc_encsigpass.isra.0+0x868> sub    %edi,%ecx
00000000004186fa <jpc_encsigpass.isra.0+0x86a> test   %ecx,0x94(%rsp)
0000000000418701 <jpc_encsigpass.isra.0+0x871> setne  %cl
0000000000418704 <jpc_encsigpass.isra.0+0x874> or     0x98(%rsp),%eax
000000000041870b <jpc_encsigpass.isra.0+0x87b> movzbl %cl,%ecx
000000000041870e <jpc_encsigpass.isra.0+0x87e> cltq   
0000000000418710 <jpc_encsigpass.isra.0+0x880> movslq 0x669ba0(,%rax,4),%rdi
0000000000418718 <jpc_encsigpass.isra.0+0x888> mov    0x20(%rbp),%rax
000000000041871c <jpc_encsigpass.isra.0+0x88c> lea    (%rax,%rdi,8),%rax
0000000000418720 <jpc_encsigpass.isra.0+0x890> mov    %rax,0x28(%rbp)
0000000000418724 <jpc_encsigpass.isra.0+0x894> mov    (%rax),%rax
0000000000418727 <jpc_encsigpass.isra.0+0x897> cmp    0x8(%rax),%ecx
000000000041872a <jpc_encsigpass.isra.0+0x89a> je     0000000000418188
0000000000418730 <jpc_encsigpass.isra.0+0x8a0> mov    %rbp,%rdi
0000000000418733 <jpc_encsigpass.isra.0+0x8a3> mov    %rdx,0x30(%rsp)
0000000000418738 <jpc_encsigpass.isra.0+0x8a8> mov    %ecx,0x28(%rsp)
000000000041873c <jpc_encsigpass.isra.0+0x8ac> mov    %rsi,0x20(%rsp)
0000000000418741 <jpc_encsigpass.isra.0+0x8b1> mov    %r8,0x18(%rsp)
0000000000418746 <jpc_encsigpass.isra.0+0x8b6> mov    %r9,0x10(%rsp)
000000000041874b <jpc_encsigpass.isra.0+0x8bb> mov    %r10,(%rsp)
000000000041874f <jpc_encsigpass.isra.0+0x8bf> mov    %r11,0x8(%rsp)
0000000000418754 <jpc_encsigpass.isra.0+0x8c4> callq  0000000000421600 <jpc_mqenc_codelps>
0000000000418759 <jpc_encsigpass.isra.0+0x8c9> mov    0x28(%rsp),%ecx
000000000041875d <jpc_encsigpass.isra.0+0x8cd> mov    0x8(%rsp),%r11
0000000000418762 <jpc_encsigpass.isra.0+0x8d2> mov    (%rsp),%r10
0000000000418766 <jpc_encsigpass.isra.0+0x8d6> mov    0x10(%rsp),%r9
000000000041876b <jpc_encsigpass.isra.0+0x8db> mov    0x18(%rsp),%r8
0000000000418770 <jpc_encsigpass.isra.0+0x8e0> mov    0x20(%rsp),%rsi
0000000000418775 <jpc_encsigpass.isra.0+0x8e5> test   %ecx,%ecx
0000000000418777 <jpc_encsigpass.isra.0+0x8e7> mov    0x30(%rsp),%rdx
000000000041877c <jpc_encsigpass.isra.0+0x8ec> je     00000000004181ab
0000000000418782 <jpc_encsigpass.isra.0+0x8f2> cmpl   $0x0,0x9c(%rsp)

000000000041878a mov 0x160(%rsp),%rcx

0000000000418792 <jpc_encsigpass.isra.0+0x902> mov    (%r15),%rax
0000000000418795 <jpc_encsigpass.isra.0+0x905> mov    (%rcx),%rdi
0000000000418798 <jpc_encsigpass.isra.0+0x908> mov    %eax,%ecx

1 个答案:

答案 0 :(得分:1)

您突出显示的第一条指令会将值加载到rcx。下一条指令使用ecx中的值,该值是rcx的32个最低有效位。

您突出显示的第二条指令会将值加载到rcx,然后将其用作地址两条指令(mov (%rcx), %rdi)。