рд╕рдВрдХрд▓рдиред 10: рдИрдПрд▓рдПрдл рдореЗрдВ рд╕рдВрдХрд▓рди

рдкрд┐рдЫрд▓реА рдмрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ j- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓реЛрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдХрд▓реНрдкрдирд╛ рдХреА рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдЕрдиреБрдХреВрд▓рди рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдереЗ рдЬреЛ рдкрдбрд╝реЛрд╕реА рдЖрджреЗрд╢реЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред



рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдЧреЗ:

  1. рдкреАрдкрд╣реЛрд▓ рдЕрдиреБрдХреВрд▓рди
  2. рдорд╛рдирдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ
  3. рдИрдПрд▓рдПрдл рдХреЛ рдЖрдЙрдЯрдкреБрдЯ
  4. рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
  5. рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?

рдкреАрдкрд╣реЛрд▓ рдЕрдиреБрдХреВрд▓рди



рдирд┐рдпреЛрдЬрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ code



рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдорд╢реАрди рдХреЛрдб рдХреЗ рдЫреЛрдЯреЗ рд╡реИрдХреНрдЯрд░ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЧреЛрдВрдж рджреЗрдВрдЧреЗред



рджреВрд╕рд░реЗ, рджреЛ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ: рдкрд╣рд▓реА рдкрд╛рд╕ рдкрд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдорд╢реАрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдкрд░ - рд╣рдо рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреАрд╕рд░реЗ рдкрд░ - рд╣рдо "рдкреЙрд▓рд┐рд╢" рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛрдкреНрд╕ рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдСрдлрд╕реЗрдЯ рдореЗрдВ рднрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдЬрдВрдк рдСрдлрд╝рд╕реЗрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд╛рд╕ рдХреЗ рдЬрдВрдк рдХреЛ рд╢реЙрд░реНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдВрдЧреЗ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рддрд╛рдХрд┐ рддреАрд╕рд░реЗ рдкрд╛рд╕ рдкрд░ рдХреЛрдб рдХреЛ рдФрд░ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдПрдХ рдФрд░ рдкрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдЪреМрдерд╛; рдЗрд╕ рдкрд░ рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреЛрдб рдореЗрдВ рдХрдореА рдХреЗ рдХрд╛рд░рдг рдмрджрд▓ рдЪреБрдХреЗ рдЬрдореНрдкрд╕реВрдЯреНрд╕ рдХреЛ рд╕рд╣реА рдХрд░реЗрдВрдЧреЗред



рдкреНрд░рддреНрдпреЗрдХ рдЯреАрдо рдХреЛ рдЙрддреНрдкрдиреНрди POP



рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдорд╢реАрди рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрдХреЗрд▓реЗ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ POP



рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдпрд╛ рдХреЗрд╡рд▓ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП PUSH



рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдорд╢реАрди рдХреЛрдб рдХрд╛ рдкрд╣рд▓рд╛ рдмрд╛рдЗрдЯ рдЕрдирд╛рдпрд╛рд╕ рд╣реА рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

  struct commandn { // ... int offset; //    int needfixat; //  JZ, ECHO int popcnt; // INPUT, ECHO std::vector<unsigned char> code;//   // ... void pop_back(int c = 1) { code.resize(code.size()-c); } void pop_front(int c = 1) { code.erase(code.begin(), code.begin()+c); } }; // ... // ""    JZ: // ,     case command::jz: if(!i->cmd.dest) // JMP off i->emit(0xe9); else { // OR dst, dst / JZ off i->emit(0x0b, 0xc0|(i->cmd.dest-1)<<3|(i->cmd.dest-1)); i->emit(0x0f, 0x84); } i->needfixat = i->code.size(); i->emit4(0); break; // ... //  ECHO  INPUT   popcnt; //   --   case command::input: foreach(rp, i->onenterp) if(*rp!=4) i->emit(0x50|(*rp-1)); i->emit(0xff, 0x55, 0); if(i->cmd.dest!=1) i->emit(0x90|(i->cmd.dest-1)); foreachr(rp, i->onenterp) if(*rp!=4) { i->emit(0x58|(*rp-1)); i->popcnt++; } break; // ... //  :   ,    int offset = 0; foreach2(i,pcode,next) { i->offset = offset; //  "POP-PUSH" while(i->popcnt && ((next->code[0]&0xfc) == 0x50) && ((i->code.back()&3) == (next->code[0]&3)) && //  :     !((next->cmd.opcode==command::echo) && (next->cmd.dest==(next->code[0]&3)+1))) { i->pop_back(); next->pop_front(); i->popcnt--; if(next->needfixat) next->needfixat--; } //  "-JZ" if((i->cmd.opcode>=command::eq) && (next->cmd.opcode==command::jz) && (i->cmd.dest==next->cmd.dest) && !next->onexitp.count((physreg)next->cmd.dest)) { char cc = i->code[i->code.size()-5]; // cond code i->pop_back(6); // SETcc / MOVZX next->code.clear(); //    next->emit(0x0f, cc^0x11); next->needfixat = next->code.size(); next->emit4(0); } offset += i->code.size(); } //  :    offset = 0; foreach(i, pcode) { i->offset = offset; if(i->cmd.opcode==command::jz) { int joffset = i->tgt->offset-(i->offset+i->code.size()); if((joffset>=-128) && (joffset<128)) { //   if(!i->cmd.dest) { // JMP SHORT i->code.clear(); i->emit(0xeb, (char)joffset); } else if(i->code[0]==0x0b && i->code[1]==0xc9) { // OR ECX, ECX i->code.clear(); i->emit(0xe3, (char)joffset); // JECXZ } else { char cc = i->code[i->code.size()-5]; // cond code i->pop_back(6); i->emit(cc^0xf0, (char)joffset);// Jcc SHORT } i->needfixat = i->code.size()-1; //     } } offset += i->code.size(); } //  :     foreach(i, pcode) if(i->needfixat) if(i->cmd.opcode==command::jz) { int joffset = i->tgt->offset-(i->offset+i->code.size()); switch(i->code[i->needfixat]-1) { case 0xeb: case 0xe3: case 0x74: case 0x75: case 0x7c: case 0x7d: case 0x7e: case 0x7f: i->code[i->needfixat] = (char)joffset; break; // short default: i->fix4(joffset); } } else if (i->cmd.opcode==command::echo) i->fix4(offsets[i->cmd.imm]);
      
      







рдорд╛рдирдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ



рдкрд┐рдЫрд▓реА рдмрд╛рд░, рдорд╛рдирдХ рдХрд╛рд░реНрдп input,echoi,echos



рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдорд╛рд░реЗ рдмреВрдЯрд▓реЛрдбрд░ рдореЗрдВ рдерд╛ред рдЗрд╕ рд╕рдордп рдХреЛрдИ рдмреВрдЯрд▓реЛрдбрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛; рдХрд╛рд░реНрдп рдХрд╣рд╛рдБ рд╣реЛрдВрдЧреЗ?



рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрдиреНрди рдмрд╛рдЗрдирд░реА рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рд▓реЗрдХрд┐рди рдпрд╣ рдмрджрд╕реВрд░рдд рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд▓рдЧ .o



рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рддрдм рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЕрд▓рдЧрд╛рд╡ рд╣реИ: x86 рдФрд░ x64 рдХреЗ рдмреАрдЪ рдХреЗ рд╕рднреА рдЕрдВрддрд░, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рдВрдХрд▓рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЭреВрда, рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ, рдФрд░ рд╣рдо рдЦреБрдж рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред



рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдирдХ рдХрд╛рд░реНрдп ESI



рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ EAX



рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдЪрд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ x64 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

 .global input,echoi,echos .text fd: .asciz "%d" fs: .asciz "%s" input: push %rax lea fd, %edi xor %eax, %eax mov %rsp, %rsi call scanf pop %rax ret echoi: lea fd, %edi echo: xor %eax, %eax jmp printf echos: movslq %esi, %rsi add %rbp, %rsi lea fs, %edi jmp echo
      
      





рдФрд░ рдпрд╣рд╛рдБ x86 рдХреЗ рд▓рд┐рдП рд╣реИ:

 .global input,echoi,echos .text fd: .asciz "%d" fs: .asciz "%s" input: push %eax push %esp push $fd call scanf pop %eax pop2: pop %eax pop %eax ret echoi: push %esi push $fd echo: call printf jmp pop2 echos: add %ebp, %esi push %esi push $fs jmp echo
      
      







рдИрдПрд▓рдПрдл рдХреЛ рдЖрдЙрдЯрдкреБрдЯ



рд╣рдорд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рд╣реИ; рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕реЗ "рдкреИрдХ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдУрдПрд╕ рдЗрд╕реЗ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХреЗ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛ рд╕рдХреЗред



рд╕реНрдореГрддрд┐ рдореЗрдВ, рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ: рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб, рдбреЗрдЯрд╛, рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ред .o



рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдФрд░ рд╕реАрдзреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ .o



рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд╛рд░реНрдЯреНрд╕ ( рд╕реЗрдХреНрд╢рди ) .o



рд╕рдВрд░реЗрдЦрдг рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ; рдЗрд╕рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рд╕реЗрдХреНрд╢рди рд╕реЗ рджреВрд╕рд░реЗ рдПрдбреНрд░реЗрд╕ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдЬреЗрдирд░реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ - рдПрдХ рд░рд┐рд▓реЛрдХреЗрд╢рди рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╕рдордп рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдкрддрд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗ рдЧрдгрдирд╛ рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП, ELF рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ .o



рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред



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

рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЪрд▓реЛ x86 рдФрд░ x64 рдкрд░ рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ 24-рдмрд╛рдЗрдЯ рдХрд░реЗрдВ - рдлрд┐рд░ рд╕реЗ, рд╕рд╛рджрдЧреА рдФрд░ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдПред X64 рдкрд░, рдпрд╣ рдХреЗрд╡рд▓ рддреАрди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реЛрдЧрд╛ ( input,echoi,echos



); x86 рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХ 4-рдмрд╛рдЗрдЯ рд╕реНрдЯрдм рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдЪрд╛рд░ рд╕реНрдерд╛рди рд╣реЛрдВрдЧреЗ: рд╕рдВрдЪрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддреАрди рдкрддреЗ, рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо RBP/EBP



рдкрд╣рд▓реЗ рдХрдорд╛рдВрдб RBP/EBP



рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрддреЗ рдХреЛ RBP/EBP



рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ред рдирддреАрдЬрддрди, "рд░рд┐рд▓реЛрдХреЗрдмрд▓" рдХреЛрдб рдХреА рдкреАрдврд╝реА рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА "рдареЛрд╕ рдЯреБрдХрдбрд╝рд╛" рдХреА рдкреАрдврд╝реА рд╕реЗ рд╢рд╛рдпрдж рд╣реА рдЕрд▓рдЧ рд╣реЛрдЧреАред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдФрд░ рднреА рд╕рд░рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛: рдЪреВрдВрдХрд┐ рдЕрдм рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдо рдЙрдирдХреЗ рдСрдлрд╕реЗрдЯ рдХреЛ рдареАрдХ рдЪрд░рдг рдореЗрдВ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕ рддрд░рд╣ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдЕрд╕реНрдерд╛рдпреА рд▓рд╛рдЗрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ" рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдирдХреЗ рдмрдВрдзрди рдХреЗ рдЪрд░рдг рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЕрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдЧреАред

  typedef std::map<std::string,int> stringmap; stringmap strings; int laststr = 24; //       std::vector<stringmap::iterator> strdata; //   // ... //    VAL: ID '(' ARGS ')' if (!$1.compare("echo")) { if(!$3.size()) yyerror("Input: too many arguments"); $$ = 0; foreach(i, $3) if(!i->dest) // string if(strings.count(i->str)) emit(command::echo, 0, strings[i->str]); else { strdata.push_back(strings.insert(stringmap::value_type(i->str,laststr)).first); emit(command::echo, 0, laststr); laststr += i->str.length()+1; } else emit(command::echo, i->dest, 0); } // ... // (    -) case command::hlt: i->emit(0x5b, 0x5e, 0x5f, 0x5d); // POP EBX / POP ESI / POP EDI / POP EBP i->emit(0xc3); // RET break; case command::echo: // PUSH live / MOV EDI, dst / CALL [EBP+?] / POP live foreach(rp, i->onexitp) if(*rp!=4) i->emit(0x50|(*rp-1)); if(!i->cmd.dest) { // imm / [EBP+16] i->emit14(0xbe, i->cmd.imm); i->emit(0xff, 0x55, 16); } else { if(i->known.count(i->cmd.dest)) // imm / [EBP+4] i->emit14(0xbe, i->known[i->cmd.dest]); else // dst / [EBP+8] i->emit(0x8b, 0xf0|(i->cmd.dest-1)); i->emit(0xff, 0x55, 8); } foreachr(rp, i->onexitp) if(*rp!=4) { i->emit(0x58|(*rp-1)); i->popcnt++; } break;
      
      





ELF рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджреЛ рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ: rel



рдпрд╛ rela



ред rel



рдкреНрд░рд╛рд░реВрдк рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХрд░ rel



рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ; рдЗрд╕рд▓рд┐рдП, рдЬрдм x64 рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЬрд╛ rel



, рддреЛ rel



рдкрджрд╛рд╡рдирдд рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдлрд┐рд░ рднреА, ld



рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг 64-рдмрд┐рдЯ рдХреЛрдб рдореЗрдВ rel



рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ rel



рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред



рд╣рдо рдЖрда рдорд╛рдирдХ рдЦрдВрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ: рдЦрд╛рд▓реА, .shstrtab, .strtab, .symtab, .rel.text, .rel.data, .text, .data



ред рдИрдПрд▓рдПрдл рд╣реЗрдбрд░ рдФрд░ рдкрд╣рд▓реЗ рдЫрд╣ рдЦрдВрдбреЛрдВ рдореЗрдВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реИ; рдХреЗрд╡рд▓ .text



рдФрд░ .data



рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд░реЗ .data



ред

 //  ELF #include <linux/elf.h> #if ELF_CLASS == ELFCLASS32 #define Elf_Shdr Elf32_Shdr #define Elf_Sym Elf32_Sym #define Elf_Rel Elf32_Rel #define ELF_R_INFO(s,t) (((s)<<8)+(unsigned char)(t)) #define R_32 R_386_32 #else #define Elf_Shdr Elf64_Shdr #define Elf_Sym Elf64_Sym #define Elf_Rel Elf64_Rel #define ELF_R_INFO(s,t) (((unsigned long)(s)<<32)+(t)) #define R_32 R_X86_64_32 #endif #define ST_GLOBAL_NOTYPE STB_GLOBAL<<4 // ... //    : //       //     // : PUSH EBP / PUSH EDI / PUSH ESI / PUSH EBX / MOV RBP, ... const char prolog[] = {0x55,0x57,0x56,0x53,0x48,0xc7,0xc5,0,0,0,0}; offset += sizeof(prolog); int alignment = ((offset+3)&~3) - offset; //   dword offset += alignment; const struct { elfhdr hdr; Elf_Shdr Shdr[8]; char shstrtab[64]; char strtab[24]; Elf_Sym symtab[6]; Elf_Rel reltext[1]; Elf_Rel reldata[3]; } elf = {{{ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, ELF_CLASS, ELF_DATA, EV_CURRENT}, // identification ET_REL, ELF_ARCH, EV_CURRENT, 0, 0, sizeof(elfhdr), 0, sizeof(elfhdr), 0, 0, sizeof(Elf_Shdr),8, 1}, {{0, SHT_NULL}, {1, SHT_STRTAB, 0, 0, (char*)&elf.shstrtab-(char*)&elf, sizeof(elf.shstrtab), 0, 0, 1, 0}, {11, SHT_STRTAB, 0, 0, (char*)&elf.strtab-(char*)&elf, sizeof(elf.strtab), 0, 0, 1, 0}, {19, SHT_SYMTAB, 0, 0, (char*)&elf.symtab-(char*)&elf, sizeof(elf.symtab), 2, 2, 8,sizeof(Elf_Sym)}, {27, SHT_REL, 0, 0, (char*)&elf.reltext-(char*)&elf, sizeof(elf.reltext), 3, 6, 8, sizeof(Elf_Rel)}, {37, SHT_REL, 0, 0, (char*)&elf.reldata-(char*)&elf, sizeof(elf.reldata), 3, 7, 8, sizeof(Elf_Rel)}, {47, SHT_PROGBITS, SHF_ALLOC|SHF_EXECINSTR, 0, sizeof(elf), offset, 0, 0, 4, 0}, {53, SHT_PROGBITS, SHF_ALLOC|SHF_WRITE, 0, sizeof(elf)+offset, laststr+lastspill*4, 0, 0, 4, 0}}, "\0.shstrtab\0.strtab\0.symtab\0.rel.text\0.rel.data\0.text\0.data", // shstrtab "\0main\0input\0echoi\0echos", // strtab {{}, #if ELF_CLASS == ELFCLASS32 {0, 0, 0, STT_SECTION, 0, 7}, {1, 0, 0, ST_GLOBAL_NOTYPE, 0, 6}, // main {6, 0, 0, ST_GLOBAL_NOTYPE, 0, 0}, // input {12, 0, 0, ST_GLOBAL_NOTYPE, 0, 0}, // echoi {18, 0, 0, ST_GLOBAL_NOTYPE, 0, 0}}, // echos #else {0, STT_SECTION, 0, 7, 0, 0}, {1, ST_GLOBAL_NOTYPE, 0, 6, 0, 0}, // main {6, ST_GLOBAL_NOTYPE, 0, 0, 0, 0}, // input {12, ST_GLOBAL_NOTYPE, 0, 0, 0, 0}, // echoi {18, ST_GLOBAL_NOTYPE, 0, 0, 0, 0}}, // echos #endif {{7, ELF_R_INFO(1,R_32)}}, // reltext {{0, ELF_R_INFO(3,1)}, // input {8, ELF_R_INFO(4,1)}, // echoi {16, ELF_R_INFO(5,1)}} // echos }; write(1, &elf, sizeof(elf)); //   write(1, prolog, sizeof(prolog)); foreach(i, pcode) write(1, &*i->code.begin(), i->code.size()); //   dword const char zero[24] = {}; write(1, zero, alignment); //   write(1, zero, 24); //   foreach(i, strdata) write(1, (*i)->first.c_str(), (*i)->first.length()+1); //     ftruncate(1, sizeof(elf)+offset+laststr+lastspill*4);
      
      







рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?



рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЗрдбрд░ рдореЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ред рдЗрди рд╕рдмрдХрд╛ рдорддрд▓рдм рдХреНрдпрд╛ рд╣реИ?

рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Elf32_Sym



рдФрд░ Elf64_Sym



рдПрдХ рд╣реА рдлрд╝реАрд▓реНрдб рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ #ifdef



рдХрд╛ #ifdef



рдХрд░реЗрдВред



Relocations relocations triples рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирддрд╛ рд╣реИ "рд░реАрд▓реЛрдХреЗрдЯреЗрдб рдлрд╝реАрд▓реНрдб рдХреА рдСрдлрд╕реЗрдЯ, рдкреНрд░рддреАрдХ рд╕рдВрдЦреНрдпрд╛, рдмрд╛рдзреНрдпрдХрд╛рд░реА рдкреНрд░рдХрд╛рд░ рдХреЛрдб"ред рдкрд╣рд▓рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг ( {7, ELF_R_INFO(1,R_32)}



) - рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ 7 рдореЗрдВ, рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдореЗрдВ; рдпрд╣ EBP/RBP



рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдЖрдзрд╛рд░ рдкрддрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкреНрд░рддреАрдХ рд╕рдВрдЦреНрдпрд╛ 1, рдЕрд░реНрдерд╛рддреН рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ to .data



рдЕрдиреБрднрд╛рдЧ рдХрд┐рд╕реА рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░, рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ 32 рдмрд┐рдЯреНрд╕ рд╣реИред рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛрдб рдЕрд▓рдЧ рд╣реИ: R_386_32=1



рдкрд░ R_386_32=1



, рдФрд░ x64 рдкрд░ R_X86_64_32=10



ред

рддреАрди рдЕрдиреНрдп рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдбреЗрдЯрд╛ рдореЗрдВ рд╣реИрдВ, 0.8.16 рдкрд░ рдСрдлрд╕реЗрдЯ рдореЗрдВ рддреАрди рдЖрдпрд╛рддрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдпреЗ рддреАрдиреЛрдВ рд░реАрд▓реЛрдХреЗрд╢рди рдЖрдпрд╛рддрд┐рдд рд╡рд░реНрдгреЛрдВ (рдирдВред 3,4,5) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд▓рдВрдЧрд░ рдХреЛрдб 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрд╢рд╛ рдорд╢реАрди рд╢рдмреНрдж ( R_386_32,R_X86_64_64



) рдХреЗ R_386_32,R_X86_64_64



ред



рдкреВрд░реНрдг рд╕рдВрдХрд▓рдХ рдХреЛрдб: tyomitch.net.ru/jsk.y.elf.html



рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрд╛рдпрдиреЗрд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдИрдПрд▓рдПрдл рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рд▓реЗрдХрд░ рдкрд╛рдЧрд▓ рд╣реИрдХреНрд╕; рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд┐рдХреБрдбрд╝реЗ рд╣реБрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг ред

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



рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рдЧрднрдЧ рдЖрдзреЗ рдорд╛рди рдИрдПрд▓рдПрдл рдорд╛рдирдХ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВ; рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрдорд┐рдВрджрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрд╕рдХреЗ рд╣рд╛рдереЛрдВ рдХрд╛ рдлрд▓ рд╣реИред рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рд▓рд┐рдирдХреНрд╕ рдЗрд╕ рджреБрдГрд╕реНрд╡рдкреНрди рдХреЛ рдПрдХ рдкреАрдЖрдИрдбреА тАЛтАЛрдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реИред



рджреВрд╕рд░реА рдУрд░, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рд░ рдмрд╛рдЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдЕрдХреНрд╕рд░ рдЖрдк рдПрдХ рд╣реА рдмрд╛рдд рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ?



рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛?



рдЕрдм рдЕрдВрддрд┐рдо рдмрд╛рдЗрдирд░реА рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдШрдЯрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 [tyomitch@home ~]$ as jskstd.s -o jskstd.o 
      

[tyomitch@home ~]$

[tyomitch@home ~]$ bison jsk.y

[tyomitch@home ~]$ c++ jsk.tab.c lex.yy.c -o jskc

[tyomitch@home ~]$

[tyomitch@home ~]$ ./jskc < test.jsk > code.o

[tyomitch@home ~]$ cc jskstd.o code.o

[tyomitch@home ~]$ ./a.out

0 1000,

500? (1=, 2=, 3=) 1

249? (1=, 2=, 3=) 3

! !

[tyomitch@home ~]$ objdump -d code.o

code.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: 55 push %rbp 1: 57 push %rdi 2: 56 push %rsi 3: 53 push %rbx 4: 48 c7 c5 00 00 00 00 mov $0x0,%rbp b: 33 c0 xor %eax,%eax d: b9 e8 03 00 00 mov $0x3e8,%ecx 12: 50 push %rax 13: 51 push %rcx 14: be 18 00 00 00 mov $0x18,%esi 19: ff 55 10 callq *0x10(%rbp) 1c: 59 pop %rcx 1d: 58 pop %rax 1e: 50 push %rax 1f: 51 push %rcx 20: be 00 00 00 00 mov $0x0,%esi 25: ff 55 08 callq *0x8(%rbp) 28: be 38 00 00 00 mov $0x38,%esi 2d: ff 55 10 callq *0x10(%rbp) 30: 59 pop %rcx 31: 51 push %rcx 32: be e8 03 00 00 mov $0x3e8,%esi 37: ff 55 08 callq *0x8(%rbp) 3a: be 3f 00 00 00 mov $0x3f,%esi 3f: ff 55 10 callq *0x10(%rbp) 42: 59 pop %rcx 43: 58 pop %rax 44: 3b c1 cmp %ecx,%eax 46: 0f 8f 6c 00 00 00 jg b8 <main+0xb8> 4c: 8d 14 01 lea (%rcx,%rax,1),%edx 4f: d1 fa sar %edx 51: 50 push %rax 52: 51 push %rcx 53: 52 push %rdx 54: be 64 00 00 00 mov $0x64,%esi 59: ff 55 10 callq *0x10(%rbp) 5c: 5a pop %rdx 5d: 52 push %rdx 5e: 8b f2 mov %edx,%esi 60: ff 55 08 callq *0x8(%rbp) 63: be 6c 00 00 00 mov $0x6c,%esi 68: ff 55 10 callq *0x10(%rbp) 6b: ff 55 00 callq *0x0(%rbp) 6e: 93 xchg %eax,%ebx 6f: 5a pop %rdx 70: 59 pop %rcx 71: 58 pop %rax 72: 89 85 04 01 00 00 mov %eax,0x104(%rbp) 78: 83 fb 01 cmp $0x1,%ebx 7b: 75 0b jne 88 <main+0x88> 7d: 8b 85 04 01 00 00 mov 0x104(%rbp),%eax 83: 8d 4a ff lea 0xffffffffffffffff(%rdx),%ecx 86: eb bc jmp 44 <main+0x44> 88: 83 fb 02 cmp $0x2,%ebx 8b: 75 05 jne 92 <main+0x92> 8d: 8d 42 01 lea 0x1(%rdx),%eax 90: eb b2 jmp 44 <main+0x44> 92: 8b 85 04 01 00 00 mov 0x104(%rbp),%eax 98: 83 fb 03 cmp $0x3,%ebx 9b: 75 0d jne aa <main+0xaa> 9d: be 9f 00 00 00 mov $0x9f,%esi a2: ff 55 10 callq *0x10(%rbp) a5: 5b pop %rbx a6: 5e pop %rsi a7: 5f pop %rdi a8: 5d pop %rbp a9: c3 retq aa: 50 push %rax ab: 51 push %rcx ac: be bb 00 00 00 mov $0xbb,%esi b1: ff 55 10 callq *0x10(%rbp) b4: 59 pop %rcx b5: 58 pop %rax b6: eb 8c jmp 44 <main+0x44> b8: be dd 00 00 00 mov $0xdd,%esi bd: ff 55 10 callq *0x10(%rbp) c0: 5b pop %rbx c1: 5e pop %rsi c2: 5f pop %rdi c3: 5d pop %rbp c4: c3 retq

, , , llvm. тАФ .








[tyomitch@home ~]$ as jskstd.s -o jskstd.o

[tyomitch@home ~]$

[tyomitch@home ~]$ bison jsk.y

[tyomitch@home ~]$ c++ jsk.tab.c lex.yy.c -o jskc

[tyomitch@home ~]$

[tyomitch@home ~]$ ./jskc < test.jsk > code.o

[tyomitch@home ~]$ cc jskstd.o code.o

[tyomitch@home ~]$ ./a.out

0 1000,

500? (1=, 2=, 3=) 1

249? (1=, 2=, 3=) 3

! !

[tyomitch@home ~]$ objdump -d code.o

code.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0: 55 push %rbp 1: 57 push %rdi 2: 56 push %rsi 3: 53 push %rbx 4: 48 c7 c5 00 00 00 00 mov $0x0,%rbp b: 33 c0 xor %eax,%eax d: b9 e8 03 00 00 mov $0x3e8,%ecx 12: 50 push %rax 13: 51 push %rcx 14: be 18 00 00 00 mov $0x18,%esi 19: ff 55 10 callq *0x10(%rbp) 1c: 59 pop %rcx 1d: 58 pop %rax 1e: 50 push %rax 1f: 51 push %rcx 20: be 00 00 00 00 mov $0x0,%esi 25: ff 55 08 callq *0x8(%rbp) 28: be 38 00 00 00 mov $0x38,%esi 2d: ff 55 10 callq *0x10(%rbp) 30: 59 pop %rcx 31: 51 push %rcx 32: be e8 03 00 00 mov $0x3e8,%esi 37: ff 55 08 callq *0x8(%rbp) 3a: be 3f 00 00 00 mov $0x3f,%esi 3f: ff 55 10 callq *0x10(%rbp) 42: 59 pop %rcx 43: 58 pop %rax 44: 3b c1 cmp %ecx,%eax 46: 0f 8f 6c 00 00 00 jg b8 <main+0xb8> 4c: 8d 14 01 lea (%rcx,%rax,1),%edx 4f: d1 fa sar %edx 51: 50 push %rax 52: 51 push %rcx 53: 52 push %rdx 54: be 64 00 00 00 mov $0x64,%esi 59: ff 55 10 callq *0x10(%rbp) 5c: 5a pop %rdx 5d: 52 push %rdx 5e: 8b f2 mov %edx,%esi 60: ff 55 08 callq *0x8(%rbp) 63: be 6c 00 00 00 mov $0x6c,%esi 68: ff 55 10 callq *0x10(%rbp) 6b: ff 55 00 callq *0x0(%rbp) 6e: 93 xchg %eax,%ebx 6f: 5a pop %rdx 70: 59 pop %rcx 71: 58 pop %rax 72: 89 85 04 01 00 00 mov %eax,0x104(%rbp) 78: 83 fb 01 cmp $0x1,%ebx 7b: 75 0b jne 88 <main+0x88> 7d: 8b 85 04 01 00 00 mov 0x104(%rbp),%eax 83: 8d 4a ff lea 0xffffffffffffffff(%rdx),%ecx 86: eb bc jmp 44 <main+0x44> 88: 83 fb 02 cmp $0x2,%ebx 8b: 75 05 jne 92 <main+0x92> 8d: 8d 42 01 lea 0x1(%rdx),%eax 90: eb b2 jmp 44 <main+0x44> 92: 8b 85 04 01 00 00 mov 0x104(%rbp),%eax 98: 83 fb 03 cmp $0x3,%ebx 9b: 75 0d jne aa <main+0xaa> 9d: be 9f 00 00 00 mov $0x9f,%esi a2: ff 55 10 callq *0x10(%rbp) a5: 5b pop %rbx a6: 5e pop %rsi a7: 5f pop %rdi a8: 5d pop %rbp a9: c3 retq aa: 50 push %rax ab: 51 push %rcx ac: be bb 00 00 00 mov $0xbb,%esi b1: ff 55 10 callq *0x10(%rbp) b4: 59 pop %rcx b5: 58 pop %rax b6: eb 8c jmp 44 <main+0x44> b8: be dd 00 00 00 mov $0xdd,%esi bd: ff 55 10 callq *0x10(%rbp) c0: 5b pop %rbx c1: 5e pop %rsi c2: 5f pop %rdi c3: 5d pop %rbp c4: c3 retq

, , , llvm. тАФ .











All Articles