我是靠谱客的博主 合适飞鸟,最近开发中收集的这篇文章主要介绍汇编学习-转移指令和mul,div指令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

汇编中的转移指令有很多种,比如jmp,jcxz,call,ret,retf,loop等,能够分的种类细讲起来也很多,比如转移指令在内存中,转移指令在寄存器中,转移指令大小为16位,转移指令大小为32位等,这样看起来比较凌乱,也很难记得住。

个人学习总结后,觉得从转移指令所要完成的任务着手,就可以简单的将转移指令分成两种:

1.转移的是段内偏移地址,也就是只转移IP

2.转移的是整个目的地址,既转移IP,也转移CS

转移指针的目的就是为了方便程序的来回跳转,或者空开某些代码不执行,直接执行想执行的代码;或者是在主函数和子函数之间的跳转(如call和ret的结合使用)下面就分开来细述以下。

只转移IP,可以使用“jmp short 标号”,或者“jmp near ptr 标号”,或者“jmp 寄存器/内存单元”,或者jmp word ptr **。因为这里jmp后面的地址大小均为16位,也只能填充个IP而已,所以就属于段内转移。同样的,“loop 标号”,或者“jcxz 标号”也属于段内转移。注意jcxz和loop的转移地址范围均为-128到127。前者称为有条件转移,后者称为循环指令。

其中值得注意的是jcxz,它执行的条件是cx寄存器中的数据为0,然后才进行IP赋值和转移。比如我们希望执行转移指令时,先将CX赋值为0,然后执行jcxz。loop指令类似于for循环,循环次数为CX表示的数据。

转移CS和IP,也就是说段地址和段内偏移指针均发生变化的情况。很明显,如果都发生变换,则转移指令后面需要跟的数据必须是32位的,前16位给IP,后16位给CS。

比如jmp dword ptr **或者call far ptr **等。

这里将call和ret,retf单独拿出来讲,因为一般的场合会组合使用call和ret或者call和retf。类似于主函数内调用子函数等的操作。

其中call 和ret组合使用,call将IP push到栈中,然后执行call后面标号指向的指令(也就是存储主函数的调用地址,然后转到子函数中去执行),然后使用ret,pop IP(在子函数执行完毕后,返回主函数的中断地址)

或者call和retf组合使用,使用方式为call far ptr 标号,在子函数完成时调用retf。因为call far ptr完成的工作是先将CS push到栈中,然后将IP push到栈中(注意push顺序),retf执行的是pop指令,先pop IP,然后pop CS。


以上是转移指令的相关内容,也是自己的认识,往后深入学习中可能会不断的修改。因为学习本就是个不断假设不断推翻假设建立更扎实认识的过程。

另外,是关于mul指令和div指令的内容。

对于mul,两个相乘的数,必须位数是一致的。要么都是8位,要么都是16位。如果是8位,默认的一个乘数存放在al中,mul reg或者mul 内存单元。结果的高8位保存在ah中,低8位保存在al中。mul reg或者内存单位(16位),结果的高位存在dx,低位存在ax中。

对于div,被除数放在AX或者AX和DX中(高16位存在DX中,低16位存在AX中),被除数为8位或者16位。如果除数为8位,被除数默认为16位,存在AX中;如果除数为16位,被除数则为32位。对于结果,如果除数为8位,结果的商存在al中,余数存在ah中;如果除数是16位,结果的商存在ax中,余数存在dx中。

最后

以上就是合适飞鸟为你收集整理的汇编学习-转移指令和mul,div指令的全部内容,希望文章能够帮你解决汇编学习-转移指令和mul,div指令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(28)

评论列表共有 0 条评论

立即
投稿
返回
顶部