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