精华内容
下载资源
问答
  • 汇编跳转指令集
    千次阅读
    2021-01-17 18:06:48

    虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。

    条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。一些条件跳转指令只是简单测试符号位(sign)、进位位(carry)、溢出位(overflow)、零标志(zero)位的设置。例如,在执行一条sh1指令后,您需要测试进位标志,来判断sh1是否从操作数的高地址位移出一位。类似地,也可以在一条test指令后测试零标志位,来判断指定的位是否为1。大多数情况,在cmp指令之后执行条件跳转指令。cmp指令设置标志位,以便判断小于、大于、等于等情况。

    条件跳转指令形式如下:

    Jcc label;

    其中,Jcc中的“cc”,必须用表示测试条件类型的字符序列替换。这些字符和setcc指令使用的一样。例如,“js”表示根据符号(sign)标志是否被置位来决定是否跳转。一个典型的js指令如下:

    js ValueIsNegative ;

    在这个示例中,如果符号(sign)标志被置位,则js指令将控制转移到ValueIsNegative语句标号处;如果符号标志清零,则将控制直接转移给js指令后的指令。

    与无条件jmp指令不同,条件跳转指令不提供间接跳转的形式。惟一允许的形式是跳转到程序中某一标号处。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。

    注意:Intel文档为许多条件跳转指令定义了多种替代名或指令别名。表7-1、7-2和7-3列出了每个指令所有的别名。这些表格也列出了表示相反分支的指令。很快您将明白这些相反分支指令的作用。

    表7-1 测试标志位的JCC指令

    指 令

    描 述

    条 件

    别 名

    相 反 指 令

    JC

    如果进位位被置位则跳转

    进位标志=1

    JB,JNAE

    JNC

    JNC

    如果进位位没有置位则跳转

    进位标志=0

    JNB,JAE

    JC

    JZ

    如果0标志被置位则跳转

    0标志=1

    JE

    JNZ

    JNZ

    如果0标志没有置位则跳转

    0标志=0

    JNE

    JZ

    (续表)

    指 令

    描 述

    条 件

    别 名

    相反指令

    JS

    如果符号位被置位则跳转

    符号标志=1

    JNS

    JNS

    如果符号位没有被置位则跳转

    符号标志=0

    JS

    JO

    如果溢出标志置位则跳转

    溢出标志=1

    JNO

    JNO

    如果溢出标志没有置位则跳转

    溢出标志=0

    JO

    JP

    如果奇偶校验位被置位则跳转

    奇偶校验标志=1

    JPE

    JNP

    JPE

    如果奇偶校验位为偶校验则跳转

    奇偶校验标志=1

    JP

    JPO

    JNP

    如果奇偶校验位没有被置位则跳转

    奇偶校验标志=0

    JPO

    JP

    JPO

    如果奇偶校验位为奇校验则跳转

    奇偶校验标志=0

    JNP

    JPE

    表7-2 使用无符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JA

    如果超过(>)则跳转

    进位标志=0,0标志=0

    JNBE

    JNA

    JNBE

    如果不低于或等于(不 <=)则跳转

    进位标志=0,0标志=0

    JA

    JBE

    JAE

    如果超过或等于(>=)则跳转

    进位标志=0

    JNC,JNB

    JNAE

    JNB

    如果不低于则跳转(不

    进位标志=0

    JNC,JAE

    JB

    JB

    如果低于(

    进位标志=1

    JC,JNAE

    JNB

    JNAE

    如果不超过或等于(不>=)则跳转

    进位标志=1

    JC,JB

    JAE

    JBE

    如果低于或等于(<=)则跳转

    进位标志=1或0标志=1

    JNA

    JNBE

    JNA

    如果不超过(不>)则跳转

    进位标志=1或0标志=1

    JBE

    JA

    JE

    如果相等(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不相等(<>)则跳转

    0标志=0

    JNZ

    JE

    表7-3 使用有符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JG

    如果大于(>)则跳转

    符号标志=溢出标志或0标志=0

    JNLE

    JNG

    JNLE

    如果小于或等于(<=)则跳转

    符号标志=溢出标志或0标志=0

    JG

    JLE

    JGE

    如果大于或等于(>=)则跳转

    符号标志=溢出标志

    JNL

    JGE

    JNL

    如果不小于(不

    符号标志=溢出标志

    JGE

    JL

    JL

    如果小于(

    符号标志<>溢出标志

    JNGE

    JNL

    JNGE

    如果大于或等于(>=)跳转

    符号标志<>溢出标志

    JL

    JGE

    JLE

    如果小于或等于(<=)跳转

    符号标志<>溢出标志或0标志=1

    JNG

    JNLE

    JNG

    如果不大于(不>)则跳转

    符号标志<>溢出标志或0标志=1

    JLE

    JG

    JE

    如果等于(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不等于(<>)则跳转

    0标志=0

    JNZ

    JE

    接下来将对“相反指令”一列进行简单的说明。在许多情况下,需要产生与某条分支指令条件相反的分支(在本章后面会给出示例),即相反分支。除了两个例外,都可以按下面的简单规则(后面统称为N/No N规则)产生相反分支:

    ● 如果Jcc的第二个字母不是“n”,则在“j”后面插入一个“n”。例如:je对应为jne,jl对应为jnl。

    ● 如果Jcc的第二个字母是“n”,则去掉指令中的“n”。例如:jng对应为jg,jne对应为je。

    不遵循这两条规则的两个例外是jpe(奇偶位为偶跳转)和jpo(奇偶位为奇跳转)。这两个例外并不会导致什么问题,因为:(a)很少需要测试奇偶标志;(b)可以使用别名jp和jnp替代jpe和jpo。而“N/No N”规则对jp和jnp是适用的。

    虽然jge是jl的相反指令,但是建议使用jnl作为jl的相反指令。因为很容易误认为“大于是小于的相反”,从而把jg当作jl的相反指令。您可以坚持使用“N/No N”规则以避免这种混淆。

    80x86条件跳转指令提供了这样的能力:根据判断条件将程序流分支到两条路径中的某一条。例如,要实现:如果BX等于CX,则寄存器AX的值加1。可以使用下面的代码来完成该功能:

    cmp(bx,cx );

    jne SkipStmts;

    inc(ax );

    SkipStmts:

    其中的诀窍是使用相反分支指令来跳过在条件满足的情况下需要执行的指令。请坚持使用前面介绍的“N/no N”规则来选择相反分支指令。

    使用条件跳转指令还可以实现循环。例如,下面的代码序列实现了从用户输入读入一串字符,并将字符存储到一组连续的单元中,直到用户输入回车键。

    mov(0,edi );

    RdLnLoop:

    stdin.getc(); //Read a character into the AL register.

    mov(al,Input [edi])); //Store away the character.

    inc(edi ); //Move on to the next character.

    cmp(al,stdio.cr ); //See if the user pressed Enter.

    jne RdLnLoop;

    与setcc指令类似,条件跳转指令分为两类—— 测试特殊处理器标志位的条件跳转指令(例如jz、jc、jno)和测试某些条件(小于、大于等)的条件跳转指令。当测试某个条件时,条件跳转指令通常紧跟在一个cmp指令之后。cmp指令设置标志位后,如果是无符号数比较,使用ja、jae、jb、jbe、je或jne等指令测试这些标志来判断是否小于、小于等于、等于、不等于、大于或大于等于;如果是有符号数比较,则使用jl、jle、je、jne、jg、jge指令。

    条件跳转指令测试标志位,但不影响标志位。

    更多相关内容
  • 以下为JCXZ和JECXZ 、JMP:

    以下为JCXZ和JECXZ 、JMP:

    展开全文
  • 汇编指令集太多,如果不用就会忘记,所以将i处理器官方的指令集大全写到博客上,有需要的人可以参考一下!---------- 一、数据传输指令 ----------------------------------------------------它们在存贮器和寄存器...

    汇编指令集太多,如果不用就会忘记,所以将i处理器官方的指令集大全写到博客上,有需要的人可以参考一下!

    ---------- 一、数据传输指令 ----------------------------------------------------

    它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.

    1. 通用数据传送指令

    MOV 传送字或字节.

    MOVSX 先符号扩展,再传送.

    MOVZX 先零扩展,再传送.

    PUSH 把字压入堆栈.

    POP 把字弹出堆栈.

    PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.

    POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.

    PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.

    POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.

    BSWAP 交换32位寄存器里字节的顺序

    XCHG 交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)

    CMPXCHG 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)

    XADD 先交换再累加.(结果在第一个操作数里)

    XLAT 字节查表转换.----BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)

    2. 输入输出端口传送指令.

    IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )

    OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.

    3. 目的地址传送指令.

    LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.

    LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.

    LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.

    LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.

    LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.

    LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.

    4. 标志传送指令.

    LAHF 标志寄存器传送,把标志装入AH.

    SAHF 标志寄存器传送,把AH内容装入标志寄存器.

    PUSHF 标志入栈.

    POPF 标志出栈.

    PUSHD 32位标志入栈.

    POPD 32位标志出栈.

    ---------- 二、算术运算指令 ------------------------------------------

    ADC 带进位加法.

    INC 加 1.

    AAA 加法的ASCII码调整.

    DAA 加法的十进制调整.

    SUB 减法.

    SBB 带借位减法.

    DEC 减 1.

    NEG 求反(以 0 减之).

    CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).

    AAS 减法的ASCII码调整.

    DAS 减法的十进制调整.

    MUL 无符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),

    IMUL 整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),

    AAM 乘法的ASCII码调整.

    DIV 无符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).

    IDIV 整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).

    AAD 除法的ASCII码调整.

    CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)

    CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)

    CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)

    CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)

    ---------- 三、逻辑运算指令 ------------------------------------

    AND 与运算.

    OR 或运算.

    XOR 异或运算.

    NOT 取反.

    TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).

    SHL 逻辑左移.

    SAL 算术左移.(=SHL)

    SHR 逻辑右移.

    SAR 算术右移.(=SHR)

    ROL 循环左移.

    ROR 循环右移.

    RCL 通过进位的循环左移.

    RCR 通过进位的循环右移.

    以上八种移位指令,其移位次数可达255次.

    移位一次时, 可直接用操作码. 如 SHL AX,1.

    移位>1次时, 则由寄存器CL给出移位次数.

    如 MOV CL,04 SHL AX,CL

    ---------- 四、串指令 ---------------------------------------------

    DS:SI 源串段寄存器 :源串变址.

    ES:DI 目标串段寄存器:目标串变址.

    CX 重复次数计数器.

    AL/AX 扫描值.

    D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.

    Z标志 用来控制扫描或比较操作的结束.

    MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )

    CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )

    SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.

    LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )

    STOS 保存串.是LODS的逆过程.

    REP 当CX/ECX<>0时重复.

    REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.

    REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.

    REPC 当CF=1且CX/ECX<>0时重复.

    REPNC 当CF=0且CX/ECX<>0时重复.

    ---------- 五、程序转移指令 -------------------------------

    1. 无条件转移指令 (长转移)

    JMP 无条件转移指令

    CALL 过程调用

    RET/RETF 过程返回.

    2. 条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1

    JA/JNBE 不小于或不等于时转移.

    JAE/JNB 大于或等于转移.

    JB/JNAE 小于转移.

    JBE/JNA 小于或等于转移.

    以上四条,测试无符号整数运算的结果(标志C和Z).

    JG/JNLE 大于转移.

    JGE/JNL 大于或等于转移.

    JL/JNGE 小于转移.

    JLE/JNG 小于或等于转移.

    以上四条,测试带符号整数运算的结果(标志S,O和Z).

    JE/JZ 等于转移.

    JNE/JNZ 不等于时转移.

    JC 有进位时转移.

    JNC 无进位时转移.

    JNO 不溢出时转移.

    JNP/JPO 奇偶性为奇数时转移.

    JNS 符号位为 "0" 时转移.

    JO 溢出转移.

    JP/JPE 奇偶性为偶数时转移.

    JS 符号位为 "1" 时转移.

    3. 循环控制指令(短转移)

    LOOP CX不为零时循环.

    LOOPE/LOOPZ CX不为零且标志Z=1时循环.

    LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.

    JCXZ CX为零时转移.

    JECXZ ECX为零时转移.

    4. 中断指令

    INT 中断指令

    INTO 溢出中断

    IRET 中断返回

    5. 处理器控制指令

    HLT 处理器暂停, 直到出现中断或复位信号才继续.

    WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.

    ESC 转换到外处理器.

    LOCK 封锁总线.

    NOP 空操作.

    STC 置进位标志位.

    CLC 清进位标志位.

    CMC 进位标志取反.

    STD 置方向标志位.

    CLD 清方向标志位.

    STI 置中断允许位.

    CLI 清中断允许位.

    ---------- 六、伪指令 ------------------------------------

    DW 定义字(2字节).

    PROC 定义过程.

    ENDP 过程结束.

    SEGMENT 定义段.

    ASSUME 建立段寄存器寻址.

    ENDS 段结束.

    END 程序结束.

    ---------- 七、处理机控制指令:标志处理指令 -----------

    CLC 进位位置0指令

    CMC 进位位求反指令

    STC 进位位置为1指令

    CLD 方向标志置1指令

    STD 方向标志位置1指令

    CLI 中断标志置0指令

    STI 中断标志置1指令

    NOP 无操作

    HLT 停机

    WAIT 等待

    ESC 换码

    LOCK 封锁

    ========== 浮点运算指令集 =========

    一、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)----

    FINIT 初始化浮点部件 机器码 9B DB E3

    FCLEX 清除异常 机器码 9B DB E2

    FDISI 浮点检查禁止中断 机器码 9B DB E1

    FENI 浮点检查禁止中断二 机器码 9B DB E0

    WAIT 同步CPU和FPU 机器码 9B

    FWAIT 同步CPU和FPU 机器码 D9 D0

    FNOP 无操作 机器码 DA E9

    FXCH 交换ST(0)和ST(1) 机器码 D9 C9

    FXCH ST(i) 交换ST(0)和ST(i) 机器码 D9 C1iii

    FSTSW ax 状态字到ax 机器码 9B DF E0

    FSTSW word ptr mem 状态字到mem 机器码 9B DD mm111mmm

    FLDCW word ptr mem mem到状态字 机器码 D9 mm101mmm

    FSTCW word ptr mem 控制字到mem 机器码 9B D9 mm111mmm

    FLDENV word ptr mem mem到全环境 机器码 D9 mm100mmm

    FSTENV word ptr mem 全环境到mem 机器码 9B D9 mm110mmm

    FRSTOR word ptr mem mem到FPU状态 机器码 DD mm100mmm

    FSAVE word ptr mem FPU状态到mem 机器码 9B DD mm110mmm

    FFREE ST(i) 标志ST(i)未使用 机器码 DD C0iii

    FDECSTP 减少栈指针1->0 2->1 机器码 D9 F6

    FINCSTP 增加栈指针0->1 1->2 机器码 D9 F7

    FSETPM 浮点设置保护 机器码 DB E4

    ---------- 二、数据传送指令 -----------------------------------------

    FLDZ 将0.0装入ST(0) 机器码 D9 EE

    FLD1 将1.0装入ST(0) 机器码 D9 E8

    FLDPI 将π装入ST(0) 机器码 D9 EB

    FLDL2T 将ln10/ln2装入ST(0) 机器码 D9 E9

    FLDL2E 将1/ln2装入ST(0) 机器码 D9 EA

    FLDLG2 将ln2/ln10装入ST(0) 机器码 D9 EC

    FLDLN2 将ln2装入ST(0) 机器码 D9 ED

    FLD real4 ptr mem 装入mem的单精度浮点数 机器码 D9 mm000mmm

    FLD real8 ptr mem 装入mem的双精度浮点数 机器码 DD mm000mmm

    FLD real10 ptr mem 装入mem的十字节浮点数 机器码 DB mm101mmm

    FILD word ptr mem 装入mem的二字节整数 机器码 DF mm000mmm

    FILD dword ptr mem 装入mem的四字节整数 机器码 DB mm000mmm

    FILD qword ptr mem 装入mem的八字节整数 机器码 DF mm101mmm

    FBLD tbyte ptr mem 装入mem的十字节BCD数 机器码 DF mm100mmm

    FST real4 ptr mem 保存单精度浮点数到mem 机器码 D9 mm010mmm

    FST real8 ptr mem 保存双精度浮点数到mem 机器码 DD mm010mmm

    FIST word ptr mem 保存二字节整数到mem 机器码 DF mm010mmm

    FIST dword ptr mem 保存四字节整数到mem 机器码 DB mm010mmm

    FSTP real4 ptr mem 保存单精度浮点数到mem并出栈 机器码 D9 mm011mmm

    FSTP real8 ptr mem 保存双精度浮点数到mem并出栈 机器码 DD mm011mmm

    FSTP real10 ptr mem 保存十字节浮点数到mem并出栈 机器码 DB mm111mmm

    FISTP word ptr mem 保存二字节整数到mem并出栈 机器码 DF mm011mmm

    FISTP dword ptr mem 保存四字节整数到mem并出栈 机器码 DB mm011mmm

    FISTP qword ptr mem 保存八字节整数到mem并出栈 机器码 DF mm111mmm

    FBSTP tbyte ptr mem 保存十字节BCD数到mem并出栈 机器码 DF mm110mmm

    FCMOVB ST(0),ST(i)

    FCMOVBE ST(0),ST(i) <=时传送 机器码 DA D0iii

    FCMOVE ST(0),ST(i) =时传送 机器码 DA C1iii

    FCMOVNB ST(0),ST(i) >=时传送 机器码 DB C0iii

    FCMOVNBE ST(0),ST(i) >时传送 机器码 DB D0iii

    FCMOVNE ST(0),ST(i) !=时传送 机器码 DB C1iii

    FCMOVNU ST(0),ST(i) 有序时传送 机器码 DB D1iii

    FCMOVU ST(0),ST(i) 无序时传送 机器码 DA D1iii

    ---------- 三、比较指令 -----------------------------------------

    FCOM ST(0)-ST(1) 机器码 D8 D1

    FCOMI ST(0),ST(i) ST(0)-ST(1) 机器码 DB F0iii

    FCOMIP ST(0),ST(i) ST(0)-ST(1)并出栈 机器码 DF F0iii

    FCOM real4 ptr mem ST(0)-实数mem 机器码 D8 mm010mmm

    FCOM real8 ptr mem ST(0)-实数mem 机器码 DC mm010mmm

    FICOM word ptr mem ST(0)-整数mem 机器码 DE mm010mmm

    FICOM dword ptr mem ST(0)-整数mem 机器码 DA mm010mmm

    FICOMP word ptr mem ST(0)-整数mem并出栈 机器码 DE mm011mmm

    FICOMP dword ptr mem ST(0)-整数mem并出栈 机器码 DA mm011mmm

    FTST ST(0)-0 机器码 D9 E4

    FUCOM ST(i) ST(0)-ST(i) 机器码 DD E0iii

    FUCOMP ST(i) ST(0)-ST(i)并出栈 机器码 DD E1iii

    FUCOMPP ST(0)-ST(1)并二次出栈 机器码 DA E9

    FXAM ST(0)规格类型 机器码 D9 E5

    ---------- 四、运算指令 --------------------------------------

    FADD 把目的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在目的操作数后的变量或堆栈缓存器) 相加,并将结果存入目的操作数

    FADDP ST(i),ST 这个指令是使目的操作数加上 ST 缓存器,并弹出 ST 缓存器,而目的操作数必须是堆栈缓存器的其中之一,最后不管目的操作数为何,经弹出一次后,目的操作数会变成上一个堆栈缓存器了

    FIADD FIADD 是把 ST 加上来源操作数,然后再存入 ST 缓存器,来源操作数必须是字组整数或短整数形态的变数

    FSUB 减

    FSUBP

    FSUBR 减数与被减数互换

    FSUBRP

    FISUB

    FISUBR

    FMUL 乘

    FMULP

    FIMUL

    FDIV 除

    FDIVP

    FDIVR

    FDIVRP

    FIDIV

    FIDIVR

    FCHS 改变 ST 的正负值

    FABS 把 ST 之值取出,取其绝对值后再存回去。

    FSQRT 将 ST 之值取出,开根号后再存回去。

    FSCALE 这个指令是计算 ST*2^ST(1)之值,再把结果存入 ST 里而 ST(1) 之值不变。ST(1) 必须是在 -32768 到 32768 (-215 到 215 )之间的整数,如果超过这个范围计算结果无法确定,如果不是整数 ST(1) 会先向零舍入成整数再计算。所以为安全起见,最好是由字组整数载入到 ST(1) 里。

    FRNDINT 这个指令是把 ST 的数值舍入成整数,FPU 提供四种舍入方式,由 FPU 的控制字组(control word)中的 RC 两个位决定

    RC 舍入控制

    00 四舍五入

    01 向负无限大舍入

    10 向正无限大舍入

    11 向零舍去

    展开全文
  • X86汇编指令

    2021-01-17 18:06:45
    一、数据传送指令1.通用数据传送指令MOV(Move)传送PUSH(Push onto the stack)进栈POP(Pop from the stack)出栈XCHG(Exchange)交换.MOV指令格式为: MOVDST,SRC执行的操作:(DST)执行的操作:(SP)((SP)+1,(SP))执行的...

    一、数据传送指令1.通用数据传送指令MOV(Move)传送

    PUSH(Push onto the stack)进栈

    POP(Pop from the stack)出栈

    XCHG(Exchange)交换.MOV指令格式为: MOV DST,SRC

    执行的操作:(DST)

    执行的操作:(SP)

    ((SP)+1,(SP))

    执行的操作:(DST)

    (SP)

    执行的操作:(OPR1)(OPR2)2.累加器专用传送指令IN(Input) 输入

    OUT(Output) 输出

    XLAT(Translate) 换码

    这组指令只限于使用累加器AX或AL传送信息..IN

    输入指令

    长格式为: IN AL,PORT(字节)

    IN AX,PORT(字)

    执行的操作: (AL)

    (AX)

    短格式为: IN AL,DX(字节)

    IN AX,DX(字)

    执行的操作: AL

    AX

    OUT PORT,AX(字)

    执行的操作: (PORT)

    (PORT+1,PORT)

    短格式为: OUT DX,AL(字节)

    OUT DX,AX(字)

    执行的操作: ((DX))

    ((DX)+1,(DX))

    在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以

    直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于

    前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用

    IN或OUT指令来 传送信息. .XLAT 换码指令格式为: XLAT OPR

    或: XLAT

    执行的操作:(AL)

    effective address)有效地址送寄存器

    LDS(Load DS with Pointer)指针送寄存器和DS

    LES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器格式为: LEA REG,SRC

    执行的操作:(REG)

    指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令格式为: LDS REG,SRC

    执行的操作:(REG)

    (DS)

    把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES

    指针送寄存器和ES指令格式为: LES REG,SRC

    执行的操作: (REG)

    (ES)

    把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.4.标志寄存器传送指令LAHF(Load AH with flags)标志送AH

    SAHF(store AH into flags)AH送标志寄存器

    PUSHF(push the flags) 标志进栈

    POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为: LAHF

    执行的操作:(AH)

    .SAHF

    AH送标志寄存器格式为: SAHF

    执行的操作:(PWS的低字节)

    执行的操作:(SP)

    ((SP)+1,(SP))

    执行的操作:(PWS)

    (SP)

    二、算术指令1.加法指令ADD(add)加法

    ADC(add with carry)带进位加法

    INC(increment)加1.ADD 加法指令格式: ADD DST,SRC

    执行的操作:(DST)

    执行的操作:(DST)

    执行的操作:(OPR)

    2.减法指令SUB(subtract)减法

    SBB(subtract with borrow)带借位减法

    DEC(Decrement)减1

    NEG(Negate)求补

    CMP(Compare)比较.SUB 减法指令格式: SUB DST,SRC

    执行的操作:(DST)

    执行的操作:(DST)

    执行的操作:(OPR)

    执行的操作:(OPR)

    执行的操作:(OPR1)-(OPR2)

    该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.

    3.乘法指令MUL(Unsigned Multiple)无符号数乘法

    IMUL(Signed Multiple)带符号数乘法.MUL

    无符号数乘法指令格式: MUL SRC

    执行的操作:

    字节操作数:(AX)

    字操作数:(DX,AX)

    执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.4.除法指令DIV(Unsigned divide)无符号数除法

    IDIV(Signed divide)带符号数除法

    CBW(Convert byte to word)字节转换为字

    CWD(Contert word to double word)字转换为双字.DIV 无符号数除法指令格式: DIV SRC

    执行的操作:

    字节操作:(AL)

    (AH)

    字操作: (AX)

    (AX)

    执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW

    字节转换为字指令格式: CBW

    执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH.CWD

    字转换为双字指令格式: CWD

    执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.

    这两条指令都不影响条件码.

    三、逻辑指令1.逻辑运算指令AND(and) 逻辑与

    OR(or) 逻辑或

    NOT(not) 逻辑非

    XOR(exclusive or)异或

    TEST(test) 测试.AND 逻辑与指令格式: AND DST,SRC

    执行的操作:(DST)

    执行的操作:(DST)

    执行的操作:(OPR)

    执行的操作:(DST)

    执行的操作:(DST)^(SRC)

    两个操作数相与的结果不保存,只根据其特征置条件码2.移位指令SHL(shift logical

    left) 逻辑左移

    SAL(shift arithmetic

    left) 算术左移

    SHR(shift logical

    right) 逻辑右移

    SAR(shift arithmetic

    right) 算术右移

    ROL(Rotate

    left) 循环左移

    ROR(Rotate

    right) 循环右移

    RCL(Rotate left through carry) 带进位循环左移

    RCR(Rotate right through carry) 带进位循环右移格式: SHL OPR,CNT(其余的类似)

    其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.

    循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.

    四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令.REP重复串操作直到(CX)=0为上格式: REP string primitive

    其中String Primitive可为MOVS,LODS或STOS指令

    执行的操作:

    1)如(CX)=0则退出REP,否则往下执行.

    2)(CX)

    3)执行其中的串操作

    4)重复1)~3).MOVS 串传送指令格式:可有三种

    MOVS DST,SRC

    MOVSB(字节)

    MOVSW(字)

    其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:

    MOVS ES:BYTE PTR[DI],DS:[SI]

    执行的操作:

    1)((DI))

    2)字节操作:

    (SI)

    当方向标志DF=0时用+,当方向标志DF=1时用-

    3)字操作:

    (SI)

    当方向标志DF=0时用+,当方向标志DF=1时用-

    该指令不影响条件码..CLD(Clear

    direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;

    .STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.

    .STOS 存入串指令格式: STOS DST

    STOSB(字节)

    STOSW(字)

    执行的操作:

    字节操作:((DI))

    字操作: ((DI))

    该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中..LODS 从串取指令格式: LODS SRC

    LODSB

    LODSW

    执行的操作:

    字节操作:(AL)

    字操作: (AX)

    该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.

    一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ 当相等/为零时重复串操作格式: REPE(或REPZ) String Primitive

    其中String

    Primitive可为CMPS或SCAS指令.

    执行的操作:

    1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行

    2)(CX)

    3)执行其后的串指令

    4)重复1)~3)

    .REPNE/REPNZ 当不相等/不为零时重复串操作

    格式: REPNE(或REPNZ) String Primitive

    其中String

    Primitive可为CMPS或SCAS指令

    执行的操作:

    除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同.

    .CMPS 串比较指令

    格式: CMP SRC,DST

    CMPSB

    CMPSW

    执行的操作:

    1)((SI))-((DI))

    2)字节操作:(SI)

    字操作: (SI)

    指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同..SCAS 串扫描指令格式: SCAS DST

    SCASB

    SCASW

    执行的操作:

    字节操作:(AL)-((DI)),(DI)

    字操作: (AL)-((DI)),(DI)

    该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.

    五、控制转移指令1.无条件转移指令.JMP(jmp) 跳转指令1)段内直接短转移格式:JMP SHORT

    OPR

    执行的操作:(IP)

    PTR OPR

    执行的操作:(IP)

    PTR OPR

    执行的操作:(IP)

    OPR

    执行的操作:(IP)

    (CS)

    格式:JMP DWORD

    PTR OPR

    执行的操作:(IP)

    (CS)

    equal) 结果为零(或相等)则转移格式:JE(或JZ) OPR

    测试条件:ZF=1

    .JNZ(或JNE)(Jump if not zero,or not

    equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE) OPR

    测试条件:ZF=0

    .JS(Jump if

    sign) 结果为负则转移格式: JS OPR

    测试条件:SF=1

    .JNS(Jump if not

    sign) 结果为正则转移格式:JNS OPR

    测试条件:SF=0

    .JO(Jump if

    overflow) 溢出则转移格式: JO OPR

    测试条件:OF=1

    .JNO(Jump if not

    overflow) 不溢出则转移格式: JNO OPR

    测试条件:OF=0

    .JP(或JPE)(Jump if parity,or parity

    even) 奇偶位为1则转移格式: JP OPR

    测试条件:PF=1

    .JNP(或JPO)(Jump if not parity,or

    parity odd) 奇偶位为0则转移格式: JNP(或JPO) OPR

    测试条件:PF=0

    .JB(或JNAE,JC)(Jump if below,or not

    above or equal,or carry)

    低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC) OPR

    测试条件:CF=1

    .JNB(或JAE,JNC)(Jump if not below,or

    above or equal,or not carry)

    不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC) OPR

    测试条件:CF=02)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上

    .JNB(或JAE,JNC)格式:同上

    .JBE(或JNA)(Jump if below or equal,or

    not above) 低于或等于,或不高于则转移格式:JBE(或JNA) OPR

    测试条件:CFVZF=1

    .JNBE(或JA)(Jump if not below or

    equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA) OPR

    测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移

    .JL(或LNGE)(Jump if less,or not greater

    or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE) OPR

    测试条件:SFVOF=1

    .JNL(或JGE)(Jump if not less,or greater

    or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE) OPR

    测试条件:SFVOF=0

    .JLE(或JNG)(Jump if less or equal,or

    not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG) OPR

    测试条件:(SFVOF)VZF=1

    .JNLE(或JG)(Jump if not less or

    equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG) OPR

    测试条件:(SFVOF)VZF=0

    4)测试CX的值为0则转移指令.JCXZ(Jump if CX register is

    zero) CX寄存器的内容为零则转移格式:JCXZ OPR

    测试条件:(CX)=0注:条件转移全为8位短跳!

    3.循环指令.LOOP

    循环指令格式: LOOP OPR

    测试条件:(CX)<>0

    .LOOPZ/LOOPE

    当为零或相等时循环指令格式: LOOPZ(或LOOPE) OPR

    测试条件:(CX)<>0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令格式: LOOPNZ(或LOOPNE) OPR

    测试条件:(CX)<>0且ZF=0这三条指令的步骤是:

    1)(CX)

    2)检查是否满足测试条件,如满足则(IP)

    .RET返回指令5.中断

    .INT指令格式: INT TYPE

    或 INT

    执行的操作:(SP)

    ((SP)+1,(SP))

    (SP)

    ((SP)+1,(SP))

    (SP)

    ((SP)+1,(SP))

    (IP)

    (CS)

    (SP)

    ((SP)+1,(SP))

    (SP)

    ((SP)+1,(SP))

    (SP)

    ((SP)+1,(SP))

    (IP)

    (CS)

    执行的操作:(IP)

    (SP)

    (CS)

    (SP)

    (PSW)

    (SP)

    .CMC进位位求反指令(Complement carry)CF

    .STC进位位置1指令(Set

    carry)CF

    .CLD方向标志置0指令(Clear direction)DF

    .STD方向标志置1指令(Set

    direction)DF

    .CLI中断标志置0指令(Clear

    interrupt)IF

    .STI中断标志置1指令(Set

    interrupt)IF

    Opreation) 无操作

    HLT(Halt) 停机

    WAIT(Wait) 等待

    ESC(Escape) 换码

    LOCK(Lock) 封锁这些指令可以控制处理机状态.这们都不影响条件码..NOP

    无操作指令该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT停机指令该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..WAIT等待指令该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行..ESC换码指令格式ESC mem

    其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机

    (Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件..LOCK封锁指令该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.

    展开全文
  • test和jz联用可以理解,但test和jle联用是什么意思? 1. 来看Intel官方手册上对AND的定义: 首先AND会影响SF, ZF, PF, CF, OF标志位。 2. 来看看jle发生跳转的条件 jle会受到ZF的影响。也就是说如果SRC1 AND ...
  • 汇编语言 大小比较 理解 ja jna jg jle

    万次阅读 2015-11-06 19:54:34
    无符号数: 大于 ja 不大于 jna 有符号数: 大于jg 小于等于 jle
  • 汇编语言学习

    2021-03-14 18:22:20
    因为今年想转向二进制安全,感觉毕业一定要有个方向,这样好投递岗位,所以学习汇编语言是第一站,在学校的智云课堂上,找了老师的课来上,讲的特别好,老师不让传任何相关资源到网上,我在这里做一个对汇编学习简要...
  • So every single resource online tells me that something like this:cmp %eax, %ebxjg < something >would jump to < something > if eax was greater than ebx. But I have another piece of code th...
  • 汇编语言跳转总结

    万次阅读 2016-05-04 20:42:48
    JLE ;有符号小于等于则跳转 同JNG JNLE ;有符号不小于等于则跳转 同JG JZ ;为零则跳转 JNZ ;不为零则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则...
  • jle 某地址 含义是:如果edx <= 0,就跳到某地址,否则继续往下执行。 jle换成jg的话,就是edx > 0跳转。 其他同理。 与cmp指令和跳转指令组合的区别是:这个组合比较的是cmp A,B中,A与B的关系。 而text A...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼ASSUME CS:CC, DS:QWERQWER SEGMENTMSG1 DB 13, 10, 'This program can generate a clockwise spiral matrix of order N.'DB 13, 10, 'If you type 4, the matrix of ...
  • 汇编学习之路

    2021-01-17 18:06:46
    写一些汇编基础,做个记录包括输入输出、字符显示、字符判断等输入输出先干为敬12345MOV AH,1 ;输入字符INT 21H ;输入后回显,键入字符的ascll送入ALMOV DL,ALMOV AH,2INT 21H ;输出输入的字符汇编对于一个汇编程序...
  • 汇编语言INC DEC JGE JG JLE JL JNE JE 都是什么意思

    万次阅读 多人点赞 2015-03-17 21:21:05
    INC 自增1 increase DEC 自减1 decrease JGE 前>=后 Jump if greater or equal JG 前>...JLE 前<=后 Jump if less or equal JL 前<后 Jump if less JNE 前不等于后 Jump if not equal JE 前...
  • 手把手教你学习汇编语言——从入门到起飞

    万次阅读 多人点赞 2021-05-11 08:07:33
    关于这篇博客,笔者会尽量用最简单的方式教会大家汇编语言以便应付各种考试 有什么不足的忘大佬评论或私信指出。 汇编环境安装 汇编运行调试 汇编指令 希望大家看完这些找一些样例练习一下会学的更好,这里有一些...
  • 8086汇编_常用指令

    2022-04-14 10:00:09
    文章目录mov指令and指令or指令xor指令push指令pop指令jmp指令cmp指令JG / JL指令JGE / JLE指令call指令ret指令未完… mov指令 mov OPRD1, OPRD2 将OPRD2送到OPRD1中 and指令 and OPRD1, OPRD2 两操作数进行按位与...
  • OF_FILE, %eax jle end_loop continue_read_loop: pushl $BUFFER pushl $BUFFER_SIZE call convert_to_upper popl %eax addl $4, %esp movl %eax, %edx movl $SYS_WRITE, %eax movl ST_FD_OUT(%ebp), %ebx movl $...
  • 汇编cmp比较指令详解刚刚看到了cmp指令,一开始有点晕。后来上网找了些资料,终于看明白了,为了方便初学者,我就简单写下我的思路吧。高手绕过,谢谢!cmp(compare)指令进行比较两个操作数的大小例:cmp oprd1,oprd2...
  • 001-OD调试器(断点),汇编指令MOV 002-MOV赋值指令与内联汇编 0003-CALL与单步调试 004-MOV指令的寻址方式 005-汇编加法指令ADD 006-十六进制与内存单元长度BYTE,WORD,DWORD 007-寄存器EAX与AX,AH,AL关系 008-汇编...
  • 汇编 —— 控制指令

    2021-09-17 14:50:45
    于是萌生了写一个自己的操作系统这样的心思,此为系列第一章,主要是讲解一些汇编知识的,内容大多从CSAPP中也可以获得。 本篇内容主要讲解汇编指令:跳转、条件以及循环指令 跳转指令 之前简单介绍了直线代码的...
  • test jle

    千次阅读 2016-02-22 22:53:39
    .text:006EDA11 01C jle loc_6EDE7B ... 看起来是这个意思 取值到eax, eax值减去0x10, eax值 则跳转 写段C代码反汇编看下, 比如 a -= 16;  if ( a > 0) {  a = 1;  }  ...
  • 关于ATT汇编

    2020-12-24 14:48:20
    ATT 汇编大体格式是: 指令 源操作数 目的操作数 ,比如将 10 移动到 eax 寄存器的写法: movl $10, %eax 。1.ATT 汇编的源操作数和目的操作数和 Intel 正好相反,也就是数据流向是从左到右;2.ATT 中立即数前需要加...
  • Win32 反汇编

    2021-09-08 21:41:17
    */ //以上逻辑用汇编代码写 __asm { // 判断 a > b 那么在反汇编中,判断小于等 mov eax, b cmp a, eax jle end } printf("a > b"); end: printf("a ); return 0; } JNG(jump when not greater)有...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼define(ShuBiao,052E1294)[ENABLE]alloc(mage,256)label(mpn)label(mpnx)label(mpnz)define(RenWu,052B5BB0)mage:push ebpmov ebp,espmov edx,[ebp+08]mov eax,[edx]test...
  • JBE与JLE的区别

    千次阅读 2019-10-08 23:54:29
    一个用于无符号数,一个用于有符号数,即使是在intel的官方手册中, ...JLE:jump short if less or equal below有人译为低于,less有人译为小于,但对于中国人来说,这两个完全是一个意思,很容易弄混 ...
  • 汇编指令详解

    千次阅读 多人点赞 2021-12-11 11:19:27
    一、数据传送指令 1、传送指令:MOV (move) 格式:mov dst,src 具体用法: ...(1) CPU内部寄存器之间的数据传送,如:mov ah,al ...(2) 立即数送至通用寄存器(非段寄存器)或存储单元,如:mov al,3 mov [bx],1234h ...
  • 汇编 —— 函数

    2021-09-19 20:11:39
    于是萌生了写一个自己的操作系统这样的心思,此为系列第一章,主要是讲解一些汇编知识的,内容大多从CSAPP中也可以获得。 本篇内容主要讲解:函数的汇编级实现 在正式讲栈之前,我想先大概讲讲在汇编级别机器是怎么...
  • 汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 名称 功能 操作数操作码模数寄存器1寄存器2或内存位移量立即数符号方向芯片型号16位32位JO溢出跳转...
  • 汇编

    2020-12-30 18:58:59
    8088 汇编跳转 cmp a,b 比较a与b mov a,b 把b的值送给a ret 返回主程序 nop 无作用,英文“no operation”的简写,意思是“do nothing” call 调用子程序 je 或jz 若相等则跳 jne或jnz 若不相等则跳 jmp 无条件跳 jb...
  • 汇编基础内容

    2022-02-28 15:36:37
    JNL,JLE,JNLE,JCXZ 条件转移指令 LOOP 循环指令P70 LOOPZ/LOOPE 为零/相等时循环指令 LOOPNZ/LOOPNE 不为零/不相等时循环指令 CALL 子程序调用指令 RET(RETun) 子程序返回指令 CLC(CLear Carry) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,806
精华内容 2,322
关键字:

jle汇编

友情链接: cankaoonfloat.rar