亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? disasm.c

?? PE Monitor是一個小調試器和反匯編器
?? C
?? 第 1 頁 / 共 4 頁
字號:
  if (size<1+addrsize+2) {
    da->error=DAE_CROSS; return; };
  dispsize=addrsize; immsize=2;        // Non-trivial but allowed interpretation
  if (mode<DISASM_DATA) return;
  if (addrsize==2) {
    addr=*(ushort *)(cmd+1);
    seg=*(ushort *)(cmd+3); }
  else {
    addr=*(ulong *)(cmd+1);
    seg=*(ushort *)(cmd+5); };
  da->jmpconst=addr;
  da->immconst=seg;
  if (addr==0 || seg==0) da->zeroconst=1;
  if (mode>=DISASM_FILE) {
    nresult+=sprintf(da->result+nresult,"%s %04X:%08X",
    (lowercase==0?"FAR":"far"),seg,addr);
  };
};

// Decode segment register. In flat model, operands of this type are seldom.
static void DecodeSG(int index) {
  int i;
  if (mode<DISASM_DATA) return;
  index&=0x07;
  if (index>=6) softerror=DAE_BADSEG;  // Undefined segment register
  if (mode>=DISASM_FILE) {
    i=sprintf(da->result+nresult,"%s",segname[index]);
    if (lowercase) strlwr(da->result+nresult);
    nresult+=i;
  };
};

// Decode control register addressed in R part of ModRM byte. Operands of
// this type are extremely rare. Contents of control registers are accessible
// only from privilege level 0, so I cannot dump them here.
static void DecodeCR(int index) {
  hasrm=1;
  if (mode>=DISASM_FILE) {
    index=(index>>3) & 0x07;
    nresult+=sprintf(da->result+nresult,"%s",crname[index]);
    if (lowercase) strlwr(da->result+nresult);
  };
};

// Decode debug register addressed in R part of ModRM byte. Operands of
// this type are extremely rare. I can dump only those debug registers
// available in CONTEXT structure.
static void DecodeDR(int index) {
  int i;
  hasrm=1;
  if (mode>=DISASM_FILE) {
    index=(index>>3) & 0x07;
    i=sprintf(da->result+nresult,"%s",drname[index]);
    if (lowercase) strlwr(da->result+nresult);
    nresult+=i;
  };
};

// Skips 3DNow! operands and extracts command suffix. Returns suffix or -1 if
// suffix lies outside the memory block. This subroutine assumes that cmd still
// points to the beginning of 3DNow! command (i.e. to the sequence of two bytes
// 0F, 0F).
static int Get3dnowsuffix(void) {
  int c,sib;
  ulong offset;
  if (size<3) return -1;               // Suffix outside the memory block
  offset=3;
  c=cmd[2] & 0xC7;                     // Leave only Mod and M fields
  // Register in ModM - general-purpose, MMX or 3DNow!
  if ((c & 0xC0)==0xC0)
    ;
  // 16-bit addressing mode, SIB byte is never used here.
  else if (addrsize==2) {
    if (c==0x06)                       // Special case of immediate address
      offset+=2;
    else if ((c & 0xC0)==0x40)         // 8-bit signed displacement
      offset++;
    else if ((c & 0xC0)==0x80)         // 16-bit unsigned displacement
      offset+=2;
    ; }
  // Immediate 32-bit address.
  else if (c==0x05)                    // Special case of immediate address
    offset+=4;
  // 32-bit address with SIB byte.
  else if ((c & 0x07)==0x04) {         // SIB addresation
    if (size<4) return -1;             // Suffix outside the memory block
    sib=cmd[3]; offset++;
    if (c==0x04 && (sib & 0x07)==0x05)
      offset+=4;                       // Immediate address without base
    else if ((c & 0xC0)==0x40)         // 8-bit displacement
      offset+=1;
    else if ((c & 0xC0)==0x80)         // 32-bit dislacement
      offset+=4;
    ; }
  // 32-bit address without SIB byte
  else if ((c & 0xC0)==0x40)
    offset+=1;
  else if ((c & 0xC0)==0x80)
    offset+=4;
  if (offset>=size) return -1;         // Suffix outside the memory block
  return cmd[offset];
};

// Function checks whether 80x86 flags meet condition set in the command.
// Returns 1 if condition is met, 0 if not and -1 in case of error (which is
// not possible).
int Checkcondition(int code,ulong flags) {
  ulong cond,temp;
  switch (code & 0x0E) {
    case 0:                            // If overflow
      cond=flags & 0x0800; break;
    case 2:                            // If below
      cond=flags & 0x0001; break;
    case 4:                            // If equal
      cond=flags & 0x0040; break;
    case 6:                            // If below or equal
      cond=flags & 0x0041; break;
    case 8:                            // If sign
      cond=flags & 0x0080; break;
    case 10:                           // If parity
      cond=flags & 0x0004; break;
    case 12:                           // If less
      temp=flags & 0x0880;
      cond=(temp==0x0800 || temp==0x0080); break;
    case 14:                           // If less or equal
      temp=flags & 0x0880;
      cond=(temp==0x0800 || temp==0x0080 || (flags & 0x0040)!=0); break;
    default: return -1;                // Internal error, not possible!
  };
  if ((code & 0x01)==0) return (cond!=0);
  else return (cond==0);               // Invert condition
};

ulong Disasm(char *src,ulong srcsize,ulong srcip,
  t_disasm *disasm,int disasmmode) {
  int i,j,isprefix,is3dnow,repeated,operand,mnemosize,arg;
  ulong u,code;
  int lockprefix;                      // Non-zero if lock prefix present
  int repprefix;                       // REPxxx prefix or 0
  int cxsize;
  char name[TEXTLEN],*pname;
  const t_cmddata *pd,*pdan;
  // Prepare disassembler variables and initialize structure disasm.
  datasize=addrsize=4;                 // 32-bit code and data segments only!
  segprefix=SEG_UNDEF;
  hasrm=hassib=0; dispsize=immsize=0;
  lockprefix=0; repprefix=0;
  ndump=0; nresult=0;
  cmd=src; size=srcsize; pfixup=NULL;
  softerror=0; is3dnow=0;
  da=disasm;
  da->ip=srcip;
  da->comment[0]='\0';
  da->cmdtype=C_BAD; da->nprefix=0;
  da->memtype=DEC_UNKNOWN; da->indexed=0;
  da->jmpconst=0; da->jmptable=0;
  da->adrconst=0; da->immconst=0;
  da->zeroconst=0;
  da->fixupoffset=0; da->fixupsize=0;
  da->warnings=0;
  da->error=DAE_NOERR;
  mode=disasmmode;                     // No need to use register contents
  // Correct 80x86 command may theoretically contain up to 4 prefixes belonging
  // to different prefix groups. This limits maximal possible size of the
  // command to MAXCMDSIZE=16 bytes. In order to maintain this limit, if
  // Disasm() detects second prefix from the same group, it flushes first
  // prefix in the sequence as a pseudocommand.
  u=0; repeated=0;
  while (size>0) {
    isprefix=1;                        // Assume that there is some prefix
    switch (*cmd) {
      case 0x26: if (segprefix==SEG_UNDEF) segprefix=SEG_ES;
        else repeated=1; break;
      case 0x2E: if (segprefix==SEG_UNDEF) segprefix=SEG_CS;
        else repeated=1; break;
      case 0x36: if (segprefix==SEG_UNDEF) segprefix=SEG_SS;
        else repeated=1; break;
      case 0x3E: if (segprefix==SEG_UNDEF) segprefix=SEG_DS;
        else repeated=1; break;
      case 0x64: if (segprefix==SEG_UNDEF) segprefix=SEG_FS;
        else repeated=1; break;
      case 0x65: if (segprefix==SEG_UNDEF) segprefix=SEG_GS;
        else repeated=1; break;
      case 0x66: if (datasize==4) datasize=2;
        else repeated=1; break;
      case 0x67: if (addrsize==4) addrsize=2;
        else repeated=1; break;
      case 0xF0: if (lockprefix==0) lockprefix=0xF0;
        else repeated=1; break;
      case 0xF2: if (repprefix==0) repprefix=0xF2;
        else repeated=1; break;
      case 0xF3: if (repprefix==0) repprefix=0xF3;
        else repeated=1; break;
      default: isprefix=0; break; };
    if (isprefix==0 || repeated!=0)
      break;                           // No more prefixes or duplicated prefix
    if (mode>=DISASM_FILE)
      ndump+=sprintf(da->dump+ndump,"%02X:",*cmd);
    da->nprefix++;
    cmd++; srcip++; size--; u++; };
  // We do have repeated prefix. Flush first prefix from the sequence.
  if (repeated) {
    if (mode>=DISASM_FILE) {
      da->dump[3]='\0';                // Leave only first dumped prefix
      da->nprefix=1;
      switch (cmd[-(long)u]) {
        case 0x26: pname=(char *)(segname[SEG_ES]); break;
        case 0x2E: pname=(char *)(segname[SEG_CS]); break;
        case 0x36: pname=(char *)(segname[SEG_SS]); break;
        case 0x3E: pname=(char *)(segname[SEG_DS]); break;
        case 0x64: pname=(char *)(segname[SEG_FS]); break;
        case 0x65: pname=(char *)(segname[SEG_GS]); break;
        case 0x66: pname="DATASIZE"; break;
        case 0x67: pname="ADDRSIZE"; break;
        case 0xF0: pname="LOCK"; break;
        case 0xF2: pname="REPNE"; break;
        case 0xF3: pname="REPE"; break;
        default: pname="?"; break; };
      nresult+=sprintf(da->result+nresult,"PREFIX %s:",pname);
      if (lowercase) strlwr(da->result);
      if (extraprefix==0) strcpy(da->comment,"Superfluous prefix"); };
    da->warnings|=DAW_PREFIX;
    if (lockprefix) da->warnings|=DAW_LOCK;
    da->cmdtype=C_RARE;
    return 1;                          // Any prefix is 1 byte long
  };
  // If lock prefix available, display it and forget, because it has no
  // influence on decoding of rest of the command.
  if (lockprefix!=0) {
    if (mode>=DISASM_FILE) nresult+=sprintf(da->result+nresult,"LOCK ");
    da->warnings|=DAW_LOCK; };
  // Fetch (if available) first 3 bytes of the command, add repeat prefix and
  // find command in the command table.
  code=0;
  if (size>0) *(((char *)&code)+0)=cmd[0];
  if (size>1) *(((char *)&code)+1)=cmd[1];
  if (size>2) *(((char *)&code)+2)=cmd[2];
  if (repprefix!=0)                    // RER/REPE/REPNE is considered to be
    code=(code<<8) | repprefix;        // part of command.
  if (decodevxd && (code & 0xFFFF)==0x20CD)
    pd=&vxdcmd;                        // Decode VxD call (Win95/98)
  else {
    for (pd=cmddata; pd->mask!=0; pd++) {
      if (((code^pd->code) & pd->mask)!=0) continue;
      if (mode>=DISASM_FILE && shortstringcmds &&
        (pd->arg1==MSO || pd->arg1==MDE || pd->arg2==MSO || pd->arg2==MDE))
        continue;                      // Search short form of string command
      break;
    };
  };
  if ((pd->type & C_TYPEMASK)==C_NOW) {
    // 3DNow! commands require additional search.
    is3dnow=1;
    j=Get3dnowsuffix();
    if (j<0)
      da->error=DAE_CROSS;
    else {
      for ( ; pd->mask!=0; pd++) {
        if (((code^pd->code) & pd->mask)!=0) continue;
        if (((uchar *)&(pd->code))[2]==j) break;
      };
    };
  };
  if (pd->mask==0) {                   // Command not found
    da->cmdtype=C_BAD;
    if (size<2) da->error=DAE_CROSS;
    else da->error=DAE_BADCMD; }
  else {                               // Command recognized, decode it
    da->cmdtype=pd->type;
    cxsize=datasize;                   // Default size of ECX used as counter
    if (segprefix==SEG_FS || segprefix==SEG_GS || lockprefix!=0)
      da->cmdtype|=C_RARE;             // These prefixes are rare
    if (pd->bits==PR)
      da->warnings|=DAW_PRIV;          // Privileged command (ring 0)
    else if (pd->bits==WP)
      da->warnings|=DAW_IO;            // I/O command
    // Win32 programs usually try to keep stack dword-aligned, so INC ESP
    // (44) and DEC ESP (4C) usually don't appear in real code. Also check for
    // ADD ESP,imm and SUB ESP,imm (81,C4,imm32; 83,C4,imm8; 81,EC,imm32;
    // 83,EC,imm8).
    if (cmd[0]==0x44 || cmd[0]==0x4C ||
      (size>=3 && (cmd[0]==0x81 || cmd[0]==0x83) &&
      (cmd[1]==0xC4 || cmd[1]==0xEC) && (cmd[2] & 0x03)!=0)
    ) {
      da->warnings|=DAW_STACK;
      da->cmdtype|=C_RARE; };
    // Warn also on MOV SEG,... (8E...). Win32 works in flat mode.
    if (cmd[0]==0x8E)
      da->warnings|=DAW_SEGMENT;
    // If opcode is 2-byte, adjust command.
    if (pd->len==2) {
      if (size==0) da->error=DAE_CROSS;
      else {
        if (mode>=DISASM_FILE)
          ndump+=sprintf(da->dump+ndump,"%02X",*cmd);
        cmd++; srcip++; size--;
      }; };
    if (size==0) da->error=DAE_CROSS;
    // Some commands either feature non-standard data size or have bit which
    // allowes to select data size.
    if ((pd->bits & WW)!=0 && (*cmd & WW)==0)
      datasize=1;                      // Bit W in command set to 0
    else if ((pd->bits & W3)!=0 && (*cmd & W3)==0)
      datasize=1;                      // Another position of bit W
    else if ((pd->bits & FF)!=0)
      datasize=2;                      // Forced word (2-byte) size
    // Some commands either have mnemonics which depend on data size (8/16 bits
    // or 32 bits, like CWD/CDQ), or have several different mnemonics (like
    // JNZ/JNE). First case is marked by either '&' (mnemonic depends on
    // operand size) or '$' (depends on address size). In the second case,
    // there is no special marker and disassembler selects main mnemonic.
    if (mode>=DISASM_FILE) {
      if (pd->name[0]=='&') mnemosize=datasize;
      else if (pd->name[0]=='$') mnemosize=addrsize;
      else mnemosize=0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区自拍| 欧美精品一区二区三区蜜桃 | 国产精品视频一二| 国产suv精品一区二区6| 国产精品传媒在线| 在线视频欧美精品| 午夜精品福利一区二区蜜股av| 67194成人在线观看| 精品在线你懂的| 中文字幕第一页久久| 91久久精品日日躁夜夜躁欧美| 亚洲成av人在线观看| 欧美变态tickling挠脚心| 国产精品77777竹菊影视小说| 国产精品久久久久久久久动漫| 在线观看日产精品| 久久成人免费网| 自拍偷拍欧美激情| 91精品欧美福利在线观看| 国产精品2024| 亚洲国产视频a| 欧美成人aa大片| 91亚洲精品乱码久久久久久蜜桃| 日韩精品一级中文字幕精品视频免费观看| 精品少妇一区二区| 91视频免费观看| 九一久久久久久| 亚洲一二三区在线观看| 欧美精品一区二| 欧美日韩精品一区二区| 福利一区在线观看| 日韩极品在线观看| 亚洲视频一区二区在线观看| 日韩三级在线观看| 91免费观看国产| 国产精品2024| 美女性感视频久久| 亚洲国产视频直播| 中文字幕日韩精品一区| 日韩欧美亚洲国产精品字幕久久久| 成人国产精品视频| 久久se精品一区精品二区| 亚洲小说欧美激情另类| 欧美国产精品一区二区三区| 欧美一级片免费看| 欧美性受xxxx| 91福利小视频| 91在线视频播放| 国产v日产∨综合v精品视频| 麻豆91小视频| 午夜精品久久久久久久99水蜜桃 | 成人av网站免费观看| 男男视频亚洲欧美| 亚洲第一激情av| 伊人一区二区三区| 中文字幕一区二区三区视频| 久久久久久久久久久电影| 91麻豆精品国产91久久久更新时间| 色综合久久综合网| 99久久伊人精品| 成人精品在线视频观看| 国产a区久久久| 国产东北露脸精品视频| 美女精品自拍一二三四| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品视频在线观看免费| 国产精品久久久一本精品| 国产三区在线成人av| 精品盗摄一区二区三区| 日韩欧美在线综合网| 日韩欧美一级精品久久| 日韩欧美一卡二卡| 日韩欧美一级在线播放| 精品免费一区二区三区| 欧美精品一区二区在线播放| 日韩美女视频在线| ww亚洲ww在线观看国产| 久久亚洲影视婷婷| 中文成人av在线| 国产精品国产自产拍高清av王其| 中文av一区特黄| 成人av手机在线观看| 91麻豆精品视频| 777奇米四色成人影色区| 精品国产免费一区二区三区香蕉| 中文字幕高清不卡| 精品久久久久久久久久久久久久久久久 | 成人性生交大合| 香蕉久久夜色精品国产使用方法| 久久久国产精品不卡| 欧美一区在线视频| 91精品国产91久久久久久一区二区| 欧美日韩高清一区| 日韩欧美一区中文| 久久精品视频在线免费观看| 国产精品久久久久久久蜜臀| 亚洲天堂av一区| 亚洲一二三专区| 久久99精品久久只有精品| 国产成人av电影在线| 91影视在线播放| 欧美一卡在线观看| 久久久久久久久久看片| 亚洲欧美日韩人成在线播放| 日韩精品一区第一页| 国产一区二区三区免费观看| 成人av片在线观看| 在线成人av影院| 久久亚区不卡日本| 亚洲伦理在线免费看| 日本欧美大码aⅴ在线播放| 国产精品一品二品| 色婷婷精品大在线视频| 69久久夜色精品国产69蝌蚪网| 久久女同互慰一区二区三区| 亚洲精品日韩一| 男人的j进女人的j一区| 成人短视频下载| 欧美日韩一二三区| 国产日韩欧美一区二区三区乱码 | 欧美在线色视频| 精品国产乱码91久久久久久网站| 亚洲三级在线免费| 另类小说综合欧美亚洲| 一本一道综合狠狠老| 久久免费视频色| 天天操天天干天天综合网| 成人av在线资源| 日韩精品一区二区三区中文不卡| 综合欧美一区二区三区| 国产一区二区在线免费观看| 欧美日韩在线一区二区| 一区免费观看视频| 国产又黄又大久久| 欧美一区二区观看视频| 依依成人精品视频| 不卡一二三区首页| 久久日韩粉嫩一区二区三区| 日本网站在线观看一区二区三区 | 91成人在线免费观看| 欧美激情一区二区三区不卡| 美女在线观看视频一区二区| 欧美亚洲另类激情小说| 国产精品欧美一级免费| 国产一区二区三区观看| 日韩欧美视频一区| 亚洲第一在线综合网站| 在线观看亚洲a| 亚洲欧洲日韩av| 成人一级片在线观看| 精品国产一区a| 美腿丝袜亚洲一区| 欧美一级高清片在线观看| 日日噜噜夜夜狠狠视频欧美人 | 日韩福利视频导航| 在线观看亚洲精品视频| 一区二区三区波多野结衣在线观看| 成人精品在线视频观看| 国产精品无人区| 粉嫩一区二区三区在线看| 久久精品视频免费| 丁香六月综合激情| 中文字幕免费在线观看视频一区| 国产麻豆日韩欧美久久| 26uuu成人网一区二区三区| 久久国产精品72免费观看| 欧美xxxxxxxxx| 久草精品在线观看| 久久夜色精品一区| 国产999精品久久久久久绿帽| 久久久久久久精| 丰满放荡岳乱妇91ww| 国产精品久久久久久久久动漫 | 99久久综合色| 中文字幕免费观看一区| 成人av综合一区| 中文字幕一区二区三| 91美女蜜桃在线| 亚洲一区二区在线视频| 欧美日韩另类国产亚洲欧美一级| 日韩中文字幕区一区有砖一区| 91麻豆精品国产自产在线| 另类专区欧美蜜桃臀第一页| 精品奇米国产一区二区三区| 国产成人亚洲综合a∨猫咪| 亚洲国产精品黑人久久久| 91猫先生在线| 亚洲va欧美va人人爽午夜| 日韩一区二区三区免费看| 精品一区二区三区免费| 欧美国产日韩精品免费观看| 97se亚洲国产综合在线| 亚洲国产精品一区二区久久| 日韩欧美国产高清| 成人午夜免费电影| 亚洲午夜av在线| xnxx国产精品| 色婷婷国产精品综合在线观看| 午夜视频一区在线观看| 2021国产精品久久精品|