и посмотреть медиа
S0ER - arquitectura y codificación
и посмотреть медиа
Materiales sobre arquitectura de software, programación y crecimiento profesional en TI.
Materiales sobre arquitectura de software, programación y crecimiento profesional en TI.
S0ER se centra en la arquitectura de software, programación y desarrollo profesional. El canal ofrece análisis en profundidad, ejemplos de código y estrategias para el avance en el campo de la TI.
; проверка типа второго аргумента "b" 0x109706503 43 4c8b4520 REX.W movq r8, [rbp+0x20] 0x109706507 47 41f6c001 testb r8,0x1 0x10970650b 4b 0f8559000000 jnz 0x10970656a ; само сложение 0x109706511 51 03cf addl rcx,rdi ; если переполнение, то переход 0x109706513 53 0f8055000000 jo 0x10970656e ; упаковка результата 0x109706519 59 48c1e120 REX.W shlq rcx, 32 ; результат кладем в rax 0x10970651d 5d 488bc1 REX.W movq rax,rcx ; ====== эпилог ========== 0x109706520 60 488b4de8 REX.W movq rcx, [rbp-0x18] 0x109706524 64 488be5 REX.W movq rsp,rbp 0x109706527 67 5d pop rbp 0x109706528 68 4883f903 REX.W cmpq rcx,0x3 0x10970652c 6c 7f03 jg 0x109706531 0x10970652e 6e c21800 ret 0x18 0x109706531 71 415a pop r10 0x109706533 73 488d24cc REX.W leaq rsp, [rsp+rcx*8] 0x109706537 77 4152 push r10 0x109706539 79 c3 retl 0x10970653a 7a 48ba0000000010000000 REX.W movq rdx,0x1000000000 0x109706544 84 52 push rdx 0x109706545 85 48bb107d7a0401000000 REX.W movq rbx,0x1047a7d10 0x10970654f 8f b801000000 movl rax,0x1 0x109706554 94 48bef911d866da2e0000 REX.W movq rsi,0x2eda66d811f9 ;; object: 0x2eda66d811f9 0x10970655e 9e e89db146fb call 0x104b71700 (CEntry_Return1_ArgvOnStack_NoBuiltinExit) ;; near builtin entry 0x109706563 a3 eb82 jmp 0x1097064e7 0x109706565 a5 90 nop Как видите, здесь довольно длинный ASM-кусок, в котором я добавил пояснения, чтобы было понятно по смыслу, что происходит, само сложение выполняется одной командой addl, всё остальное — это подготовки и обработка исключений, давайте коротко подведём итоги: 👑 сначала идёт пролог — это стандартная часть, которая сохраняет значения регистров; 👑 далее идёт загрузка аргументов функции «a» и «b»; 👑 проверка, что загруженные аргументы — это числа; 👑 далее идёт распаковка (обратите внимание, что на самом деле распаковка "b" сделана раньше, чем реальная проверка типа, это спекулятивная оптимизация, которая требует отдельного рассмотрения, как и само понятие «распаковка»); 👑 делаем вычисление; 👑 проверяем, что всё ок; 👑 упаковываем результат; 👑 финальные проверки и эпилог. Более детально каждую из частей мы рассмотрим в будущих статьях, а пока ставь лайк, если тема тебе интересна. Полный вариант статьи
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!