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

Gcc X86汇编代码从未使用从内存加载的值,gcc,assembly,x86,cpu-registers,Gcc,Assembly,X86,Cpu Registers,我正在研究一个程序的汇编代码。我刚刚注意到一个JPEG程序的汇编代码片段,这让我有点困惑。在某一点上,一个值被加载到寄存器(%rcx)中,但随后在代码中,它又被分配了另一个值,而从未使用过以前的值。这是我缺少的东西还是编译器中的正常东西 我使用GCC4.7.3来编译带有-O3优化的代码。为了获取汇编代码,我使用以下命令: objdump——前缀地址——反汇编——dSlr 我已经强调了我正在谈论的代码部分 00000000004186d7 <jpc_encsigpass.isra.0+0x8

我正在研究一个程序的汇编代码。我刚刚注意到一个JPEG程序的汇编代码片段,这让我有点困惑。在某一点上,一个值被加载到寄存器(%rcx)中,但随后在代码中,它又被分配了另一个值,而从未使用过以前的值。这是我缺少的东西还是编译器中的正常东西

我使用GCC4.7.3来编译带有-O3优化的代码。为了获取汇编代码,我使用以下命令:

objdump——前缀地址——反汇编——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
0000000000 4186D7 mov(%rbx),%rdx
0000000000 4186DA movzbl%dl,%eax
0000000000 4186DD测试%eax,%eax
0000000000 4186DF je 0000000000 4181B4
0000000000 4186E5测试$0x50,%dh
0000000000 4186E8 jne 0000000000 4181B4
0000000000 4186EE mov(%r15),%rcx

0000000000 4186F1 mov%ecx,%edi
0000000000 4186F3 sar$0x1f,%edi
0000000000 4186F6异或%edi,%ecx
0000000000 4186F8子%edi,%ecx
0000000000 4186FA测试%ecx,0x94(%rsp)
0000000000 418701设定值%cl
0000000000 418704或0x98(%rsp),%eax
0000000000 41870B movzbl%cl,%ecx
0000000000 41870E cltq
0000000000 418710 movslq 0x669ba0(,%rax,4),%rdi
0000000000 418718 mov 0x20(%rbp),%rax
0000000000 41871C lea(%rax,%rdi,8),%rax
0000000000 418720 mov%rax,0x28(%rbp)
0000000000 418724 mov(%rax),%rax
0000000000 418727 cmp 0x8(%rax),%ecx
0000000000 41872A日本脑炎0000000000 418188
0000000000 418730 mov%rbp,%rdi
0000000000 418733 mov%rdx,0x30(%rsp)
0000000000 418738 mov%ecx,0x28(%rsp)
0000000000 41873C移动%rsi,0x20(%rsp)
0000000000 418741 mov%r8,0x18(%rsp)
0000000000 418746 mov%r9,0x10(%rsp)
0000000000 41874亿移动资产%r10,(%rsp)
0000000000 41874F移动值%r11,0x8(%rsp)
0000000000 418754呼叫0000000000 421600
0000000000 418759 mov 0x28(%rsp),%ecx
0000000000 41875D mov 0x8(%rsp),%r11
0000000000 418762 mov(%rsp),%r10
0000000000 418766 mov 0x10(%rsp),%r9
0000000000 41876B mov 0x18(%rsp),%r8
0000000000 418770 mov 0x20(%rsp),%rsi
0000000000 418775测试%ecx,%ecx
0000000000 418777 mov 0x30(%rsp),%rdx
0000000000 41877C je 0000000000 4181AB
0000000000 418782 cmpl$0x0,0x9c(%rsp)
0000000000 41878A mov 0x160(%rsp),%rcx

0000000000 418792 mov(%r15),%rax
0000000000 418795 mov(%rcx),%rdi
0000000000 418798 mov%eax,%ecx

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


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

rcx
是64位寄存器,
ecx
是32位寄存器。因此,
ecx
rcx
的下半部分。您将看到
ecx
正在代码中使用。
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)
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