汇编总结-第二部分_2_数据处理

来源:互联网 发布:音乐播放器软件下载 编辑:程序博客网 时间:2024/03/28 18:25

关于流程控制的太过简单,所以就在这里简单介绍一下。后面写数据处理。

 

汇编之中想要转变位置只能使用类似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的结构了。FPU在X86结构中是相当于一个循环链表在使用的。使用了一个FPU就开始使用下一个FPU寄存器。最多存储8个FPU。

对于程序员来说当前的FPU始终都是ST0。通常写作st(0)。

 

关于FPU堆栈的一些指令:

FSTSW指令,可以用来将状态寄存器读取到一个双子内存位置或者AX寄存器中

FSTCW指令,把FPU控制寄存器复制到内存位置。

FILDS指令,把一个双字整数值加载到FPU寄存器堆栈中。

FISTS指令,获取寄存器堆栈顶部的值,并且把它存放到目标位置。

  

 

关于字符串的处理。

Movsb 传送一个字节的指令。

Movsw 传送2个字节的指令。

Movsl 传送4个字节的指令。

这3个指令和ESI和EDI寄存器的值相关。

所以设置好ESI和EDI寄存器之后,只用不断的重复movsb就可以传送一个串了。

不过你是从头开始传,还是从结尾开始传呢?

这个和ESI和EDI变化的方向有关。

DF==0那么两个寄存器递增,DF==1那么两个寄存器递减。

DF是标志寄存器,可以用CLD命令清零,用STD命令置1。

 

如果字符串很长怎么办呢? 不可能还复制一大堆MOV指令吧。

这里又有了一种很有用的前缀命令REP.

就像这样

rep movsb

重复多少次呢?直到ECX寄存器中的值为0为止。

 

当然如果是复杂的条件怎么办呢?gas为我们提供了其他更方便的命令:

REPE  REPNE REPZ REPENZ

这4个命令都是关于零标志位的。

当然还有CMPS命令,提供其他标志位的判断。用到再百度就行了。

 

 

这一部分绝大部分是需要不断练习才能熟练掌握的。对于我这种只是了解汇编,没必要掌握的那么清楚。不懂直接google百度就行了。

0 0