比较两个数大小汇编解析

比较两个数的大小, 用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语句的话跳转比较多。


有什么错误欢迎指出, 转帖请标明出处
谢谢合作!

比较两个数大小汇编解析

时间: 2025-01-05 18:57:53

比较两个数大小汇编解析的相关文章

比较两个数大小

public function gt($a,$b) {    $a = explode('.',$a);    $b = explode('.',$b);    $len = (count($a) > count($b)) ? count($a) : count($b);    for($i=0;$i<$len;$i++) {        if($a[$i]>$b[$i]) {            return 1;break;        } else if($a[$i]<

用abstract类比较两个数大小的

/** * */package com.xt.java.base11; /**com.xt.java.base11 * *AbstractClassDemo * * @author 王飞 * * QQ: 1816274408 *2017年4月3日下午3:43:58 * */abstract class A{ abstract int min(int x, int y); int max(int x,int y){ return x>y? x:y; }}class B extends A{ int

比较两个数的大小

因为 $$\log_25>\log_24=2>e^\frac{1}{2}$$ 所以 $$\log_52=\frac{1}{\log_25}<e^{-\frac{1}{2}}.$$ 比较两个数的大小,布布扣,bubuko.com

编程题:两个数比较大小,之后用变量t互换。

#include<stdio.h> void main() { float x,y,t; scanf("%f,%f",&x,&y); if(x<y) {t=x;x=y;y=t;} printf("%6.2f,%6.2f\n",x,y); } 流程图: 编程题:两个数比较大小,之后用变量t互换.,布布扣,bubuko.com

大小最接近的那两个数(位操作)

主要是熟悉位操作,寻找一个数二进制1位相同,且大小最相近的数. //题目描述 // //有一个正整数,请找出其二进制表示中1的个数相同.且大小最接近的那两个数.(一个略大,一个略小) //给定正整数int x,请返回一个vector,代表所求的两个数(小的在前).保证答案存在. //测试样例: //2 //返回:[1, 4] // //思路: //取得略大的数: //c0 是拖尾0的个数,c1是紧邻拖尾0左方连续位为1的个数, p为最右边但非拖尾的0 等于 c0 + c1 //1 把位p置为1

【C++】用函数模板实现不同类型的两个数比较大小

//用函数模板实现不同类型的两个数比较大小 #include <iostream> using namespace std; template <class mytype> //定义函数模板 class Max { public: Max(mytype a, mytype b) { x=a; y=b; } mytype printMax() { return x>y?x:y; } private: mytype x,y; }; int main() { Max <int

请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句(转载)

笔试的时候经常问这些: 方法一: #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a)) 若a>b,则a-b的二进制最高位为0,与上任何数还是0,所以大数为a: 否则,a-b为负数,最高位为1,与上0x80000000(最高位为1其他为0)之后为1,所以此时最大数为b. 方法二: #define max(a,b) ((((a)-(b))&(1<<31))?(b):(a)) 方法三:      1.#define 

比较两个数的大小,自定义比较两个整数的大小的方法

比较两个数的大小,自定义比较两个整数的大小的方法: 如果第一个数大,返回1 如果相等返回0 如果第一个数小,返回-1 在Main()方法中输入两个数,调用这个方法 示例: 请输入两个数: 45 56 第二个数大 按任意键继续...... 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 n

C语言学习笔记frist---输入两个数比较大小

C#学习中,问道艰辛,今自C学起,第一个函数学习:输入两个数比较大小,仅作练习: #include "stdafx.h" #include<stdio.h> // 包含stdio.h头文件 int max(int, int); // 函数声明 int main(){ int a,b; // 声明两个整型变量 printf("input two integer:");// 以空格为分隔 scanf("%d %d",&a,&