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

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

?? trclib.c

?? vxworks的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
        doingDefault = TRUE;        nargs = trcDefaultArgs;        (* _func_printErr) ("[");        }    /* print subroutine arguments */    for (i = 0; i < nargs; ++i)        {        if (i != 0)            {            (* _func_printErr) (", ");            }        (* _func_printErr) ("%x", args[i]);        }    if (doingDefault)        {        (* _func_printErr) ("]");        }    (* _func_printErr) (")\n");    }/********************************************************************************* trcFindCall - get address from which function was called** INTERNAL* There is a bit of trouble with this routine.  Given the <returnAdrs>* for some function, we are trying to go to that text address, and then* back up the program counter and look for the CALL instruction that* invoked the function.  The problem is that there are several CALL* instruction formats that the test/filter is NOT looking for.  Thus,* this routine could easilly fail to find the address from which a* function was called.  The test/filter needs to be more sophisticated.** RETURNS: Address from which current subroutine was called, or NULL.** NOMANUAL*/LOCAL const INSTR * trcFindCall    (    const INSTR * returnAdrs  /* return address */    )    {    const INSTR * addr;       /* points to executable instruction address */    /* starting at the word preceding the return adrs, search for CALL */    for (addr = returnAdrs - 1; addr != NULL; --addr)        {        if ((DSM (addr,     CALL_INDIR0,        CALL_INDIR0_MASK) &&            (DSM (addr + 1, CALL_INDIR_REG_EAX, CALL_INDIR_REG_MASK) ||             DSM (addr + 1, CALL_INDIR_REG_EDX, CALL_INDIR_REG_MASK) ||             DSM (addr + 1, CALL_INDIR1,        CALL_INDIR1_MASK))) ||            (DSM (addr,     CALL_DIR,           CALL_DIR_MASK)))            {            return (addr);     /* found it */            }        }    return (NULL);             /* not found */    }/********************************************************************************* trcFindDest - find destination of call instruction** RETURNS:* Address to which call instruction (CALL) will branch or NULL if unknown.** NOMANUAL*/LOCAL const INSTR * trcFindDest    (    const INSTR * callAdrs    )    {    if (DSM (callAdrs, CALL_DIR, CALL_DIR_MASK))        {        /* PC-relative offset */        const int displacement = *(int *)(callAdrs + 1);        /* program counter */        const INSTR * const pc = (INSTR *)((int) callAdrs + 1 + sizeof (int));        return ((const INSTR *) ((int) pc + displacement));        }        return (NULL);    /* don't know destination */    }/********************************************************************************* trcCountArgs - find number of arguments to function** This routine finds the number of arguments passed to the called function* by examining the stack-pop at the return address.  Many compilers offer* optimization that defeats this (e.g. by coalescing stack-pops), so a return* value of 0, may mean "don't know".** INTERNAL* This routine relies on the "caller cleans the stack" convention to* imply how many 4-byte quantities were pushed on the stack for a function* call.  On IA-32, since the stack grows from high to low addresses, the* calling routine cleans the stack by adding some number of bytes to ESP* at the function return address.** RETURNS: The number of arguments passed to a function.** NOMANUAL*/LOCAL int trcCountArgs    (    const INSTR * returnAdrs    /* return address of function call */    )    {    int           nbytes;       /* stores the argument count */    /* if inst is a JMP, use the target of the JMP as the returnAdrs */    const INSTR * const addr = trcFollowJmp (returnAdrs);    if (DSM (addr,   ADDI08_0, ADDI08_0_MASK) &&        DSM (addr+1, ADDI08_1, ADDI08_1_MASK))        {        nbytes = *(char *)(addr + 2);        }    else if (DSM (addr,   ADDI32_0, ADDI32_0_MASK) &&             DSM (addr+1, ADDI32_1, ADDI32_1_MASK))        {        nbytes = *(int *)(addr + 2);        }    else if (DSM (addr,   LEAD08_0, LEAD08_0_MASK) &&             DSM (addr+1, LEAD08_1, LEAD08_1_MASK) &&             DSM (addr+2, LEAD08_2, LEAD08_2_MASK))        {        nbytes = *(char *)(addr + 3);        }    else if (DSM (addr,   LEAD32_0, LEAD32_0_MASK) &&             DSM (addr+1, LEAD32_1, LEAD32_1_MASK) &&             DSM (addr+2, LEAD08_2, LEAD08_2_MASK))        {        nbytes = *(int *)(addr + 3);        }    else        {        nbytes = 0;  /* no args, or unknown */        }    if (nbytes < 0)        nbytes = 0 - nbytes;    return (nbytes >> 2);    }/********************************************************************************* trcFindFuncStart - find the starting address of a function** This routine finds the starting address of a function by one of several ways.** If the given frame pointer points to a legitimate frame pointer, then the* long word following the frame pointer pointed to by the frame pointer should* be the return address of the function call. Then the instruction preceding* the return address would be the function call, and the address can be gotten* from there, provided that the CALL was to an pc-relative address. If it was,* use that address as the function address.  Note that a routine that is* called by other than a call-direct (e.g. indirectly) will not meet these* requirements.* * If the above check fails, we search backward from the given pc until a* PUSH %EBP MOV %ESP %EBP instruction is found.  If the compiler is putting * PUSH %EBP MOV %ESP %EBP instructions as the first instruction of ALL* subroutines, then this will reliably find the start of the routine.* However, some compilers allow routines, especially "leaf" routines that* don't call any other routines, to NOT have stack frames, which will cause* this search to fail.** In either of the above cases, the value is bounded by the nearest* routine in the system symbol table, if there is one.  If neither method* returns a legitimate value, then the value from the symbol table is use.* Note that the routine may not be in the symbol table if it is LOCAL, etc.** Note that the start of a routine that is not called by call-direct and* doesn't start with a PUSH %EBP MOV %ESP %EBP and isn't in the symbol table,* may not be possible to locate.** RETURNS:* The closest function entry-point address found at a memory location* lower than that specified program counter address.** NOMANUAL*/LOCAL const INSTR * trcFindFuncStart    (    const INSTR *  pc             /* address somewhere within the function */    )    {    const INSTR *  minPc = NULL;  /* lower bound on program counter */    int            val   = 0;     /* function address from symbol table */    /* If there is a symbol table, try to find a symbol table value     * that is <= (pc) as the lower bound for the function entry point.     * If we can find a symbol table record for a function entry point     * <= (pc), then that address may, or may not, be the entry point     * for the function (pc) is in.     */    if (sysSymTbl != NULL)        {        char *     pName = NULL;  /* function name from symbol table */        SYM_TYPE   type;          /* function type from symbol table */        if (symByValueFind (sysSymTbl, (int) pc, &pName, &val, &type) == OK)            {            minPc = (const INSTR *)(val);            }        if (pName != NULL)            {            free (pName);  /* new API requires this */            }        }    /* XXX NOTE (fix this) XXX     * Search backward for a recognizable function prologue.  If there is     * no symbol table built into the image, then (minPc) = 0.  In this     * case, the search for function prologue could possibly decrement down     * to address 0 in memory.     */    for (; pc >= minPc; --pc)        {        /* vxTaskEntry is the first code to be executed by every task         * when it comes into existence. Since nothing can come before         * vxTaskEntry, the recursion stops there.         */        if ((int) pc == (int) vxTaskEntry)            return pc;        if ((DSM (pc,     PUSH_EBP, PUSH_EBP_MASK) &&             DSM (pc + 1, MOV_ESP0, MOV_ESP0_MASK) &&             DSM (pc + 2, MOV_ESP1, MOV_ESP1_MASK)) ||            /* this CANNOT distinguish between "func" and "func.aligned" */            (DSM (pc,     PUSH_EBP,    PUSH_EBP_MASK) &&              DSM (pc + 1, PUSH_ESI,    PUSH_ESI_MASK) &&            (DSM (pc + 2, MOV_ESP_ESI, MOV_ESP_ESI_MASK) ||             DSM (pc + 3, MOV_ESP_ESI, MOV_ESP_ESI_MASK))) ||             DSM (pc,     ENTER,       ENTER_MASK)           )            {            return (pc);  /* assume we've found the function entry point */            }        }    return (minPc);       /* return the nearest function entry address */    }/********************************************************************************* trcFollowJmp - resolve any JMP instructions to final destination** This routine returns a pointer to the next non-JMP instruction to be* executed if the pc were at the specified <adrs>.  That is, if the instruction* at <adrs> is not a JMP, then <adrs> is returned.  Otherwise, if the* instruction at <adrs> is a JMP, then the destination of the JMP is* computed, which then becomes the new <adrs> which is tested as before.* Thus we will eventually return the address of the first non-JMP instruction* to be executed.** The need for this arises because compilers may put JMPs to instructions* that we are interested in, instead of the instruction itself.  For example,* optimizers may replace a stack pop with a JMP to a stack pop.  Or in very* UNoptimized code, the first instruction of a subroutine may be a JMP to* a PUSH %EBP MOV %ESP %EBP, instead of a PUSH %EBP MOV %ESP %EBP (compiler* may omit routine "post-amble" at end of parsing the routine!).  We call* this routine anytime we are looking for a specific kind of instruction,* to help handle such cases.** RETURNS: The address that a chain of branches points to.** NOMANUAL*/LOCAL const INSTR * trcFollowJmp    (    const INSTR * addr    )    {    int     displacement;        /* PC relative offset */    int     length;              /* instruction length */    /* while instruction is a JMP, get destination adrs */    while (DSM (addr, JMPD08, JMPD08_MASK) ||           DSM (addr, JMPD32, JMPD32_MASK))        {        if (DSM (addr, JMPD08, JMPD08_MASK))            {            displacement = *(char *)(addr + 1);            length = 2;            addr   = (INSTR *) (addr + length + displacement);            }        else if (DSM (addr, JMPD32, JMPD32_MASK))            {            displacement = *(int *)(addr + 1);            length = 5;            addr   = (INSTR *) (addr + length + displacement);            }        }    return (addr);    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月婷婷综合在线| 亚洲欧洲av在线| 精品一区二区在线视频| 国产精品传媒视频| 日韩欧美成人一区二区| 欧洲国内综合视频| 99精品国产99久久久久久白柏| 裸体在线国模精品偷拍| 亚洲高清免费在线| 亚洲伦理在线免费看| 欧美一区二区成人| 欧美日韩在线播放一区| 在线精品视频一区二区| 91在线播放网址| 国产精品亚洲人在线观看| 日本不卡123| 日韩国产一区二| 亚洲不卡一区二区三区| 国产精品午夜在线观看| 欧美国产1区2区| 国产女人18毛片水真多成人如厕 | 国产精品久久久久精k8 | 美女脱光内衣内裤视频久久网站| 国产精品狼人久久影院观看方式| 久久影院视频免费| 精品美女在线播放| 久久综合国产精品| 久久久久久久电影| 国产日产欧美一区| 国产精品毛片久久久久久久| 国产亚洲欧洲一区高清在线观看| 久久久久综合网| 欧美国产精品久久| 亚洲日本丝袜连裤袜办公室| 一区二区三区在线视频播放| 亚洲成人免费看| 蜜臀久久久99精品久久久久久| 轻轻草成人在线| 狠狠色综合色综合网络| 国产九色精品成人porny | 久久爱另类一区二区小说| 蜜臀国产一区二区三区在线播放 | 天天色综合成人网| 天堂精品中文字幕在线| 美女视频一区二区| 国产成人在线视频网站| 99v久久综合狠狠综合久久| 色丁香久综合在线久综合在线观看| 欧美在线你懂得| 欧美精品v日韩精品v韩国精品v| 日韩一区二区三区免费看 | 国内久久精品视频| 99精品视频一区| 在线电影国产精品| 久久影院视频免费| 亚洲精品国产高清久久伦理二区| 五月激情综合色| 国产黑丝在线一区二区三区| aa级大片欧美| 日韩欧美在线一区二区三区| 国产精品久久久久一区| 亚洲成人免费电影| 成人激情电影免费在线观看| 欧美男人的天堂一二区| 久久蜜桃香蕉精品一区二区三区| 亚洲精品第一国产综合野| 偷拍日韩校园综合在线| 欧美日韩一区小说| 一区二区欧美在线观看| 色久综合一二码| 亚洲激情男女视频| 91在线视频观看| 亚洲人妖av一区二区| 成人免费观看视频| 国产精品美女一区二区三区 | 欧美在线不卡一区| 亚洲欧美日韩人成在线播放| a4yy欧美一区二区三区| 亚洲欧美自拍偷拍色图| 99久久久久久99| 亚洲视频免费在线观看| 91亚洲精品久久久蜜桃网站| 日韩美女啊v在线免费观看| 成人av资源在线| 中文字幕日本乱码精品影院| 99热这里都是精品| 亚洲品质自拍视频网站| 欧洲日韩一区二区三区| 亚洲高清免费观看高清完整版在线观看| 色诱视频网站一区| 亚洲va欧美va天堂v国产综合| 欧美日韩国产高清一区| 久久国产精品一区二区| 久久久三级国产网站| 波多野结衣中文字幕一区| 亚洲精品美国一| 91麻豆精品国产| 国产成人综合亚洲网站| 亚洲精品视频在线观看免费| 欧美三区免费完整视频在线观看| 日韩高清不卡一区二区三区| 久久蜜桃一区二区| 色哟哟一区二区三区| 日本欧美大码aⅴ在线播放| 久久在线观看免费| 色94色欧美sute亚洲线路一ni| 亚洲国产日产av| 精品国产伦一区二区三区观看体验| 国产精品原创巨作av| 一区二区三区精品| 久久综合色综合88| 色999日韩国产欧美一区二区| 久久疯狂做爰流白浆xx| 日韩理论片一区二区| 欧美一区二区在线免费观看| 成人成人成人在线视频| 午夜不卡av免费| 国产精品久久久久影院色老大| 777色狠狠一区二区三区| 国产91富婆露脸刺激对白| 亚洲v精品v日韩v欧美v专区| 国产午夜精品一区二区三区嫩草 | 婷婷成人综合网| 国产午夜精品在线观看| 6080yy午夜一二三区久久| 懂色av一区二区在线播放| 奇米777欧美一区二区| 综合婷婷亚洲小说| 欧美不卡在线视频| 欧美唯美清纯偷拍| 波多野洁衣一区| 国产在线观看免费一区| 亚洲综合色婷婷| 亚洲欧洲另类国产综合| 精品国产乱码久久久久久蜜臀 | 国内精品久久久久影院色 | 精品日韩一区二区三区免费视频| 色综合久久久久网| 成人美女在线观看| 国产做a爰片久久毛片| 热久久免费视频| 日韩精品1区2区3区| 亚洲色图一区二区| 国产精品福利影院| 国产网站一区二区| 亚洲精品一区二区三区福利 | 国产高清一区日本| 韩国一区二区视频| 国产主播一区二区| 国产曰批免费观看久久久| 日韩电影免费在线观看网站| 日日嗨av一区二区三区四区| 亚洲国产精品久久人人爱| 亚洲一区二区精品3399| 亚洲国产美女搞黄色| 亚洲综合在线五月| 亚洲影视资源网| 亚洲成av人片一区二区梦乃| 亚洲国产日韩a在线播放性色| 亚洲大片在线观看| 视频在线观看一区| 日本亚洲三级在线| 另类成人小视频在线| 久久草av在线| 国产福利一区在线| 高清久久久久久| 91福利在线看| 91.xcao| 欧美草草影院在线视频| 日本一区二区三区高清不卡| 亚洲欧美在线视频观看| 一区二区三区丝袜| 日本免费在线视频不卡一不卡二 | 91香蕉国产在线观看软件| 色噜噜偷拍精品综合在线| 4438亚洲最大| www久久精品| 国产精品无遮挡| 亚洲第一二三四区| 国产资源精品在线观看| 色综合久久久久综合| 欧美一级高清大全免费观看| 国产午夜久久久久| 夜夜嗨av一区二区三区| 麻豆精品视频在线观看免费| 成人黄色软件下载| 欧美在线观看视频一区二区| 精品99999| 亚洲免费观看在线视频| 免费观看成人av| 99久久精品国产观看| 91麻豆精品91久久久久久清纯 | 午夜精品福利在线| 国产美女在线观看一区| 在线观看欧美精品| 久久久久99精品一区| 午夜精品久久久久久久久久久| 国产电影一区在线| 欧美日韩精品一二三区| 中文字幕国产一区|