В чем смысл очистки младших 32 бит 64-битного адреса памяти до 0? [дубликат]Linux

Ответить
Anonymous
 В чем смысл очистки младших 32 бит 64-битного адреса памяти до 0? [дубликат]

Сообщение Anonymous »


Следующая ассемблерная программа скопирована из программы C++. Цель состоит в том, чтобы скопировать некоторые данные из блока данных или буфера в другой блок данных.

Ниже приведены две инструкции (обратите внимание, что приведенные ниже инструкции mov, lea перемещаются от первого операнда ко второму, это результат objdump),

23f50d: 49 89 f9 mov %rdi,%r9 23f510: 33 и далее xили %edi,%edi Насколько я понимаю, %rdi содержит первый аргумент, который является указателем либо на первый объект, либо на второй (я не уверен, какой именно).

%edi — это младшие 32 бита регистра %rdi. Когда вы выполняете xor %edi к самому себе, он фактически очищает %edi до 0 (что означает, что младшие 32 бита %rdi очищаются до 0, но при этом сохраняются старшие 32). бит).

Для меня это немного странно, потому что я не вижу причины, по которой он очищает только младшие 32 бита.

Позже он использует %rdi следующим образом:

23f521: 42 8d 04 1f lea (%rdi,%r11,1),%eax Это означает загрузку адреса памяти %rdi + 1 * %r11 в %eax, %eax — это младшие 32 бита %rax. %r11 изначально равен 0, но позже будет добавляться по 3 в каждом раунде. Но %rdi здесь равен 0 в младших 32 битах памяти и ненулевому в старших 32 битах памяти.

Я не понимаю, что он здесь делает.

Может ли кто-нибудь помочь мне развеять сомнения? Спасибо.

Я публикую всю ассемблерную программу ниже для вашего удобства.
23f500: 41 54 нажмите %r12 23f502: 41 55 нажмите %r13 23f504: 41 56 нажмите %r14 23f506: 41 57 нажмите %r15 23f508: 53 нажмите %rbx 23f509: 55 нажатий %rbp 23f50a: 45 33 c0 xили %r8d,%r8d 23f50d: 49 89 f9 mov %rdi,%r9 23f510: 33 и далее xили %edi,%edi 23f512: 33 c9 xили %ecx,%ecx 23f514: 33 d2 xили %edx,%edx 23f516: 45 33 дБ xor %r11d,%r11d 23f519: 45 33 d2 xили %r10d,%r10d 23f51c: 44 89 54 24 e8 mov %r10d,-0x18(%rsp) 23f521: 42 8d 04 1f lea (%rdi,%r11,1),%eax 23f525: 48 63 c0 movslq %eax,%rax 23f528: 45 33 ed xor %r13d,%r13d 23f52b: 44 89 5c 24 e0 mov %r11d,-0x20(%rsp) 23f530: 42 8d 2c 11 lea (%rcx,%r10,1),%ebp 23f534: 89 4c 24 d8 mov %ecx,-0x28(%rsp) 23f538: 89 7c 24 d0 mov %edi,-0x30(%rsp) 23f53c: 48 89 74 24 c8 mov %rsi,-0x38(%rsp) 23f541: 48 8d 1c c6 lea (%rsi,%rax,8),%rbx 23f545: 33 c0 xили %eax,%eax 23f547: 48 8b 34 c3 mov (%rbx,%rax,8),%rsi 23f54b: 48 85 f6 тест %rsi,%rsi 23f54e: 74 72 je 23f5c2 23f550: 44 89 6c 24 f0 mov %r13d,-0x10(%rsp) 23f555: 33 и далее xили %edi,%edi 23f557: 46 8d 14 ed f8 ff ff lea -0x8(,%r13,8),%r10d 23f55e: фф 23f55f: 46 8d 5c ed 00 lea 0x0(%rbp,%r13,8),%r11d 23f564: 46 8d 24 c5 f8 ff ff lea -0x8(,%r8,8),%r12d 23f56b:фф 23f56c: 4d 63 дБ movslq %r11d,%r11 23f56f: 33 c9 xили %ecx,%ecx 23f571: 49 89 f5 mov %rsi,%r13 23f574: 44 8d 34 d5 f8 ff ff lea -0x8(,%rdx,8),%r14d 23f57b:фф 23f57c: 4f 8d 3c 99 леев (%r9,%r11,4),%r15 23f580: 41 0f 10 45 00 перемещений 0x0(%r13),%xmm0 23f585: 41 0f 11 07 перемещений %xmm0,(%r15) 23f589: 41 0f 10 4d 10 перемещений 0x10(%r13),%xmm1 23f58e: 41 0f 11 4f 10 перемещений %xmm1,0x10(%r15) 23f593: ff c1 вкл %ecx 23f595: 49 83 c5 20 добавить $0x20,%r13 23f599: 49 83 c7 60 добавить $0x60,%r15 23f59d: 41 и далее c6 прибавив %r14d 23f5a0: 83 f9 08 cmp $0x8,%ecx 23f5a3: 72 дБ jb 23f580 23f5a5: ff c7 вкл %edi 23f5a7: 41 81 c3 40 02 00 00 добавить $0x240,%r11d 23f5ae: 48 81 c6 00 01 00 00 добавить $0x100,%rsi 23f5b5: 41 ff c4 прибавка %r12d 23f5b8: 83 ff 08 cmp $0x8,%edi 23f5bb: 72 аф jb 23f56c 23f5bd: 44 8b 6c 24 f0 mov -0x10(%rsp),%r13d 23f5c2: 41 и далее c5 прибавив %r13d 23f5c5: 48 ff c0 вкл %rax 23f5c8: 41 83 fd 03 cmp $0x3,%r13d 23f5cc: 0f 82 75 ff ff ff jb 23f547 23f5d2: ff c2 включая %edx 23f5d4: 44 8b 54 24 e8 mov -0x18(%rsp),%r10d 23f5d9: 44 8b 5c 24 e0 mov -0x20(%rsp),%r11d 23f5de: 41 81 c2 c0 00 00 00 добавить $0xc0,%r10d 23f5e5: 41 83 c3 03 добавить $0x3,%r11d 23f5e9: 8b 4c 24 d8 mov -0x28(%rsp),%ecx 23f5ed: 8b 7c 24 d0 mov -0x30(%rsp),%edi 23f5f1: 48 8b 74 24 c8 mov -0x38(%rsp),%rsi 23f5f6: 83 fa 03 cmp $0x3,%edx 23f5f9: 0f 82 1d ff ff ff jb 23f51c 23f5ff: 41 ff c0, включая %r8d 23f602: 83 c7 09 добавить $0x9,%edi 23f605: 81 c1 00 12 00 00 добавить $0x1200,%ecx 23f60b: 41 83 f8 03 cmp $0x3,%r8d 23f60f: 0f 82 ff fe ff ff jb 23f514 23f615: 5d поп %rbp 23f616: 5b поп %rbx 23f617: 41 5f поп %r15 23f619: 41 5e поп %r14 23f61b: 41 5d поп %r13 23f61d: 41 5c поп %r12 23f61f: c3 в отставке
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»