第十章 call和ret指令
ret指令用栈中的数据,修改ip的内容,从而实现近转移;
retf指令用栈中的数据修改cs和ip的内容,从而实现远转移。
cpu执行ret指令时,进行下面两步操作: pop ip
①(ip)=((ss)*16=(sp))
②(sp)=(sp)+2
执行retf指令时,进行下面4步操作:
①(ip)=((ss)*16=(sp))
②(sp)=(sp)+2
③(cs)=((ss)*16=(sp))
④(sp)=(sp)+2
call指令不能实现短转移。
cpu执行call指令时,进行两步操作:
① 将当前的ip或cs和ip压入栈
② 转移
call 标号(将当前的ip压入栈后,转到标号处执行指令
cpu执行此种格式的call指令时,进行如下操作: push ip
①(sp)=(sp)-2 jmp near ptr 标号
((ss)*16=(sp))=(ip)
②(ip)=(ip)+16位位移
16位位移=标号处的地址-call指令后的第一个字节的地址;
16位位移的范围为-32768~32767,用补码表示;
16位位移由编译程序在编译时算出。
call far ptr 标号 ;段间转移
①(sp)=(sp)-2
((ss)*16=(sp))=(cs)
(sp)=(sp)-2
((ss)*16=(sp))=(ip)
②(cs)=标号所在段的段地址
(ip)=标号所在段的偏移地址
call 16位reg:
(sp)=(sp)-2
((ss)*16=(sp))=(ip)
(ip)=(16位reg)
call word ptr 内存单元地址
call dword ptr 内存单元地址
call指令转去执行子程序前,call指令后面的指令的地址将存储在栈中,所以可在子程序的后面使用ret指令,用栈中的数据设置ip的值,从而转到call指令后面的代码处继续执行。
mul是乘法指令,使用mul做乘法的时候注意以下:
① 两个相乘的数,要么都是8位,要么都是16位,如果是8位,一个默认放在al中,另一个放在8位reg或内存单元中;如果是16位,一个默认放在ax中,另一个放在16位reg或内存单元中。
② 结果:如果是8位乘法,结果默认放在ax中;如果是16位乘法,结果高位默认在dx中存放,低位在ax中存放。
格式:mul reg
mul 内存单元
对于存放参数的寄存器和存放结果的寄存器,调用者和子程序的读写操作恰恰相反:调用者将参数送入参数寄存器,从结果寄存器中取到返回值;子程序从参数寄存器取到参数,将返回值送入结果寄存器。
我们将批量数据放到内存中,然后将他们所在的内存空间的首地址放到寄存器中,传递给需要的子程序。对于具有批量数据的返回结果也可以用同样的方法,
为避免寄存器冲突,可以用栈来保存寄存器中的内容。
子程序标准框架:
子程序中使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret、retf)
- [kanwangxue] 如果是文字的,不是特别好啊,体力活,如果文字还加点动画,那就必须顶了。 01/15 01:10
- [kanwangxue] 必须顶啊。 01/15 00:54
- [ltoiii] 既然是实现loop功能,是否要考虑s和se标号? mov bx,offset s - offset 12/09 12:09
- [xiaoyao2012] 正确 11/01 15:33
- [xuer2016] 又找到2条被我忽视的地方: 1.PUSH 和 POP 针对字单元 2.POP 不能是CS 10/26 10:57
- [xuer2016] 学习了 我书写不规范,16进制字母前不加0,后面不加H,以后要注意了。。。 10/26 10:51
- [xuer2016] 来老师这学习下 10/26 10:31
- [youthangel] 不妙,CPU的利用率一下子就上去了。还好我的处理器不是太弱,35%左右的利用率。建议博主在修改一下 10/20 08:23
- [fpamc] 在我心里她就是我的女神。 10/02 08:58
- [newpeople] 你女朋友用得了简直就是一个女神…… 10/01 08:10
- [99998888] 请您指点一下如何找到会ASSEMBLER 语言的翻译,翻译成中文或英文。我的QQ ; 9097815 07/25 09:56
- [jeremy] 我觉得你学习的挺好,可以加你扣扣吗?我的469614823 08/07 14:46
- [zhangbo0805] 哈哈, 你好呀!很希望认识你呀!我发现你学习的积极性很高!正想向您学习呢! 07/31 23:31
- [tomato] 知道了,排得还挺满。 05/29 16:35
- [tomato] 现在学习情况怎么样?在做课设二还是什么? 05/29 10:41
- [tomato] 你的留言收到了。 05/05 23:51
- [fpamc] 开始学习c咯! 05/03 21:40
- [fpamc] 居然不能发博客了……! 04/22 21:03
- [tomato] 你相册中的游戏界面我看过了,非常好,界面很漂亮,很有创造力。博主,很有潜力。加油,一定能把这个游戏做 04/20 23:46
- [fpamc] 忙了半个月,不在家,没时间学习汇编。 但是在途中想到了一个有史以来最难的程序。对于刚学完9章的我。 04/13 20:56