7.2 基于寄存器的指令集


Dalvik 字节码指令集的字节码指令集不支持无符号整数运算,因此参照 Dalvik 设计了以下指令集。

基于纯寄存器的指令集,指令系统存在下列的要求:

  • 每条指令按照 16 bit 对齐。
  • 寄存器的索引位宽有 4 bit、8 bit、16 bit。
  • 最多支持 65536 个寄存器。
  • 每个寄存器 32 bit。
  • 64 bit寄存器由相邻的两个 32 bit 寄存器组合而成。
  • 指令操作码位宽为 8 bit。
  • 指令中可有子操作码,具体位宽看具体的指令格式。
  • 32 bit 寄存器内可以存储 32 bit的整数、浮点数。
  • 64 bit 寄存器内可以存储 64 bit的整数、浮点数。
  • 位宽小于 32 位的值,需要进行扩展(零扩展、符号扩展)到 32 bit。
  • 助记符中的 I 表示寄存器索引,后面的数字表示索引位宽

指令格式

总体格式:

操作码 + [ 操作子码 ] + ( 操作数 )*
  • 操作子码可选。
  • 操作数可以有多个。

寄存器位宽索引支持的寄存器数量:

位宽寄存器数量索引范围
4 bit16[ 0, 15 ]
8 bit256[ 0, 255 ]
16 bit65536[ 0, 65535 ]

空指令

文本格式: nop

助记符操作码对齐注解
格式8 bit8bit指令宽度:16 bit
nop0空操作,用于对齐

常量赋值指令

文本格式: op des, imm

助记符操作码目的寄存器立即数注解
8 bit4 bit4 bit4 bit 立即数,指令宽度:16 bit
const-w32-I4-i4desimmimm 为有符号整数,有符号扩展至 32 bit。
const-w64-I4-i4desimmimm 为有符号整数,有符号扩展至 32 bit。
const-w32-I4-u4desimmimm 为无符号整数,无符号扩展至 32 bit。
const-w64-I4-u4desimmimm 为无符号整数,无符号扩展至 32 bit。
8 bit8 bit16 bit16 bit 立即数,指令宽度:32 bit
const-w32-I8-i16desimmimm 为有符号整数,有符号扩展至 32 bit。
const-w64-I8-i16desimmimm 为有符号整数,有符号扩展至 64 bit。
const-w32-I8-u16desimmimm 为无符号整数,无符号扩展至 32 bit。
const-w64-I8-u16desimmimm 为无符号整数,无符号扩展至 64 bit。
const-w32-I8-L16desimmimm 为无符号整数。imm 存放在寄存器的低 16 bit,不改变高 16 bit。
const-w32-I8-H16desimmimm 为无符号整数。imm 存放在寄存器的高 16 bit,不改变低 16 bit。
8 bit8 bit32 bit32 bit 立即数,指令宽度:48 bit
const-w32-I8desimm原样拷贝,支持32 bit 整数和浮点。
const-w64-I8-i32desimmimm 为有符号整数,有符号扩展至 64 bit。
const-w64-I8-u32desimmimm 为无符号整数,无符号扩展至 64 bit。
8 bit8 bit64 bit64 bit 立即数,指令宽度:80 bit
const-w64-I8desimm原样拷贝,支持64 bit整数和浮点。

文本格式:op.sub des,imm

助记符操作码操作子码目的寄存器立即数注解
8 bit8 bit8 bit8 bit指令宽度:32 bit
const-w32-I8subopdesimmimm 为无符号整数

操作子码定义

助记符操作子码注解
B0imm存放在寄存器的第 1 个字节,不改变其他字节。
B1imm存放在寄存器的第 2 个字节,不改变其他字节。
B2imm存放在寄存器的第 3 个字节,不改变其他字节。
B3imm存放在寄存器的第 4 个字节,不改变其他字节。

寄存器赋值指令

文本格式:op des,src

文本格式:op des,src

助记符操作码目的寄存器源寄存器注解
8 bit4 bit4 bit指令宽度:16 bit
move-w32-I4dessrc32 位寄存器值传递
move-w64-I4dessrc64 位寄存器值传递
8 bit8 bit16 bit指令宽度:32 bit
move-w32-I8I16dessrc32 位寄存器值传递
move-w64-I8I16dessrc64 位寄存器值传递

文本格式:op.sub des,src

助记符操作码操作子码目的寄存器源寄存器注解
8 bit8 bit8 bit8 bit指令宽度:32 bit
mov-I8subdessrc
8 bit8 bit16 bit16 bit指令宽度:48 bit
mov-I16subdessrc

操作子码定义

助记符含义:

  • 目标位宽-源数据获取转换位宽

    • i:符号扩展。
    • u:零扩展。
    • 只有目标位宽时,表示源位宽直接拷贝传递。
  • 目标类型-源类型

    • 表示从源类型转换到目标类型
助记符操作子码注解
w32-B0-i80获取寄存器的第 1 个字节,进行符号扩展到 32 位
w32-B0-u81获取寄存器的第 1 个字节,进行零扩展到 32 位
w32-B1-i82获取寄存器的第 2 个字节,进行符号扩展到 32 位
w32-B1-u83获取寄存器的第 2 个字节,进行零扩展到 32 位
w32-B2-i84获取寄存器的第 3 个字节,进行符号扩展到 32 位
w32-B2-u85获取寄存器的第 3 个字节,进行零扩展到 32 位
w32-B3-i86获取寄存器的第 4 个字节,进行符号扩展到 32 位
w32-B3-u87获取寄存器的第 4 个字节,进行零扩展到 32 位
w32-L16-i168获取寄存器的低 16 位,进行符号扩展到 32 位
w32-L16-u169获取寄存器的低 16 位,进行零扩展到 32 位
w32-H16-i1610获取寄存器的高 16 位,进行符号扩展到 32 位
w32-H16-u1611获取寄存器的高 16 位,进行零扩展到 32 位
w321232 位原值拷贝传递
w64-B0-i813获取寄存器的第 1 个字节,进行符号扩展到 64 位
w64-B0-u814获取寄存器的第 1 个字节,进行零扩展到 64 位
w64-B1-i815获取寄存器的第 2 个字节,进行符号扩展到 64 位
w64-B1-u816获取寄存器的第 2 个字节,进行零扩展到 64 位
w64-B2-i817获取寄存器的第 3 个字节,进行符号扩展到 64 位
w64-B2-u818获取寄存器的第 3 个字节,进行零扩展到 64 位
w64-B3-i819获取寄存器的第 4 个字节,进行符号扩展到 64 位
w64-B3-u820获取寄存器的第 4 个字节,进行零扩展到 64 位
w64-L16-i1621获取寄存器的低 16 位,进行符号扩展到 32 位
w64-L16-u1622获取寄存器的低 16 位,进行零扩展到 32 位
w64-H16-i1623获取寄存器的高 16 位,进行符号扩展到 32 位
w64-H16-u1624获取寄存器的高 16 位,进行零扩展到 32 位
w64-i3225获取寄存器的 32 位,进行符号扩展到 64 位
w64-u3226获取寄存器的 32 位,进行零扩展到 64 位
w642764 位原值拷贝传递
i32-f322832 位有符号整数转 32 位浮点数
i32-f642932 位有符号整数转 64 位浮点数
u32-f323032 位无符号整数转 32 位浮点数
u32-f643132 位无符号整数转 64 位浮点数
i64-f323264 位有符号整数转 32 位浮点数
i64-f643364 位有符号整数转 32 位浮点数
u64-f323464 位无符号整数转 32 位浮点数
u64-f643564 位无符号整数转 64 位浮点数
f32-i323632 位浮点数转 32 位有符号
f32-i643732 位浮点数转 64 位有符号
f32-u323832 位浮点数转 32 位无符号
f32-u643932 位浮点数转 64 位无符号
f32-f644932 位浮点数转 64 位浮点数
f64-i324164 位浮点数转 32 位有符号
f64-i644264 位浮点数转 64 位有符号
f64-u324364 位浮点数转 32 位无符号
f64-u644464 位浮点数转 64 位无符号
f64-f324564 位浮点数转 32 位浮点数

数学运算指令

  • 有二地址、三地址分类。
  • 每类的主操作码不一致。

三地址操作

三地址文本格式: op.sub des,src,src2

助记符操作码操作子码目的寄存器源寄存器源操作数注解
8 bit8 bit8 bit4 bit4 bit指令宽度:32 bit
math-I4subdessrcsrc2
8 bit8 bit16 bit8 bit8 bit指令宽度:48 bit
math-I16I8subdessrcsrc2
8 bit8 bit16 bit16 bit16 bit指令宽度:64 bit
math-I16subdessrcsrc2

子码定义

助记符操作子码注解
add-int32032 位有符号 加 +
sub-int32132 位有符号 减 -
mul-int32232 位有符号 乘 *
div-int32332 位有符号 除 /
mod-int32432 位有符号 模 %
add-uint32532 位无符号 加 +
sub-uint32632 位无符号 减 -
mul-uint32732 位无符号 乘 *
div-uint32832 位无符号 除 /
mod-uint32932 位无符号 模 %
add-int641064 位有符号 加 +
sub-int641164 位有符号 减 -
mul-int641264 位有符号 乘 *
div-int641364 位有符号 除 /
mod-int641464 位有符号
add-uint641564 位无符号 加 +
sub-uint641664 位无符号 减 -
mul-uint641764 位无符号 乘 *
div-uint641864 位无符号 除 /
mod-uint641964 位无符号 模 %
add-flt322032 位浮点 加 +
sub-flt322132 位浮点 减 -
mul-flt322232 位浮点 乘 *
div-flt322332 位浮点 除 /
mod-flt322432 位浮点 模 %
add-flt642564 位浮点 加 +
sub-flt642664 位浮点 减 -
mul-flt642764 位浮点 乘 *
div-flt642864 位浮点 除 /
mod-flt642964 位浮点 模 %
sl-w323032 位 左移
sr-w323132 位 右移
sra-w323232 位 算术右移
rol-w323332 位 循环左移
ror-w323432 位 循环右移
and-w323532 位 位与
or-w323632 位 位或
xor-w323732 位 位异或
sl-w643864 位 左移
sr-w643964 位 右移
sra-w644064 位 算术右移
rol-w324164 位 循环左移
ror-w324264 位 循环右移
and-w644364 位 位与
or-w644464 位 位或
xor-w644564 位 位异或
andl-w324632 位 逻辑与
orl-w324732 位 逻辑或
cmp-int3248src < src2 : des=-1
cmp-uint3249src == src2 : des=0
cmp-int6450src > src2 : des=1
cmp-uint6451
cmp-flt3252
cmp-flt6453

二地址操作

二地址文本格式: op.sub des,src

助记符操作码操作子码目的寄存器源寄存器源操作数注解
8 bit8 bit8 bit8 bit指令宽度:32 bit
math-I8subdessrc
8 bit8 bit16 bit16 bit指令宽度:48 bit
math-I16subdessrc

子码定义

助记符操作子码注解
not-w32032 位 按位取反
not-w64164 位 按位取反
inv-w32232 位 逻辑取反
inv-w64364 位 逻辑取反
neg-int32432 位 符号取反
neg-int64564 位 符号取反
neg-flt32632 位 符号取反
neg-flt64764 位 符号取反
abs-int32832 位 取绝对值
abs-int64964 位 取绝对值
abs-flt321032 位 取绝对值
abs-flt641164 位 取绝对值
sin-flt3212三角函数
cos-flt3213三角函数
tan-flt3214三角函数
asin-flt3215三角函数
acos-flt3216三角函数
atan-flt3217三角函数
sin-flt6418三角函数
cos-flt6419三角函数
tan-flt6420三角函数
asin-flt6421三角函数
acos-flt6422三角函数
atan-flt6423三角函数

跳转指令

直接跳转指令

文本格式: goto imm

助记符操作码对齐立即数注解
8 bit8 bit指令宽度: 16 bit
goto8imm8 bit有符号偏移
8 bit8 bit16 bit指令宽度: 32 bit
goto16imm
8 bit8 bit32 bit指令宽度: 48 bit
goto32imm

分支跳转指令

文本格式
jbr src,src2,imm
jbr src,imm
  • 类型编码:标识操作数的类型。
  • 操作子码:标识比较方法。
  • 和 0 比较时,无源操作数 src2。
助记符操作码操作子码类型码源操作数源操作数立即数注解
8 bit4 bit4 bit
8 bit8 bit16 bit指令宽度: 32 bit
8 bit8 bit32 bit指令宽度: 32 bit
16 bit16 bit16 bit指令宽度: 32 bit
16 bit16 bit32 bit指令宽度: 32 bit
srcsrc2imm
操作子码
助记符操作子码注解
eq0if( src == src2 ) goto imm
ne1if( src != src2 ) goto imm
lt2if( src < src2 ) goto imm
le3if( src <= src2 ) goto imm
gt4if( src > src2 ) goto imm
ge5if( src >= src2 ) goto imm
eqz6if( src == 0 ) goto imm
nez7if( src != 0 ) goto imm
ltz8if( src < 0 ) goto imm
lez9if( src <= 0 ) goto imm
gtz10if( src > 0 ) goto imm
gez11if( src >= 0 ) goto imm

注意: 和 0 比较时,无源操作数 src2。

类型码
助记符操作子码注解
int32032 位有符号比较
uint32132 位无符号比较
int64264 位有符号比较
uint64364 位无符号比较
flt32432 位浮点数比较
flt64564 位浮点数比较

返回指令

文本格式: op src op imm

助记符操作码操作子码立即数码源操作数注解
8 bit8 bit指令宽度: 16 bit
return-void无参数返回
return-w32-I8返回 32 bit 值
return-w64-I8返回 64 bit 值
8 bit4 bit4 bit16/32/64 bit
操作子码
助记符操作子码注解
I160寄存器索引16位
int321立即数转换到32位有符号整数
uint322立即数转换到32位有符号整数
int643立即数转换到32位有符号整数
uint644立即数转换到32位有符号整数
flt325立即数转换到32位有符号整数
flt646立即数转换到32位有符号整数
立即数码
助记符操作子码注解
B16016 位立即数
B32132 位立即数
B64264 位立即数

函数调用指令

不固定参数调用

文本格式:op argcnt, arg,arg2,…,func

助记符操作码参数个数参数寄存器函数注解
8 bit8 bit16 bit32 bit
invoke-virtual-nofixargcntarg…func调用虚函数
invoke-direct-nofixargcntarg…func直接调用函数
invoke-static-nofixargcntarg…func调用静态函数
invoke-interface-nofixargcntarg…func调用接口函数
invoke-native-nofixargcntarg…func调用C语言函数

范围参数调用

文本格式:op argcnt,start, end,func

助记符操作码参数个数起始寄存器结束寄存器索引函数注解
8 bit8 bit16 bit16 bit32 bit
invoke-virtual-rangeargcntarg…func调用虚函数
invoke-direct-rangeargcntarg…func直接调用函数
invoke-static-rangeargcntarg…func调用静态函数
invoke-interface-rangeargcntarg…func调用接口函数
invoke-native-rangeargcntarg…func调用C语言函数

获取返回值指令

文本格式:op des

助记符操作码对齐源寄存器注解
8 bit8 bit指令宽度: 16 bit
get-result-w32-I8des获取32位返回值
get-result-w64-I8des获取64位返回值
get-result-obj-I8des获取对象返回值
8 bit8 bit16 bit指令宽度: 32 bit
get-result-w32-I16des获取32位返回值
get-result-w64-I16des获取64位返回值
get-result-obj-I16des获取对象返回值

异常处理指令

文本格式:op des

助记符操作码对齐源寄存器注解
8 bit8 bit指令宽度: 16 bit
get-exception-I8des获取异常对象
throw-I8src抛出异常对象
8 bit8 bit16 bit指令宽度: 32 bit
get-exception-I16des获取异常对象
throw-I16src抛出异常对象