`

汇编指令之条件码

阅读更多
        在系统底层,除了整数寄存器,CPU 还维护着一组单个位的条件码(condition code)寄存器,它们描述了最近的算术或逻辑操作的属性。可以检测这些寄存器来执行条件分支指令。最常用的条件码有:
        (1)CF:进位标志。最近的操作使最高位产生了进位。可用来检查无符号操作的溢出。
        (2)ZF:零标志。最近的操作得出的结果为 0。
        (3)SF:符号标志。最近的操作得到的结果为负数。
        (4)OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。
        在汇编指令之算术和逻辑操作指令一节的指令中,除 leaq 指令因为是用来进行地址计算而不改变任何条件码之外,其余的指令都会设置条件码。对于逻辑操作,例如 XOR,进位标志和溢出标志会设置为 0;对于移位操作,进位标志将设置为最后一个被移出的位,而溢出标志设置为 0;INC 和 DEC 指令会设置溢出和零标志,但是不会改变进位标志。
        除了这些指令外,还有下表所示的比较和测试两类指令,它们只设置条件码而不改变任何其他寄存器。

        其中,CMP 类指令根据两个操作数之差来设置条件码,类似于 SUB 指令,只是不更新目的寄存器。如果两个操作数相等,这些指令会将零标志位 ZF 设置为 1,而其他的标志可以用来确定两个操作数的大小关系。TEST 指令的行为则类似于 AND 指令。
        条件码通常不会直接读取,常用的使用方式有三种:
        1、可以根据条件码的某种组合,将一个字节设置为 0 或者 1。
        2、可以条件跳转到程序的某个其他部分。
        3、可以有条件地传送数据。
        对于第一种情况,有下表所示的一类 SET 指令。这些指令名字的不同后缀指明了它们所考虑的条件码的组合。注意,不同于前面几节中提到的 MOV 类等指令,这些后缀表示不同的条件而不是操作数大小,如 setl 和 setb 指令分别表示“小于时设置(set less)”和“低于时设置(set below)”,而不是“设置长字(set long word)”和“设置字节(set byte)”。

        一条 SET 指令的目的操作数是低位单字节寄存器元素之一,或是一个字节的内存位置,指令会将这个字节设置成 0 或者 1。因此为了得到一个 32 位或 64 位结果,须要对高位清零。例如一个计算 C 语言表达式 a < b 的典型指令序列如下。
; int comp(long a, long b)
; a in %rdi, b in %rsi
comp:
    cmpq    %rsi, %rdi        ; Compare a:b
    setl    %al               ; Set low-order byte of %eax to 0 or 1
    movzbl  %al, %eax         ; Clear rest of %eax (and rest of %rax)
    ret

        另外,某些底层的机器指令可能存在“同义名(synonym)”,对此,编译器和汇编器会随意决定使用哪个名字。
        虽然所有的算术和逻辑操作都会设置条件码,但是各个 SET 命令的描述都适用的情况是:执行比较命令,根据计算表达式 t=a-b 设置条件码。
        先以 sete 指令为例,即“当相等时设置(set when equal)”。当 a=b 时,会得到 t=0,因此 ZF 置位就表示相等。类似地,对于 setl 指令,即“小于时设置(set when less)”,测试一个有符号比较。当没有发生溢出时(OF 为 0 就表示无溢出),得出 a-b<0 时 a<b,因此将 SF 设置为 1 即指明这一点;而当 a-b>=0 时 a>=b,则可由 SF 设置为 0 指明。另一方面,当发生溢出时,得出 a-b>0(负溢出)时 a<b,而当 a-b<0(正溢出)时 a>b;当 a=b 时,不会有溢出。因此,当 OF 被设置为 1 时,当且仅当 SF 被设置为 0 时有 a<b。组合这些情况,溢出和符号位的 EXCLUSIVE-OR 就提供了 a<b 是否为真的测试,其他的有符号比较测试基于 SF^OF 和 ZF 的其他组合。
        对于无符号比较的测试,在执行计算 t=a-b 中,当 a-b<0 时,CMP 指令会设置进位标志,因而无符号比较使用的是进位标志和零标志的组合。
        注意到机器代码如何区分有符号和无符号值是很重要的。机器代码不会像 C 等语言一样将每个值都和一个数据类型联系起来。相反,多数情况下,机器代码对于有符号和无符号都使用一样的指令,这是因为许多算术运算对无符号和补码算术都有一样的位级行为。因此有些情况需要用不同的指令来处理有符号和无符号操作,例如,使用不同版本的右移、除法和乘法指令,以及不同的条件码组合。
  • 大小: 68.8 KB
  • 大小: 137.5 KB
分享到:
评论

相关推荐

    汇编指令查询器,汇编指令搜索器

    - 操作码:每个汇编指令都由一个操作码标识,告诉CPU要执行的操作。 - 指令分类:如数据处理指令(加减乘除)、转移控制指令(跳转、条件分支)、输入输出指令等。 2. **查询器的功能**: - 查找指令:用户可以...

    汇编指令查询器 汇编指令查询器

    汇编指令是计算机硬件能够直接理解和执行的基本操作,每条指令对应一个特定的机器码。汇编指令查询器是一款工具,帮助程序员和计算机科学学习者快速查找并理解各种汇编指令的含义和用法。 汇编语言的核心在于它的...

    汇编指令与机器码的相互转换.pdf

    在汇编指令中,还有许多其他的指令格式,如条件跳转指令、无条件跳转指令、调用指令、返回指令等。 汇编指令的机器码转换是指将汇编指令转换为机器语言的过程。这个过程需要对汇编指令进行解析,提取操作码和地址码...

    汇编指令机器码汇总表.rar

    在计算机科学领域,汇编语言是一种低级编程语言,它与机器语言紧密相关,每条汇编指令通常对应一个特定的机器码。汇编指令机器码汇总表是程序员理解和调试程序的重要工具,尤其是在底层系统开发和优化时。下面将详细...

    RH850 D1汇编指令

    RH850 D1汇编指令作为RH850系列微控制器的核心组成部分之一,其强大的功能和灵活性使其成为实现高性能、低功耗应用的理想选择。通过对汇编指令的深入了解和掌握,开发者能够更好地利用微控制器的各项特性,从而提高...

    汇编指令使用规则 汇编指令使用规则

    正确设置条件码和使用比较指令是实现逻辑的关键。 7. **子程序和函数调用**:在汇编中,可以使用CALL指令调用子程序或函数。返回时,使用RET指令。注意保存和恢复现场,以防止上下文冲突。 8. **内存访问**:汇编...

    汇编指令与机器码的相互转换规则

    ### 汇编指令与机器码的相互转换规则 #### 一、基础知识 在深入了解汇编指令与机器码之间的转换之前,我们需要明确几个基础概念: 1. **机器语言指令的基本构成**:每条机器语言指令通常由两部分组成:操作码...

    ARM汇编指令集详解

    ARM汇编指令集是嵌入式系统开发中的基础,它是一种低级编程语言,用于直接控制计算机硬件。本文将深入探讨ARM汇编指令集的主要概念、语法和常见指令,帮助你更好地理解和应用这一关键技术。 首先,理解ARM架构是至...

    ARM CORTEX-M0汇编指令汇总

    由于给定的文件信息未能提供具体的汇编指令细节,以下将基于现有的知识,对ARM Cortex-M0微控制器核心可能包含的汇编指令进行汇总,并简单介绍这些指令的特点。 ARM Cortex-M0核心支持的汇编指令大致可以分为以下几...

    汇编指令查询器 汇编

    8086汇编指令集是Intel公司为8086处理器设计的一系列低级指令,这些指令直接对应于机器码,每一行汇编指令都对应一个或多个CPU的操作。以下是几个常见的8086汇编指令及它们的基本功能: 1. **MOV(移动)**:这是最...

    ARM-汇编指令集-PDF版

    ARM汇编指令集是ARM架构微处理器编程的基础,它包含了用于控制和操作ARM处理器的一系列指令。ARM(Advanced RISC Machines)处理器以其高效、低成本和低能耗的特点,在嵌入式系统、消费电子、多媒体处理、数字信号...

    汇编指令查询器 V1.3

    2. **指令详解**:查询结果将展示指令的详细说明,包括操作码、操作数、执行时间和可能产生的条件码等。 3. **实例演示**:为了帮助用户更好地理解,查询器可能提供指令使用的示例代码,展示如何在实际程序中应用...

    mips汇编指令学习

    《深入探索MIPS汇编指令》 MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集计算机(RISC)架构,广泛应用于嵌入式系统和学术研究。掌握MIPS汇编指令对于理解底层计算机工作原理以及...

    汇编指令查询器

    汇编指令查询器的使用方法通常是这样的:用户可以通过输入特定的汇编指令,查询该指令的功能、操作码、执行过程以及在不同体系结构下的表现。这样的功能有助于学习者快速查找并理解各种指令,从而在编写汇编程序时...

    汇编指令查询器(汇编)

    汇编指令是这种语言的基本元素,每个指令都对应一个特定的机器码,能够直接控制计算机硬件的操作。本篇文章将深入探讨汇编指令查询器及其在汇编语言学习和实践中的作用。 汇编指令查询器是一个工具,它为程序员提供...

    MIPS汇编指令集

    MIPS架构所采用的汇编语言,即MIPS汇编指令集,是理解和开发MIPS体系结构程序的基础。 ### MIPS汇编指令集概述 MIPS汇编指令集包含多种指令类型,支持算术运算、逻辑运算、位字段操作、跳转与分支、乘法与除法等...

    免杀等价替换汇编指令修改

    汇编指令等价替换是实现免杀的关键技术之一。例如,在给定的部分内容中,可以看到“ADD1sub-1”这样的表达,其含义是通过“ADD”指令增加1,再通过“sub”指令减去1,最终结果不变,但执行路径发生了变化。这种方式...

    很全的ARM汇编指令查询手册CHM.zip

    "很全的ARM汇编指令查询手册CHM.zip"是一个压缩文件,包含了一个详细的ARM汇编指令查询手册,格式为CHM(Compiled Help Manual),这是一种由Microsoft开发的、用于存储和查看离线帮助文件的格式。 这个手册很可能...

    常用的arm指令与 汇编指令大全

    9. 条件码:ARM指令集允许根据条件执行指令,如无条件(AL)、零(EQ)、不等于(NE)、负(MI)等,这为条件分支提供了便利。 10. 指令集扩展:除了基础的ARM指令集,还有Thumb指令集,它是一种16位的子集,用于...

    ARM汇编指令(中文版)

    ARM汇编指令是嵌入式系统开发中的基础知识,尤其对于ARM架构的处理器,掌握汇编语言能够帮助开发者更深入地理解和优化程序。ARM汇编指令集是为ARM处理器设计的一套低级编程语言,它提供了直接操作硬件的能力,是理解...

Global site tag (gtag.js) - Google Analytics