关于流程控制的太过简单,所以就在这里简单介绍一下。后面写数据处理。
汇编之中想要转变位置只能使用类似C语言中goto的模式,也就是跳转指令
跳转指令分为下面3类。
·短跳转 偏移量128字节之内的跳转。
·近跳转 所有其余跳转
·远跳转 按段来跳转(可以清空流水线)
实际上偏移量128字节就说明了其控制偏移大小的是一个8位二进制所表示的范围。
C语言中的switch最多也只支持256个跳转,我估计可能和这类指令有关。
至于怎么跳转,一般的跳转,类似goto直接用jmp+标签跳转。
对于函数直接 call+地址标签就行了。Call和ret指令配合使用可以隐式操作栈(只保存关于寄存器的值)。
并且跳转改变EIP的值,也就是组成原理中的PC寄存器。
下面是循环。
LOOP命令。
其实循环所用的寄存器是ecx。用来控制循环的次数。每循环一次,自动递减一。
并且loop也是短跳转.只支持8位二进制的偏移量。
下面主要就是说明数据的部分了。
但整数部分没什么好说的。所以就只介绍浮点数相关的内容了。
之前介绍的寄存器都是通用的整数格式的寄存器。所以对于浮点数这种包含两个整数部分的数来说,就不太合适了。X86一共有8个浮点寄存器FPU。他们的大小都是80位的。
所以对于C语言中的浮点数运算来说,似乎都会有精度的丢失。我想这也是为什么对于浮点数要用相减判断差值小于多少来判断浮点数是否相等了。因为可能一部分运算在FPU中,一部分可能取出来计算存到通用寄存器之中了。那么存储在通用寄存器中的精度损失就很大了。
然后需要说明的就是FPU的结构