假设我有$t0,并且我想将其整数内容除以2,并将其存储$t1.
我的直觉说: srl $t1, $t0, 2
......但如果...说...最右边的位是1,那不会是一个问题吗?或者这一切都是在洗涤中出现的,因为最右边的位(如果是正数)会产生$t0一个奇数,即使在分割时也会变为偶数?
教导我,明智的人......
使用指令sra:右移算术!!
sra $t1, $t0, 1
Run Code Online (Sandbox Code Playgroud)
将$ t0的内容除以2的第一次幂.
说明:按移位量(shamt)右移寄存器值,并将值放在目标寄存器中.符号位移入.
操作:$ d = $ t >> h;
advance_pc(4);
语法:sra $ d,$ t,h
编码:0000 00-- --- t ttt dddd dhhh hh00 0011
为什么这很重要?检查这个将整数(程序的输入)除以2的简单程序.
#include <stdio.h>
/*
* div divides by 2 using sra
* udiv divides by 2 using srl
*/
int div(int n);//implemented in mips assembly.
int udiv(int n);
int main(int argc,char** argv){
if (argc==1) return 0;
int a = atoi(argv[1]);
printf("div:%d udiv:%d\n",div(a),udiv(a));
return 1;
}
//file div.S
#include <mips/regdef.h>
//int div(int n)
.globl div
.text
.align 2
.ent div
div:
sra v0,a0,1
jr ra //Returns value in v0 register.
.end div
//int udiv(int n)
.globl udiv
.text
.align 2
.ent udiv
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)udiv: srl v0,a0,1 jr ra //Returns value in v0 register. .end udiv
编
root@:/tmp#gcc -c div.S
root@:/tmp#gcc -c main.c
root@:/tmp#gcc div.0 main.o -o test
Run Code Online (Sandbox Code Playgroud)
试驾:
root@:~# ./test 2
div:1 udiv:1
root@:~# ./test 4
div:2 udiv:2
root@:~# ./test 8
div:4 udiv:4
root@:~# ./test 16
div:8 udiv:8
root@:~# ./test -2
div:-1 udiv:2147483647
root@:~# ./test -4
div:-2 udiv:2147483646
root@:~# ./test -8
div:-4 udiv:2147483644
root@:~# ./test -16
div:-8 udiv:2147483640
root@:~#
Run Code Online (Sandbox Code Playgroud)
走着瞧吧?该SRL指令被移位的符号位
-2 = 0xfffffffe
如果我们向右移一位,我们得到0x7fffffff
0x7ffffffff = 2147483647
当然,当数字是正整数时,这不是问题,因为符号位是0.
| 归档时间: |
|
| 查看次数: |
14264 次 |
| 最近记录: |