机器级表示总结一,移位运算,控制指令

Posted 王玉成的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器级表示总结一,移位运算,控制指令相关的知识,希望对你有一定的参考价值。

概述

第四章主要讲述的是语言的机器级表示。
实际上,做为非汇编的机器语言,在应用层的程序开发时,是很少接触到汇编语言的。但是,汇编语言又是非常重要,只有理解了汇编语言,才能如何优先代码,如何调试代码,如何写出健壮的代码。现有的C库中某些函数的问题,如何分析,如何规避。
在嵌入式系统开发中,特别在非MMU的祼机程序中,程序的入口,异常管理,更需要对汇编语言的深入了解。
这一章的分析流程特别适合学C语言的人去理解汇编。在我的总结中,也尽量用汇编来解解释C语言的问题。

移位运算

我们在C语言的编程中,常常会说,位运算的效率最高。因为位运算可以用移位指令来代替。移位指令中,一般有三种,左移,算术右移,逻辑右移。由于最高位是符号位,算术右移后,左边补的最高位。算术右移是唯一一个带符号的移位运算。移位运算,除了在写驱动,祼机系统,操作寄存器时,使用较多以外,编译器也会将一些特殊的乘除法,分解成移位运算和加减运算的组合。比如a * 5 会被分解为a * 4 + a。减少了乘法运算的周期。
给嵌入式程序员的忠告,在涉及寄存器的操作时,千万要用无符号数,万一编译器翻译成算术右移,碰巧最高位为1时,就哭死了。

控制指令

主要是针对C语言的条件语句、循环语句和分支语句的翻译。
条件语句中,会涉及到条件码,在寄存器的角度,一般会有进位,零,符号,还有溢出等标志。其中对应于C语言的,>, ==. < 等操作。其中会用到汇编语言中的比较指令,与或操作指令。对于无符号数的比较,一般是进位标志和零标志。机器语言是不会认识有符号和无符号的。
循环语句一般为while和for。网上会看到这样的讨论,究竟是while的效率高,还是for的效率高。实际上编译器会把其它的循环转换成do-while的形式,然后再翻译成机器码。在汇编语言中,直接用的跳转指令来完成的。有人反对c语言的goto语句,但是在汇编的解释中,goto语句效率也是挺高的。
但是条件语句,在流水线操作时,会一次取一段代码。如果是条件语句,万一代码取错,代价是相当大的。所以linux内核会加上likely或者是unlikely来帮助编译器进行代码优化。在x86的指令中,有一条条件传送指令,在一个周期完成条件成立的状态下处理某个值的。但是,现在也只是结果为一条指令时,编译器才会用条件传送指令来完成,便使用范围是挺有限的。
switch语句,有专用的翻译方式,一般是汇编语言建立一个跳转表。高效的完成不同情况下的跳转。与if-else if-else对比,执行开关语句的时间与开关数量无关,汇编语言的处理更高效。所以有多个else if使用时,建议改为switch语句,提高程序效率。

以上是关于机器级表示总结一,移位运算,控制指令的主要内容,如果未能解决你的问题,请参考以下文章

Java零基础学习 移位运算符

计算机组成原理 王道考研2021 第二章:数据的表示和运算 -- 定点数的运算(移位加减运算溢出判断符号扩展)

CSAPP:第三章程序的机器级表示2

Java编程思想学习杂记(1-4章)

arm指令周期

程序的机器级表示