王爽老师汇编语言第四版第十章CALL和RET指令——小白笔记
目录
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.首先是编译问题 2.显示缓存区每一行是80个字符也就是160个字节 3.当数据想要写到第二行时 这时si已经向后走了16个位移了所以不能直接+160 应该+160-32 4.视频中教程用一 ...
- 王爽老师汇编第三版课程设计 一
该课程设计是在屏幕输出公司21年的详细信息,包括年份.当年总收入.当年人数.当年的人均收入(这个需要运用除法运算). 显示总收入需要解决除法溢出的问题,改进除法运算,见课本王老师的附录讲解 ...
- 王爽老师汇编语言监测点1.1
自学汇编交流学习,自己理解的不一定完全正确 1.1个cpu的寻址能力为8kb,那么它的地址总线宽度为(13) 总线宽度 计算 ...
- 王爽老师汇编语言实验7
目录 1.首先观察数据 定义了三个类型的数据分别是: 2.验证数据 3.将数据和寄存器绑定 前边几行代码是用来将寄存器和段地址关联起来的 4.下面我们来一个一个解决问题 (1)先把年份放到对应位置 法 ...
- 王爽《汇编语言第三版》实验10-1代码实现
;编写一个通用的子程序实现这个显示字符串的功能,提供灵活的调用接口,使调用者 ;可以决定显示的位置,内容,颜色 assume cs:code,ss:stack,ds:data data segment ...
- C语言中main函数的研究,以及对代码断点调试的研究(王爽老师 汇编语言)
版权声明:本文为博主原创文章,未经博主允许不得转载. 我们知道作为一个语言本身是不会有诸如从main函数开始运行这样的条件(深层次的说 底层汇编代码不会指定从mian函数开始的这样的条件,程序开始的位 ...
- 自学王爽老师汇编语言 检测点6.1
自学汇编,讨论学习,不对之处请指出共同学习,不喜勿喷 1,下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序: assume cs:codecode segmentdw 0 ...
- 《汇编语言》王爽(第四版) 第十章 实验10
文章目录 前言 一.子程序1 显示字符串 1.实验任务 2.分析 (1)如何在指定位置显示 (2)如何显示指定颜色 (3)保存子程序中用到的寄存器 3.代码 二.子程序2 解决除法溢出的问题 1.实验 ...
- 汇编语言 (第2版) 王爽 中文高清PDF版下载
汇编语言 (第2版) 王爽 中文高清PDF版下载 转载于:https://www.cnblogs.com/gavinhughhu/archive/2009/12/10/1620783.html
最新文章
- initBuilder注解接收多个对象
- JavaScript数组方法大全解
- UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)
- ICLR 2022 | 香侬科技提出基于图神经网络的语义理解模型,获单项满分
- gis怎么改鼠标滚轮缩放_PhotoShop缩放画面的快捷方式
- 【POJ - 1651】Multiplication Puzzle(区间dp)
- [NLP]基于IMDB影评情感分析之BERT实战-测试集上92.24%
- java 2分代复制垃圾回收_Java垃圾回收机制
- P5018 对称二叉树
- android md5加密工具下载,md5校验工具下载
- Flume+Kafka整合案例实现
- Word文档快速插入分割线(虚线、实线、波浪线)
- 分位数回归 Quantile Regression,python 代码
- 【已完美解决】由于找不到MSVCR100.dll,无法继续执行代码。重新安装程序可能会解决此问题。DirectX修复工具下载
- VMware虚拟机安装Windows11(无需设置TMP密码)
- 删除域控中的一个服务器,删除 Active Directory 域服务
- 民族列表JSON(可直接复制)
- 5种网络隔离后的文件交换方式,哪种最安全便捷?
- Linux:如何调整ubuntu的系统界面使其放大
- 作为程序员,赚取额外收入的 4个简单副业!