立即数是什么意思(立即数有什么用) |
您所在的位置:网站首页 › equalizer啥意思 › 立即数是什么意思(立即数有什么用) |
微机课本里什么是立即数 在8086等CPU处理器中可按下面例子 单片机为例。 通常把在立即寻址方式指令中给出的数称为立即数。 立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如: MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H 其中:B1、W1和D1分别是字节、字和双字单元。 以上指令中的第二操作数(源操作数)都是立即数,在汇编语言中,规定:立即数不能作为指令中的第一操作数(目的操作数)。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。 立即数寻址方式通常用于对通用寄存器或内存单元赋初值。 下面以ARM汇编编译器为例: 立即数方式:每个立即数由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制的两倍表示。如果立即数记作,8位常数记作immed_8,4位的循环右移值记作rotate_imm,则有: =immed_8循环右移(2*rotate_imm) 这样并不是每一个32位的常数都是合法的立即数,只有能够通过上面构造方法得到的才是合法的立即数。 下面的常数是合法的立即数: 0xff,0x104,0xff0,0xff00 下面的数不能通过上述构造方法得到,则不是合法的立即数: 0x101,0x102,0xFF1 同时按照上面的构造方法,一个合法的立即数可能有多种编码方式。如0x3f0是一个合法的立即数,它可以采用下面两种的编码方式: immed_8=0x3f,rotate_imm=0xe或者 immed_8=0xfc,rotate_imm=0xf 转换为二进制形式如下: 0x3f=0000 0000 0000 0000 0000 0000 0011 1111 0xe=14(十进制) 2*14=28 ∴,0x3f循环右移28位得到如下: 0000 0000 0000 0000 0000 0011 1111 0000=0x3f0 immed_8=0xfc,rotate_imm=0xf 的转换如下: 0xfc=0000 0000 0000 0000 0000 0000 1111 1100 rotate_imm=0xf=15(十进制) 15*2=30 所以0xfc循环右移30位得到如下结果: 0000 0000 0000 0000 0000 0011 1111 0000=0x3f0 可以看出,结果是一样的!!! 但是,由于这种立即数的构造方法中包含循环移位操作,而循环移位操作会影响CPSR的条件标志位C。因此,同一个合法的立即数由于采用了不同的编码方式,将使得某些指令的执行产生不同的结果,这是不能允许的。ARM汇编编译器按照下面的规则生成立即数的编码。 1.当立即数数值在0和0xFF范围时,零immmed_8=,rotate_imm=0.、 2.其他情况下,汇编编译器选择使rotate_imm数值最小的编码方式。所以0x3f0的正确表示法是第一种。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 解释二: 一条典型的ARM指令语法格式分为如下几个部分: {} {S} ,{,} 其中,内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。 opcode 指令助记符,如LDR,STR 等 cond 执行条件,如EQ,NE 等 S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响 Rd 目标寄存器 Rn 第一个操作数的寄存器 operand2 第二个操作数 其指令编码格式如下: 31-28 cond 27-25 001 24-21 opcode 20 S 19-16 Rn 15-12 Rd 11-0 (12位) operand2 对其中的operand2的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由一个8位的常数循环右移偶数位得到的。”这句话的意思是说,当用12位第二操作数来表示一个32位立即数时,采用的是将8位数通过移位的方式来实现的,其中12位第二 汇编语言中什么是立即数立即数: 一个立即数是一块数据存储作为指令本身,而不是在一个中的一部分内容存储器位置或寄存 器。立即值通常用于加载值或对常量执行算术或逻辑运算的指令。 概述: 在大多数指令集架构下,各种指令也可以对常量值执行操作。例如,考虑一个可以添加两个寄 存器并将结果存储在第三个寄存器中的ISA: 添加 r3,r2,r1; r3 = r2 + r1 指令集还可以支持添加常量值的常见情况(例如,在许多支持++ var的编程语言的情况下)。 添加r1,r1,1; r1 = r1 + 1 在上面的代码中,值1是在add指令本身中编码的立即数。 扩展资料: 立即数的实施限制: 由于立即数被打包到指令本身中,因此某些ISA具有可用作立即值的受限范围的值。例如,在 MIPS32中,立即数限制为16位。在一些更复杂的体系结构(如ARM)上,某些指令可能接受 16位值,其他指令可能接受较小的范围,并且能够根据需要旋转位。 在立即数不能直接编码到指令中的情况下,例如当值超出范围时,可以采用各种其他方式来处 理这些值。一个这样的选项是从内存中的常量池(例如文字池)加载公共值。或者,可以使用 可以表示或加载到寄存器中并从那里操作的值来组装值。一些ISA(如MIPS32和ARM)具有 专用指令,如LUI,MOVW和MOVT,它们提供了一种方法,将高16位后跟低16位加载到单个 寄存器中。 立即数是什么意思在8086等CPU处理器中可按下面例子.单片机为例. 通常把在立即寻址方式指令中给出的数称为立即数. 立即数可以是8位、16位或32位,该数值紧跟在操作码之后.如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储.例如: MOV AH,80H ADD AX,1234H MOV ECX,123456H MOV B1,12H MOV W1,3456H ADD D1,32123456H 其中:B1、W1和D1分别是字节、字和双字单元. 以上指令中的第二操作数(源操作数)都是立即数,在汇编语言中,规定:立即数不能作为指令中的第一操作数(目的操作数).该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致. 立即数寻址方式通常用于对通用寄存器或内存单元赋初值. 下面以ARM汇编编译器为例: 立即数方式:每个立即数由一个8位的常数循环右移偶数位得到.其中循环右移的位数由一个4位二进制的两倍表示.如果立即数记作,8位常数记作immed_8,4位的循环右移值记作rotate_imm,则有: =immed_8循环右移(2*rotate_imm) 这样并不是每一个32位的常数都是合法的立即数,只有能够通过上面构造方法得到的才是合法的立即数. |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |