- 浏览: 142222 次
文章分类
最新评论
在系统底层,除了整数寄存器,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 的典型指令序列如下。
另外,某些底层的机器指令可能存在“同义名(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 等语言一样将每个值都和一个数据类型联系起来。相反,多数情况下,机器代码对于有符号和无符号都使用一样的指令,这是因为许多算术运算对无符号和补码算术都有一样的位级行为。因此有些情况需要用不同的指令来处理有符号和无符号操作,例如,使用不同版本的右移、除法和乘法指令,以及不同的条件码组合。
(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 等语言一样将每个值都和一个数据类型联系起来。相反,多数情况下,机器代码对于有符号和无符号都使用一样的指令,这是因为许多算术运算对无符号和补码算术都有一样的位级行为。因此有些情况需要用不同的指令来处理有符号和无符号操作,例如,使用不同版本的右移、除法和乘法指令,以及不同的条件码组合。
发表评论
-
浮点运算指令
2019-05-22 23:13 1571上一节介绍了浮点数与各种数值类型之间的相互转换 ... -
浮点数类型转换指令
2019-05-15 22:37 1706在浮点寄存 ... -
浮点寄存器概述
2019-05-14 22:31 2587本文介绍的浮点寄存器是基于 AVX2(Adva ... -
汇编指令之跳转指令
2019-04-15 00:21 4797正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1376下表是 x86-64 ... -
汇编指令之数据传送指令
2019-03-25 21:28 1287在x86-64 中的 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 993Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 608源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 398传统的linux中定义了七个运行级,分别如下: ... -
unix限制
2017-04-04 16:08 578UNIX系统实现定义了很多幻数和常量,其中有很 ... -
linux引导加载程序--GRUB
2017-04-04 04:22 625linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 553注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 695注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 561注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 361在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
程序优化之存储器别名使用
2016-05-20 08:55 797说明:本文示例摘自《深入理解计算机系统》第五章----优化程序 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1579对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1838对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 668对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 424我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
- 操作码:每个汇编指令都由一个操作码标识,告诉CPU要执行的操作。 - 指令分类:如数据处理指令(加减乘除)、转移控制指令(跳转、条件分支)、输入输出指令等。 2. **查询器的功能**: - 查找指令:用户可以...
汇编指令是计算机硬件能够直接理解和执行的基本操作,每条指令对应一个特定的机器码。汇编指令查询器是一款工具,帮助程序员和计算机科学学习者快速查找并理解各种汇编指令的含义和用法。 汇编语言的核心在于它的...
在汇编指令中,还有许多其他的指令格式,如条件跳转指令、无条件跳转指令、调用指令、返回指令等。 汇编指令的机器码转换是指将汇编指令转换为机器语言的过程。这个过程需要对汇编指令进行解析,提取操作码和地址码...
在计算机科学领域,汇编语言是一种低级编程语言,它与机器语言紧密相关,每条汇编指令通常对应一个特定的机器码。汇编指令机器码汇总表是程序员理解和调试程序的重要工具,尤其是在底层系统开发和优化时。下面将详细...
RH850 D1汇编指令作为RH850系列微控制器的核心组成部分之一,其强大的功能和灵活性使其成为实现高性能、低功耗应用的理想选择。通过对汇编指令的深入了解和掌握,开发者能够更好地利用微控制器的各项特性,从而提高...
正确设置条件码和使用比较指令是实现逻辑的关键。 7. **子程序和函数调用**:在汇编中,可以使用CALL指令调用子程序或函数。返回时,使用RET指令。注意保存和恢复现场,以防止上下文冲突。 8. **内存访问**:汇编...
### 汇编指令与机器码的相互转换规则 #### 一、基础知识 在深入了解汇编指令与机器码之间的转换之前,我们需要明确几个基础概念: 1. **机器语言指令的基本构成**:每条机器语言指令通常由两部分组成:操作码...
ARM汇编指令集是嵌入式系统开发中的基础,它是一种低级编程语言,用于直接控制计算机硬件。本文将深入探讨ARM汇编指令集的主要概念、语法和常见指令,帮助你更好地理解和应用这一关键技术。 首先,理解ARM架构是至...
《汇编指令学习电子书CHM》是一本深入解析汇编语言指令的资源,适合对计算机底层原理感兴趣的读者,特别是那些希望通过掌握汇编语言提升编程技能的程序员。CHM(Compiled Help Manual)格式是微软开发的帮助文档格式...
由于给定的文件信息未能提供具体的汇编指令细节,以下将基于现有的知识,对ARM Cortex-M0微控制器核心可能包含的汇编指令进行汇总,并简单介绍这些指令的特点。 ARM Cortex-M0核心支持的汇编指令大致可以分为以下几...
8086汇编指令集是Intel公司为8086处理器设计的一系列低级指令,这些指令直接对应于机器码,每一行汇编指令都对应一个或多个CPU的操作。以下是几个常见的8086汇编指令及它们的基本功能: 1. **MOV(移动)**:这是最...
ARM汇编指令集是ARM架构微处理器编程的基础,它包含了用于控制和操作ARM处理器的一系列指令。ARM(Advanced RISC Machines)处理器以其高效、低成本和低能耗的特点,在嵌入式系统、消费电子、多媒体处理、数字信号...
2. **指令详解**:查询结果将展示指令的详细说明,包括操作码、操作数、执行时间和可能产生的条件码等。 3. **实例演示**:为了帮助用户更好地理解,查询器可能提供指令使用的示例代码,展示如何在实际程序中应用...
《深入探索MIPS汇编指令》 MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集计算机(RISC)架构,广泛应用于嵌入式系统和学术研究。掌握MIPS汇编指令对于理解底层计算机工作原理以及...
《Intel汇编指令参考手册》是编程者们深入理解计算机底层运作的重要参考资料,特别是对于那些在x86和x86_64架构下工作的开发者来说,它具有极高的价值。该手册详细列出了Intel处理器支持的所有汇编指令,包括它们的...
汇编指令查询器的使用方法通常是这样的:用户可以通过输入特定的汇编指令,查询该指令的功能、操作码、执行过程以及在不同体系结构下的表现。这样的功能有助于学习者快速查找并理解各种指令,从而在编写汇编程序时...
汇编语言是计算机编程的一种低级语言,它与机器语言密切相关,每一个汇编指令通常对应一个特定的机器码,直接控制计算机硬件的操作。以下将对汇编语言的一些核心概念和常见指令进行深入探讨。 首先,汇编语言的基本...
汇编指令是这种语言的基本元素,每个指令都对应一个特定的机器码,能够直接控制计算机硬件的操作。本篇文章将深入探讨汇编指令查询器及其在汇编语言学习和实践中的作用。 汇编指令查询器是一个工具,它为程序员提供...
《汇编语言指令大全 X86和X87汇编指令大全(带注释)》是一份详尽的参考资料,涵盖了X86和X87架构下的汇编语言指令集。汇编语言是计算机硬件与高级编程语言之间的桥梁,直接对应机器码,对于理解计算机底层工作原理...
MIPS架构所采用的汇编语言,即MIPS汇编指令集,是理解和开发MIPS体系结构程序的基础。 ### MIPS汇编指令集概述 MIPS汇编指令集包含多种指令类型,支持算术运算、逻辑运算、位字段操作、跳转与分支、乘法与除法等...