交换的是值。w的高8位值放在ret的低8位,w的低8位值放在ret的高8位。所以这个函数就是交换w的高低8位 |
交换的是值, |
cnos 发表于 2022-12-2 20:46 直接调用汇编指令不是更好吗 |
显然交换的是值,但是在51上面这么用很危险,因为局部变量都是静态分配的,而不是标准c语言那样在堆栈上生成局部变量,调用这个函数的函数应该在这个函数返回后,把返回值保存起来,不然很容易被覆盖。 |
这种写法的目的是为了让编译直接编译出MOV direct 的汇编指令,追求代码效率才这样写。其他写法都不会编译出直接MOV指令。我以前用AT89C的时候单片机速度有限,也是这么干的。要不然忙不过来,一个频繁中断的函数。 |
BYTE是一个字节,那么就是把一个数的bit0~bit7与bit8~bit15进行交换。 ((BYTE *)&w)[0]的运算过程如下: 1、&w取变量w的地址,其实是等到的一个指针; 2、((BYTE *)&w)把得到的指针,强制转换成BYTE *(指向BYTE的指针); 3、((BYTE *)&w)[0]获取指针指向地址中的内容(w的bit0~bit7),注意指针也可以进行下标运算。 其实这样写你就很容易看明白了: WORD ret; BYTE * p1 = (BYTE *)&w; BYTE * p2 = (BYTE *)&ret; *(p2 + 1) = *p1; *p2 = *(p1 + 1); return ret; |
[]中的数代表下标地址,所以((BYTE *)&w)[0]代表取下标0位置的值,前面不用加*号。 |
交换的是地址。前面加*号交换的就是值了。 |
关注下这个烧脑的问题![]() |