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