рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ?

рдЖрдЬ рдореИрдВ IA-32 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдбреАрдХреЛрдб / рдбрд┐рд╕рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ "IA-32 рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрд╕рд░реНрдЧреЛрдВ" рд▓реЗрдЦ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ IA-32 рдХрдорд╛рдВрдбреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдореМрдЬреВрджрд╛ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрдкрд╕рд░реНрдЧреЛрдВ рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реА рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдпрд╣ рд╕рдм рдбрд┐рдХреЛрдбрд░реНрд╕ - рдЬреАрдбреАрдПрд╕рдПрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖред рдпрд╣ рд▓реЗрдЦ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрдЭреЗ рдЬреНрдЮрд╛рдд рд╣реИрдВ, рд╕рд╛рде рд╣реА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╕реБрдиреА рд╣реИрдВред рдпрд╣ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ред

рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢, рдЬреИрд╕реЗ MULSS , MULSD рдФрд░ MULPD (рд╡реЗрдХреНрдЯрд░ рдЧреБрдгрди рдирд┐рд░реНрджреЗрд╢) рдореЗрдВ рдПрдХ рд╣реА opcode 0x0f 0x59 , рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрдкрд╕рд░реНрдЧ (рдХреНрд░рдорд╢рдГ 0x66 рдФрд░ 0x66 ) рд╣реИрдВред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдРрд╕реЗ рдЙрдкрд╕рд░реНрдЧ рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЕрдВрддрд┐рдо рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ! рдпрджрд┐ рдЕрдВрддрд┐рдо рдЙрдкрд╕рд░реНрдЧ 0xf2 рдпрд╛ 0xf2 , рддреЛ рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ 0x66 рдХреЗрд╡рд▓ рддрднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ рдЬрдм рдЙрдкрд╕рд░реНрдЧ 0xf2 рдФрд░ 0xf2 рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рди рд╣реЛрдВред рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА disassembler рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рдирд┐рд░реНрджреЗрд╢ рдХреЛрдбрдирд┐рд░реНрджреЗрд╢ рдореИрдиреБрдЕрд▓рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрдкрд╕рд░реНрдЧ
66 f3 f2 0f 59 ffMULSD xmm7, xmm7f2
66 f2 f3 0f 59 ffMULSS xmm7, xmm7f3
66 0f 59 ffMULPD xmm7, xmm766
f2 66 0f 59 ffMULSD xmm7, xmm7f2
0f 59 ffMULPS xmm7, xmm7-

рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВрдиреЗ рдЗрди рдмрдпрд╛рдиреЛрдВ рдХреА рд╢реБрджреНрдзрддрд╛ рдкрд░ рд╕рдВрджреЗрд╣ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░рд▓реЗрдЦрди рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рдЕрд╕рд▓реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдБрдЪ рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЧрдИ рдереАред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 #include <stdio.h> int main() { double a[2] = {2, 2}, b[2] = {0, 0}; __asm__ __volatile__ ( // Copy data from a to xmm7 register "movupd %1, %%xmm7\n" //"mulsd %%xmm7, %%xmm7\n" ".byte 0xf2, 0x66, 0x0f, 0x59, 0xff\n" // Copy data from xmm7 register to b "movupd %%xmm7, %0\n" :"=m"(*b) :"m"(*a) : ); printf("%lf %lf\n", b[0], b[1]); return 0; } 


рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:

 $ gcc -O0 -Wall mulsd.c $ ./a.out 4.000000 2.000000 


рдпрд╣реА рд╣реИ, рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рджреВрд╕рд░рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рд╛, рдЬреЛ рдХрд┐ MULSD рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ MULPD рдирд╣реАрдВред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЬреНрдЮрд╛рдд рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрдИ disassembler рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рддреЗ рдереЗ, рдЬреЛ рддреБрд░рдВрдд рдЗрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдЙрддреНрдкрд╛рдж рд╕рдВрд╕реНрдХрд░рдгрдкрд░рд┐рдгрд╛рдорддреНрд░реБрдЯрд┐ рдореИрдВрдиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдХреА
рд╡рд┐рдВрдб рд░рд┐рд╡рд░ рд╕рд┐рдорд┐рдХреНрд╕ 4.8рд╕рдлрд▓рддрд╛-
рдирд┐рд╢реНрдЪрд┐рддрд╕рдлрд▓рддрд╛-
objdump, 2.23рдПрдХ рдЧрд▓рддреА16083
рдЬреАрдПрдирдпреВ рдЬреАрдбреАрдмреА 7.5рдПрдХ рдЧрд▓рддреА16,089
nasm, 2.09рдПрдХ рдЧрд▓рддреА3392269
ODA, 0.2.0рдПрдХ рдЧрд▓рддреАрдИрдореЗрд▓ рдкрддреНрд░рд╛рдЪрд╛рд░
objconv, 2.31рдПрдХ рдЧрд▓рддреАрдИрдореЗрд▓ рдкрддреНрд░рд╛рдЪрд╛рд░
рдЖрдИрдбреАрдП, 6.4 (рдореВрд▓реНрдпрд╛рдВрдХрди рд╕рдВрд╕реНрдХрд░рдг)рдПрдХ рдЧрд▓рддреАрдИрдореЗрд▓ рдкрддреНрд░рд╛рдЪрд╛рд░
llvm-objdump, 3.2рдПрдХ рдЧрд▓рддреА17,697

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ gdb рдФрд░ objdump Binutils рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ рдФрд░ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред ODA рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ, рдПрдВрдердиреА рдбреЗрд░рд╛рд╕рд╛, рдиреЗ рдореЗрд░реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдХрд╣рд╛ рдХрд┐ рд╡реЗ рд▓рд┐рдмреЛрдкреЛрдбреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рдЬреЛ рдХрд┐ рдмрд┐рдиреБрдЯрд┐рд▓реНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдПрдХ рдЬрдЧрд╣ рдкрд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рддреАрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕реБрдзрд╛рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдХрд┐рд╕реА рднреА рдмрдиреНрдерд┐рд▓ рдиреЗ рдЕрднреА рддрдХ рдореБрдЭреЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рдЬреЛ рдЖрдк рдХрд╛рдо рдХрд╛ рд╕рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ?

Source: https://habr.com/ru/post/In200658/


All Articles