рдЖрдЬ рдореИрдВ IA-32 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдбреАрдХреЛрдб / рдбрд┐рд╕рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ
"IA-32 рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрд╕рд░реНрдЧреЛрдВ" рд▓реЗрдЦ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ IA-32 рдХрдорд╛рдВрдбреЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдореМрдЬреВрджрд╛ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрдкрд╕рд░реНрдЧреЛрдВ рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реА рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рдпрд╣ рд╕рдм рдбрд┐рдХреЛрдбрд░реНрд╕ -
рдЬреАрдбреАрдПрд╕рдПрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖред рдпрд╣ рд▓реЗрдЦ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрдЭреЗ рдЬреНрдЮрд╛рдд рд╣реИрдВ, рд╕рд╛рде рд╣реА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╕реБрдиреА рд╣реИрдВред рдпрд╣ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ред
рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢, рдЬреИрд╕реЗ
MULSS
,
MULSD
рдФрд░
MULPD
(рд╡реЗрдХреНрдЯрд░ рдЧреБрдгрди рдирд┐рд░реНрджреЗрд╢) рдореЗрдВ рдПрдХ рд╣реА opcode
0x0f 0x59
, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрдкрд╕рд░реНрдЧ (рдХреНрд░рдорд╢рдГ
0x66
рдФрд░
0x66
) рд╣реИрдВред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдРрд╕реЗ рдЙрдкрд╕рд░реНрдЧ рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЕрдВрддрд┐рдо рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ! рдпрджрд┐ рдЕрдВрддрд┐рдо рдЙрдкрд╕рд░реНрдЧ
0xf2
рдпрд╛
0xf2
, рддреЛ рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐
0x66
рдХреЗрд╡рд▓ рддрднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ рдЬрдм рдЙрдкрд╕рд░реНрдЧ
0xf2
рдФрд░
0xf2
рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рди рд╣реЛрдВред рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА disassembler рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВрдиреЗ рдЗрди рдмрдпрд╛рдиреЛрдВ рдХреА рд╢реБрджреНрдзрддрд╛ рдкрд░ рд╕рдВрджреЗрд╣ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ,
рдкреНрд░рд▓реЗрдЦрди рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рдЕрд╕рд▓реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдБрдЪ рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЧрдИ рдереАред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
#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 рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рддреЗ рдереЗ, рдЬреЛ рддреБрд░рдВрдд рдЗрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ gdb рдФрд░ objdump Binutils рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ рдФрд░ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред ODA рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ, рдПрдВрдердиреА рдбреЗрд░рд╛рд╕рд╛, рдиреЗ рдореЗрд░реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдХрд╣рд╛ рдХрд┐ рд╡реЗ рд▓рд┐рдмреЛрдкреЛрдбреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рдЬреЛ рдХрд┐ рдмрд┐рдиреБрдЯрд┐рд▓реНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдПрдХ рдЬрдЧрд╣ рдкрд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рддреАрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд╕реБрдзрд╛рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдХрд┐рд╕реА рднреА рдмрдиреНрдерд┐рд▓ рдиреЗ рдЕрднреА рддрдХ рдореБрдЭреЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред
рдХреНрдпрд╛ рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓рд░ рдЬреЛ рдЖрдк рдХрд╛рдо рдХрд╛ рд╕рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ?