首页 > 代码库 > 比较两个数大小汇编解析
比较两个数大小汇编解析
比较两个数的大小, 用C语言写很容易
int compare1(int x, int y) { if (x > y) { return 1; } else if (x == y) { return 0; } else { return -1; } }
用gcc生成powerPC ppu汇编指令, 用默认的-O选项
生成的汇编代码:
.compare1: .LFB39: stdu 1,-80(1) .LCFI3: std 31,72(1) .LCFI4: mr 31,1 .LCFI5: mr 0,3 mr 9,4 stw 0,128(31) stw 9,136(31) lwz 9,128(31) lwz 0,136(31) cmpw 7,9,0 ble 7,.L4 li 0,1 stw 0,48(31) b .L6 .L4: lwz 0,128(31) lwz 9,136(31) cmpw 7,0,9 bne 7,.L7 li 9,0 stw 9,48(31) b .L6 .L7: li 0,-1 stw 0,48(31) .L6: lwz 9,48(31) extsw 0,9 mr 3,0 ld 11,0(1) ld 31,-8(11) mr 1,11 blr当然这么多指令, 很多都不太清楚, 但是有点写操作当中是有些压栈了的,下面就用gcc 的-O3 选项就行优化
.compare1: .LFB39: cmpw 7,3,4 li 3,1 ble 7,.L11 .L6: extsw 3,3 blr .L11: li 3,0 beq 7,.L6 li 3,-1 b .L6这样得到的代码还是明显少了很多, 但是我用if语句, 跳转比较多, 大家都知道跳转是比较耗时的
所以我就写了另外的一种写法:
int compare2(int x, int y) { return x < y ? -1 : x == y ? 0 : 1; }上面的代码非常简洁, 我们看一下gcc -O3汇编出来的代码, 默认-O选项的代码我就不列出了, 读者可以自己试试以下
.compare2: .LFB40: xor 0,3,4 // r3 = x, r4 = y cmpw 7,3,4 srawi 11,0,31 // r0算术右移31位 li 9,-1 xor 3,11,0 subf 3,3,11 // 这个指令的意思是说r3 = r11 - r3 blt 7,.L15 srwi 9,3,31 // r9 = r3 逻辑右移31位 .L15: extsw 3,9 blr我大概知道了编译是怎么做, 所以我自己根据编译的做法, 自己也写了一个:
<span style="white-space:pre"> </span>li r9, -1 // r9 = -1 <span style="white-space:pre"> </span>subf r6, r3, r4 <span style="white-space:pre"> </span>cmpwi cr7, r6, 0 // cal the diff <span style="white-space:pre"> </span>blt cr7, .Out // jump to store -1 <span style="white-space:pre"> </span>li r7, 0 <span style="white-space:pre"> </span>subf r6, r6, r7 // cal 0 - diff, if the diff = 0, then r6 = 0, diff > 0, r6 < 0 <span style="white-space:pre"> </span>srwi r9, r6,31 // mov the sign bit to r9, .Out: <span style="white-space:pre"> </span>mr r3, r9 // r3 是存储返回值的寄存器 <span style="white-space:pre"> </span>blr
以上就是比较两个数的大小的C和汇编的分析, 但是用if语句的话跳转比较多。
有什么错误欢迎指出, 转帖请标明出处
谢谢合作!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。