Sparc V8
为什么LD指令区分signed和unsigned,而ST指令不区分
LD指令有LDSB,LDSU是因为从内存加载到寄存器时,若是负数需要高位符号位扩充1。而ST指令不需要。见下面解释,p91
The load integer instructions copy a byte, a halfword, or a word from memory into r[rd]. A fetched byte or halfword is right-justified in destination register r[rd]; it is either sign-extended or zero-filled on the left, depending on whether or not the opcode specifies a signed or unsigned operation, respectively.
subcc等同于cmp
SUBcc和目的寄存器(rd=0)一起常用于有符号或无符号整数的比较,因为我们知道,比较指令(如CMP)在任何架构的机器中最终都是进行减法运算,如果结果为0,则表示两数相等。
在v8手册里,subcc是cmp指令的实际指令
关于分支转移指令有一个分支延迟时隙
因为sparc使用了PC和nPC的机制,即nPC->PC, nPC+4->nPC。
因此,在执行branch指令时,PC=branch地址,nPC=branch+4(即branch下一条指令的地址)。
执行完branch后,nPC->PC=branch下一条指令的地址, nPC=branch目标地址。
下面是一个解释

2.分支指令延时间隙(Branch delay slot), SPARC用两个程序指针PC和nPC,来保持指令执行的轨迹。PC持有下一条要执行的指令的地址;第二个程序指针,nPC持有PC的下一个值。通常,SPARC在每一条指令执行结束时更新当前程序指针,更新时,用nPC的值代替PC的值,nPC的值则是“其原值+4”。当它执行一个转移指令时,SPARC分配nPC的值给PC,然后更新nPC的值。如果跳转发生,nPC被分配一个用指令声明的目标(地址)值;否则,nPC的值是自增4的。也就是说,跳转指令发生时,一时并没改变PC的值到目标地址,它只能执行原nPC给的下一条指令(这就产生了跳转间隙)。
3.在跳转指令的延时间隙里不方便放有用的指令的情形时,SPARC提供 了“nop”复合指令。nop的执行,它不改变任何寄存器或内存的值。然而,它的作用是导致处理器执行更多的指令,比如,增加所需执行程序的时间。
4.用加后缀",a"来声明跳转间隙无效。如果条件分支指令没有发生,则跳转间隙中的指令无效。如 bg ,a top。
这里讲的延时间隙是很牛的东东
在Sparc汇编中经常看到,所以要花点时间:
test.c:
int temp;
int x = 0;
int y = 0x9;
int z = 0x42;
temp = y;
while(temp > 0)
{
x = x+z;
temp = temp-1;
}
简单地转换,这里用到nop指令放到“分支指令延时间隙(Branch delay slot)”中。
.data
x: .word 0
y: .word 0x9
z: .word 0x42
.text
start: set y, %r1
ld [%r1],%r2
set z, %r1
ld [%r1],%r3
mov %r0,%r4
add %r2, 1, %r2
ba test
nop !here, Branch delay slot
top: add %r4, %r3, %r4
test: subcc %r2, 1, %r2
bg top
nop !here, Branch delay slot
set x,%r1
st %r4,[%r1] !store x
end: ta 0
在上面,分支指令bg top,当发生跳转时,处理器并没有马上执行跳转,而是要执行完nop这条分支指令延时间隙中的指令后,才转移到top:处。
Ok,在“分支指令延时间隙(Branch delay slot)”中用有用的指令。
.data
......
.text
start: set y,%r1
ld [%r1],%r2
set z,%r1
ld [%r1],%r3
mov %r0,%r4
add %r2, 1, %r2
top: subcc %r2, 1, %r2
bg,a top
add %r4, %r3, %r4
set x, %r1
st %r4,[%r1]
end: ta 0
分支指令bg,a top,当发生跳转时,处理器并没有马上执行跳转,而是要执行完“add %r4, %r3, %r4”这条分支指令延时间隙中的指令后,才转移到top:处。而且,当跳转条件不满足时,分支指令延时间隙中的指令无效。
参考资料:
https://blog.csdn.net/macrossdzh/article/details/8168473
来源:https://www.cnblogs.com/yanhc/p/12255886.html
