目录

10.1 ret和retf

(1)  ret:

(2)retf:

10.2 call指令

10.3依据位移进行转移的CALL指令

10.4 转移的目的地址在指令中的CALL指令

10.5转移地址在寄存器中的CALL指令

10.6转移地址在内存中的call指令

10.7call和ret指令的配合使用

10.8 mul指令

10.9模块化程序设计

10.10参数和结果的传递问题

10.11批量数据的传递

10.12寄存器冲突问题


从这一章开始,开始以小节为单位视频课本结合看,之前都是看完一章视频后再看课本,当然有不足,那就是不知道视频讲的啥,从这一章开始,以每一小节为单位,并且,小节也是结合看,并没有先后之分,希望这样的学习效率更高些。

第十章讲的是call和ret 指令,他们修改IP或同时修改IP和CS。经常共同实现子程序设计。

10.1 ret和retf

(1)  ret:

ip=((ss)*16+(sp))

(sp)=(sp)+2

从而实现ip的修改实现近转移

其实就相当于:

pop ip

(2)retf:

ip=((ss)*16+(sp))

(sp)=(sp)+2

cs=((ss)*16+(sp))

(sp)=(sp)+2

从而实现ip的修改和cs的修改实现远转移     

其实就相当于:

pop ip

pop cs

10.2 call指令

cpu执行call指令进行两步操作

(1)将当前的IP或CS 和IP压入栈中

(2)转移

CALL不能实现短转移,另外call转移和jmp指令的原理相同。

10.3依据位移进行转移的CALL指令

CALL标号:

将当前的IP压入栈后再转移到标号处执行指令

(注意当前IP是执行CALL的下一条指令,CALL的下一条指令只是被IP所指过,但是并没有被执行,因为IP立即就改变了)

CPU执行此种格式的CALL指令时,进行如下操作

(1)(sp)=(sp)-2

((ss)*16+(sp))=(IP)

(2)(IP)=(IP)+16位位移

(1)16位位移=标号的偏移地址-call指令的下一条指令的第一个字节的地址

(2)16位位移范围是-32768~32767用补码表示

(3)16位位移由编译程序在编译时算出

CLL  标号

push IP

jmp near ptr 标号

*在dosbox中可以用r cs或者 r IP 修改cs  ip 以达到目的去执行相应的指令

*或者用a 指令修改此时所指向的cs:ip的命令

-a jmp 要跳转到的段地址:偏移地址

10.4 转移的目的地址在指令中的CALL指令

前边的CALL指令,其对应的机器码指令中并没有转移的目的地址,而是相对于当前IP的转移位移。

CALL far ptr 标号    实现的是段间偏移

CUP执行时进行的操作

(1)将SP 和SS分别入栈

(sp)=(sp)-2

((ss)*16+(sp))=(CS)          *将cs入栈

(sp)=(sp)-2

((ss)*16+(sp))=(IP)

(2)完成跳转

(CS)=标号所在段地址

(IP)=标号所在偏移地址

call far ptr 标号相当于:

push CS

push IP

push far ptr 标号

10.5转移地址在寄存器中的CALL指令

call 16位寄存器

操作

(sp)=(sp)-2

((ss)*16+(sp))=(IP)

上两步操作为入栈操作,将call 寄存器指令的下一条指令的ip入栈

(IP)=(16位reg) *跳转

监测点10.4

用[bp]寻址时默认段地址在ss中

10.6转移地址在内存中的call指令

两种格式:

(1)call word ptr 内存单元地址

push ip

jmp word ptr 内存单元地址

(2)call dword ptr 内存单元地址

push cs  *先cs

push ip  * 后ip

jmp dword ptr 内存单元地址

会先修改ip(内存单元16位地址) 在修改cs(内存单元高16位)

10.7call和ret指令的配合使用

我们知道call指令是将IP入栈,而ret指令是将IP出栈,那么我们就可以将两者结合起来实现子程序的调用,我所理解的就是C语言中的函数调用,大致框架是这样的,

标号:

指令

ret

具有子程序的云程序框架如下

assume cs:code
code segmentmain: ;.............  call  sub1      ;调用子程序sub1mov ax,4C00hint 21hsub1:;........  ;子程序sub1开始call sub 2  ;子程序sub2开始ret         ;子程序返回sub2:;...ret         ;子程序返回code ends
end main

10.8 mul指令

mul乘法指令

(1)两个相乘的数:要么都是8位要么都是16位。如果都是8位,一个默认放在AL中,另一个放在8位reg中或者内存字节单元中。如果是16位,一个默认放在AX中,另一个放在16位reg或内存单元字单元中。

(2)结果:8位乘法的结果默认放在AX中,16乘法高位在DX中,低位在AX中。

格式:

mul   ret

mul 内存单元

mul byte ptr ds:[0]

mul word ptr [bx+si+8]

10.9模块化程序设计

将复杂的问题转化成简单的问题,使用call和ret指令

10.10参数和结果的传递问题

10.11批量数据的传递

寄存器的数量是有限的,如果数据过多可以将数据放到内存单元中,来进行读取和写入。

10.12寄存器冲突问题

为了避买子程序使用寄存器和主程序使用的寄存器发生冲突,我们通常在子程序的开始将所用到的寄存器push到栈中保护起来,在ret前再将所push的寄存器pop出来(顺序相反)

由于时间问题,索性将课程设计放到最后,所以先不整理课程设计的内容。直接进行下一章的笔记。

王爽老师汇编语言第四版第十章CALL和RET指令——小白笔记相关推荐

  1. 王爽老师汇编语言第四版:实验九 根据材料编程

    目录 1.首先是编译问题 2.显示缓存区每一行是80个字符也就是160个字节 3.当数据想要写到第二行时  这时si已经向后走了16个位移了所以不能直接+160 应该+160-32 4.视频中教程用一 ...

  2. 王爽老师汇编第三版课程设计 一

      该课程设计是在屏幕输出公司21年的详细信息,包括年份.当年总收入.当年人数.当年的人均收入(这个需要运用除法运算).   显示总收入需要解决除法溢出的问题,改进除法运算,见课本王老师的附录讲解   ...

  3. 王爽老师汇编语言监测点1.1

    自学汇编交流学习,自己理解的不一定完全正确 1.1个cpu的寻址能力为8kb,那么它的地址总线宽度为(13) 总线宽度 计算                                      ...

  4. 王爽老师汇编语言实验7

    目录 1.首先观察数据 定义了三个类型的数据分别是: 2.验证数据 3.将数据和寄存器绑定 前边几行代码是用来将寄存器和段地址关联起来的 4.下面我们来一个一个解决问题 (1)先把年份放到对应位置 法 ...

  5. 王爽《汇编语言第三版》实验10-1代码实现

    ;编写一个通用的子程序实现这个显示字符串的功能,提供灵活的调用接口,使调用者 ;可以决定显示的位置,内容,颜色 assume cs:code,ss:stack,ds:data data segment ...

  6. C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 我们知道作为一个语言本身是不会有诸如从main函数开始运行这样的条件(深层次的说 底层汇编代码不会指定从mian函数开始的这样的条件,程序开始的位 ...

  7. 自学王爽老师汇编语言 检测点6.1

    自学汇编,讨论学习,不对之处请指出共同学习,不喜勿喷 1,下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序: assume cs:codecode segmentdw 0 ...

  8. 《汇编语言》王爽(第四版) 第十章 实验10

    文章目录 前言 一.子程序1 显示字符串 1.实验任务 2.分析 (1)如何在指定位置显示 (2)如何显示指定颜色 (3)保存子程序中用到的寄存器 3.代码 二.子程序2 解决除法溢出的问题 1.实验 ...

  9. 汇编语言 (第2版) 王爽 中文高清PDF版下载

    汇编语言 (第2版) 王爽 中文高清PDF版下载 转载于:https://www.cnblogs.com/gavinhughhu/archive/2009/12/10/1620783.html

最新文章

  1. initBuilder注解接收多个对象
  2. JavaScript数组方法大全解
  3. UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)
  4. ICLR 2022 | 香侬科技提出基于图神经网络的语义理解模型,获单项满分
  5. gis怎么改鼠标滚轮缩放_PhotoShop缩放画面的快捷方式
  6. 【POJ - 1651】Multiplication Puzzle(区间dp)
  7. [NLP]基于IMDB影评情感分析之BERT实战-测试集上92.24%
  8. java 2分代复制垃圾回收_Java垃圾回收机制
  9. P5018 对称二叉树
  10. android md5加密工具下载,md5校验工具下载
  11. Flume+Kafka整合案例实现
  12. Word文档快速插入分割线(虚线、实线、波浪线)
  13. 分位数回归 Quantile Regression,python 代码
  14. 【已完美解决】由于找不到MSVCR100.dll,无法继续执行代码。重新安装程序可能会解决此问题。DirectX修复工具下载
  15. VMware虚拟机安装Windows11(无需设置TMP密码)
  16. 删除域控中的一个服务器,删除 Active Directory 域服务
  17. 民族列表JSON(可直接复制)
  18. 5种网络隔离后的文件交换方式,哪种最安全便捷?
  19. Linux:如何调整ubuntu的系统界面使其放大
  20. 作为程序员,赚取额外收入的 4个简单副业!

热门文章

  1. 易康中如何提取特征并进行重要性排序
  2. exe文件在服务器上打不开,EXE格式文件打不开怎么办?三个方法教你打开
  3. 从零开始研发GPS接收机连载——10、位同步和帧同步
  4. 2021-07-14 深度学习基础与实践(二)
  5. HTML页面之间传递Json格式数组的方式
  6. bss段,data段、text段、堆heap和栈stack
  7. TAThermalSystem-车辆热管理系统库(一)
  8. .ipynb如何转为.py
  9. Mac 上 VMware 安装 win7 虚拟机如何添加磁盘
  10. 【IEEE754制32位浮点数】与十进制相互转换