汇编网首页登录博客注册
fpamc的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态

[2012-05-02 19:40] 第十章笔记

第十章 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)
评论次数(0)  |  浏览次数(199)  |  类型(汇编笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码