整数加减法运算的电路:

相关知识:

补码运算:

image.png
减法器:当sub等于1,做减法。Y按位取反后送到加法段,同时加上Cin达到末尾加1的效果,这个步骤其实是求Y的补码。
image.png
补码加法运算中,不区分符号位和数值位。加法器执行的就是0,1序列的运算,没有符号区分。

实验程序:

image.png

实验过程:

1.编译程序和反汇编:
image.png
2.查看反汇编文件:
image.png
3.在IA-32中带符号整数的加法和无符号底层采用的机器级的指令是一样的。实现带符号整数的加减运行和去符号整数的加减运算电路只有一个。
image.png
MIPS指令系统中无符号加减运算指令不置溢出状态,也即输出的of都是0;
不同的指令体系都只有一个加减运算电路,只不过不同的指令体系的标志位的处理不一样。
4.调试该程序:
image.png
5.总结:当sub为0时做减法,当sub为1时做加法,带符号整数的加减法运算采用补码形式让加减运算可以用同一个电路实现,不管无符号还是有符号其加减运算的机械数是一样的。

整数加减运算的状态标志信息:

相关知识:OF:溢出标志,带符号整数是否超出范围;对于加法器来说只有同号相加有溢出;ZF:零标志位;SF:符号标志位,其结果为Sum的最高有效位;Count:加法器的最高有效位,有进位为1,没有为0;CF:进/借位信息;;

查看标志寄存器:

image.png
image.pngimage.png

调试查看ua+ub运算的寄存器:

image.pngimage.png

调试跟踪a-b的标注为:

image.png
image.png

总结:

image.png这里的”14 uc=ua+ub;表示断点在14行,14行的内容是uc=ua+ub;程序会停止在14行,其中14的内容没有执行;键入s会执行这条语句,同时会在屏幕显示是即将执行的语句;s选项是执行下一行语句(会过滤空行),遇到函数的时候进入函数内并停留在函数的第一行;n选项跟s一样,唯一的区别是n选项遇到函数时会直接执行函数;
GDB调试命令详解_小桥流水人家_的博客-CSDN博客
image.png这里表示si将要执行的是d=a-b这条语句产生的指令的第一个指令。
image.pngud=ua-ub;这条语句没有执行;

整数加减结果溢出问题:

相关程序:

image.png
2.

编译运行程序:

image.png

总结:

image.pngimage.png
image.pngimage.png
image.png
image.png
整型转换和截断操作本身并不会改变 CF 和 OF 标志位的值。

IEEE 754浮点数标准:

相关知识:

image.png
image.png
规格化数:
image.pngimage.png
非规格化数:
image.png
image.png

测试程序代码:

image.png

编译运行:

image.png这里需要选择-g选项,表示生成调试信息,不然后面调试中输入l选项会报:No symbol table is loaded. Use the “file” command.错误
image.png

反编译:

image.png

调试追踪程序:

image.png
x/23xw $esp:23是(R[ebp]-R[esp]+4)/4得到的,求的是栈的大小,这里的w是4字节显示也即选取4字节然后显示出来,这里显示出来的结果以及处理过了的,显示的内容不是小段方式了。
image.png这里看出-0x4c(%ebp)=0xffffd3fc(内容是0x7f8000000阶码全为1,尾数全为0,这里已经处理过了,不用按照小段方式处理了)处的内容是无穷大。

尾数舍入问题:

程序代码:1.与IEEE 754的代码一致

问题分析:

1,定义的0.1但是print的结果与0.1有出入?
image.pngimage.png
image.pngimage.pngimage.png
image.png(有隐藏1)
image.png
image.png

4种舍入标准:

image.png
image.png
意味着a,b之间的数据只能用a,b近似表示;image.png
image.png

浮点数的基本运算:

相关知识点:

image.pngimage.png
image.png

模拟0.1相关的爱国者导弹问题程序:

image.png

编译运行:

image.png