《汇编语言》- 读书笔记 - 第10章-CALL 和 RET 指令

《汇编语言》- 读书笔记 - 第10章-CALL 和 RET 指令

  • 10.1 ret 和 retf
    • 检测点 10.1
  • 10.2 call 指令
  • 10.3 依据位移进行转移的 call 指令
    • 检测点 10.2
  • 10.4 转移的目的地址在指令中的 call 指令
    • 检测点 10.3
  • 10.5 转移地址在寄存器中的 call 指令
  • 10.6 转移地址在内存中的 call 指令
    • 检测点 10.5
  • 10.7 call 和 ret 的配合使用
    • 问题 10.1
  • 10.8 mul 指令
    • 例1. 计算 100*10
    • 例2. 计算 100*10000
  • 10.9 模块化程序设计
  • 10.10 参数和结果传递的问题
  • 10.11 批量数据的传递
  • 10.12 寄存器冲突的问题
    • 问题举例:
    • 解决思路:
    • 子程序的标准框架
      • 改进后的子程序 capital
  • 实验 10 编写子程序

callret 指令都是转移指令,都有修改 IPCS:IP两个版本。
callret 指令共同支撑了汇编语言中的 模块化设计实现。
call 指令用于 调用子程序,它将 返回地址压入 堆栈并跳转至 子程序入口地址。
ret 指令在 子程序执行 完毕后从 堆栈中弹出 返回地址,并跳转回 主程序调用点继续执行。

10.1 ret 和 retf

指令修改CS修改IP行为用途
ret
(Return from Procedure)
POP IP:将栈顶的值弹出,并送进IP从子程序返回。
retf
(Return from Procedure Far)
POP IP将栈顶的值弹出,送进IP
POP CS将从栈中弹出一个值,送进CS
从远过程(far subroutine)返回

检测点 10.1

《汇编语言》- 读书笔记 - 各章检测点归档 - 检测点 10.1

10.2 call 指令

CPU 执行 call 指令时,进行两步操作:

  1. 将当前的 IPCSIP 压入栈中;
  2. 转移。(与 jmp 唯一的不同在于没有短转移 : jmp short 标号 )
命令说明修改的
寄存器
例子(假设有标号叫 label
call 标号位移跳转,实现段内转移。位移范围在:-32768 ~ 32767
将当前IP压栈后,转到标号处执行指令。相当于:
1. push IP
2.jmp near ptr 标号
IPcall label
call far ptr 标号目标地址,实现段间转移。相当于:
1. push CS
2. push IP
3.jmp far ptr 标号
CS:IPcall far ptr label
call 16位寄存器转移地址在寄存器中,相当于:
1. push IP
2.jmp 16位寄存器
IPcall ax
call word ptr [内存]转移地址在内存中,实现段内转移。相当于:
1. push IP
2.jmp word ptr 内存单元地址
IPcall word ptr ds:[0]
call dword ptr [内存]转移地址在内存中,实现段间转移。相当于:
1. push CS
2. push IP
3.jmp dword ptr 内存单元地址
IPcall dword ptr ds:[0]

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

检测点 10.2

《汇编语言》- 读书笔记 - 各章检测点归档 - 检测点 10.2

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

检测点 10.3

《汇编语言》- 读书笔记 - 各章检测点归档 - 检测点 10.3

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

## 检测点 10.4
《汇编语言》- 读书笔记 - 各章检测点归档 - 检测点 10.4

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

检测点 10.5

《汇编语言》- 读书笔记 - 各章检测点归档 - 检测点 10.5

10.7 call 和 ret 的配合使用

问题 10.1

下面程序返回前,bx 中的值是多少?

assume cs:code 
code segment
start:	mov ax,1mov cx,3call smov bx,ax		;(bx)=?mov ax,4c00hint 21h
s:		add ax,axloop sret
code ends
end start
  1. call s 会将当前 IP 存入栈中,跳到 s 处执行。
  2. s 标号这里是一个 loop 循环 cx 初始为 3 所以会循环 3 次。
    2.1. 第一次 add ax, ax, ax = 1+1 = 2;
    2.2. 第二次 add ax, ax, ax = 2+2 = 4;
    2.3. 第三次 add ax, ax, ax = 4+4 = 8;
  3. loop 循环结束后 ret 返回 call s 处,继续执行它下面的指令。此时 ax = 8
    sret这段实现的是计算2n 次方,ncx 提供。
  4. 所以 mov bx, ax 的结果是 bx = 8
  5. 下一句 mov ax,4c00h 退出程序,最终程序返回前 bx 中的值是 8

通过对问题 10.1的探讨,引出:利用 callret 来实现子程序的机制。
子程序的框架如下:

标号:指令ret

具有子程序的源程序的框架如下:
在这里插入图片描述

10.8 mul 指令

mul 是乘法指令。两个相乘的数,要么都是8位,要么都是 16 位

  1. 乘数:可以是816位。
    1.1. 但两个乘数必须都是 8位,或都是16位。(不能一8位,一个16位)
    1.2. 如果是8位乘法:一个乘数默认在 AL 中,另一个在8位寄存器内存【字节】单元中。
    1.3. 如果是16位乘法:一个乘数默认在 AX 中,另一个在16位寄存器内存【字】单元中。

  2. 结果
    2.1. 8位乘法:结果在AX
    2.2. 16位乘法:结果高16位DX低16位AX

乘法位数乘数A乘数B结果例子
8位乘法ALah | bl | bh | cl
| ch | dl | dh | [字节单元]
AXmul bl
mul byte ptr ds:[0]
16位乘法AXbx | cx | dx | [字单元]DX AXmul bx
mul word ptr [bx+si+8]

例1. 计算 100*10

assume cs:code 
code segment
start:	mov al,100mov bl,10mul bl
code ends
end start

在这里插入图片描述

parseInt('03E8', 16); // 1000

例2. 计算 100*10000

assume cs:code 
code segment
start:	mov ax,100mov bx,10000mul bx
code ends
end start

在这里插入图片描述

parseInt('F4240', 16); // 1000_000

10.9 模块化程序设计

  1. 模块化设计在汇编语言中至关重要,通过拆解复杂问题为相互关联的子问题
  2. callret 指令支持模块化编程,分别用于调用返回子程序。
  3. 子程序利用这两指令实现功能独立逻辑分离,便于解决复杂问题。

总之,callret 提供了实现子程序的基础,以解决复杂的编程问题。什么提高代码可读性、可维护性和复用性,布啦布啦布啦。。。

10.10 参数和结果传递的问题

  1. 在设计函数经常要考虑的就是怎么传参、怎么返回值。
    1.2. 优先使用寄存器,比较方便。寄存器不够用,就使用内存。
  2. 注释要写清楚。起码以后自己要能看懂(不要高估和曾经那个自己之间的默契)

编程,计算 data 段中第一组数据的3次方,结果保存在后面一组 dword 单元中。

assume cs:code 
data segmentdw 1,2,3,4,5,6,7,8dd 0,0,0,0,0,0,0,0
data endscode segment
start:	mov ax,data		; 设置数据段mov ds,axmov si,0		;ds:si 指向第一组 word 单元mov di,16		;ds:di 指向第二组 dword 单元mov cx,8		; 设置循环次数 8s:	mov bx,[si]		; 主程序,读取数据到 bx ("用 bx 传参")call cubemov [di],ax		; 先存低16"主程序拿到子程序放在 ax 中的返回值"mov [di].2,dx	; 再存高16"主程序拿到子程序放在 dx 中的返回值"add si,2		;ds:si 指向下一个 word 单元add di,4		;ds:di 指向下一个 dword 单元loop smov ax,4c00hint 21h; cube 子程序:计算 n 的 3 次方cube:	mov ax,bx		; 子程序从("bx 读取传参")mul bxmul bxret				; 子程序返回 "(返回值)""ax,dx" 中
code ends
end start

在这里插入图片描述

计算 3 次方的数12345678
内存中结果
低位在前,高位在后
(高16位都是0忽略)
01 0008 001B 0040 007D 00D8 0057 0100 02
调整一下顺序00010008001B0040007D00D8015702 00
转成10进制182764125216343512

10.11 批量数据的传递

数据大了就需要用内存传参返回了。
寄存器用来传递内存地址。

assume cs:code 
data segmentdb 'conversation'
data endscode segment
start:	mov ax,data		; 设置数据段mov ds,axmov si,0		; ds:si 指向字符串(批量数据)所在空间的首地址mov cx,12		; cx存放字符串的长度call capital	; 调用子程序mov ax,4c00hint 21h; 子程序:转大写
capital:and byte ptr [si],11011111b ; 转为大写字符inc siloop capital				; 循环处理字符ret
code ends
end start

在这里插入图片描述

10.12 寄存器冲突的问题

本节用一个子程序 举例,在主程序子程序使用了同样的寄存器,那么将产生冲突。

问题举例:

  1. 首先:主程序在 CX 中保存了循环次数。
  2. 然后:子程序中的循环计数也用到了CX
  3. 结果:当从子程序返回主程序时,主程序的循环计数已经丢失。程序无法按预期执行。

解决思路:

  1. 子程序具体业务代码开始前,把会用到的寄存器保存到中。
  2. 子程序返回前出栈还原寄存器
  3. 注意入栈出栈时的顺序。(后入的先出)

子程序的标准框架

最终得出编写子程序的标准框架如下:

子程序开始:	子程序中使用的寄存器入栈子程序内容子程序中使用的寄存器出栈返回(ret、retf)

改进后的子程序 capital

capital:push cxpush sichange:mov cl,[si]mov ch,0jcxz okand byte ptr [si],11011111binc sijmp short changeok:pop sipop cxret

关于大小写的相关知识,详见:第7章 7.4 大小写转换的问题

实验 10 编写子程序

《汇编语言》- 读书笔记 - 实验 10 编写子程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据模型概念

一、概念 (1) 定义 在数据库系统中针对不同的使用对象和应用目的,采用不同的数据模型。根据模型的应用的不同目的,可以将这些模型划分为两类: (2) 分类 A:概念数据模型 它也称信息模型它是按用户的观点(观念世界&…

JVM(2)实战篇

1 内存调优 1.1 内存溢出和内存泄漏 内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。 内存泄漏绝…

单调队列和优先队列

本篇记录下一下关于单调队列和优先队列(堆)的方法以及解题思路. 文章目录 一. 单调队列1. 绝对差不超过限制得最长连续子数组2. 跳跃游戏 VI3. 设计自助结算系统4. 和至少为k的最短子数组5. 满足不等式的最大值 二. 优先队列1. 最后一块石头的重量2. 数据…

十二:枚举与注解

文章目录 01、枚举类的使用1.1、枚举类的理解1.2、自定义枚举类1.3、使用enum关键字定义枚举类1.4、Enum类中的常用方法1.5、使用enum关键字定义的枚举类实现接口 02、注解的使用2.1、注解的理解2.3、如何自定义注解2.4、jdk中4个基本的元注解的使用12.5、jdk中4个基本的元注解…

uniapp 适配鸿蒙next调研

1.官方的一些回答 DCloud有资源第一时间得到鸿蒙无apk手机的上市计划。我们和华为保持着紧密沟通,会把握好节奏,不用担心。大家可以观察一个信号,等微信的鸿蒙next版敲定了,鸿蒙无apk手机就可以明确上市计划了。鸿蒙的开发语言是a…

数据结构:动态内存分配+内存分区+宏+结构体

一、作业 1.定义一个学生结构体&#xff0c;包含结构体成员&#xff1a;身高&#xff0c;姓名&#xff0c;成绩&#xff1b;定义一个结构体数组有7个成员&#xff0c;要求终端输入结构体成员的值&#xff0c;根据学生成绩&#xff0c;进行冒泡排序。 #include <stdio.h>…

UE蓝图 Cast节点和源码

系列文章目录 UE蓝图 Cast节点和源码 文章目录 系列文章目录Cast节点功能一、Cast节点用法二、Cast节点使用场景三、Cast节点实现步骤四、Cast节点源码 Cast节点功能 在Unreal Engine&#xff08;UE&#xff09;中&#xff0c;Cast节点是一种蓝图系统中的节点&#xff0c;用于…

【性能测试入门必看】性能测试理论知识

一、性能测试理论知识 1、常用的七种性能测试方法 (1) 后端性能测试&#xff1a;其实&#xff0c;你平时听到的性能测试&#xff0c;大多数情况下指的是后端性能测试&#xff0c;也就是服务器端性能测试。后端性能测试&#xff0c;是通过性能测试工具模拟大量的并发用户请求&…

linux系统Grafana关联zabbix显示

Grafana关联zabbix 服务器下载浏览器配置开启zabbix插件配置zabbix数据源可视化Zabbix数据 服务器下载 grafana-cli plugins list-remote grafana-cli plugins list-remote|grep -i zabbix grafana-cli plugins install alexanderzobnin-zabbix-appsystemctl restart grafana-…

HBase 进阶

参考来源: B站尚硅谷HBase2.x 目录 Master 架构RegionServer 架构写流程MemStore Flush读流程HFile 结构读流程合并读取数据优化 StoreFile CompactionRegion Split预分区&#xff08;自定义分区&#xff09;系统拆分 Master 架构 Master详细架构 1&#xff09;Meta 表格介…

Vue | (一)Vue核心(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;Vue简介&#x1f4da;初识Vue&#x1f4da;模板语法&#x1f4da;数据绑定&#x1f4da;MVVM模型&#x1f4da;数据代理&#x1f407;回顾Object.defineproperty方法&#x1f407;何为数据代理&#x1f407;Vue中的数据代理 &#x1f4da;事件处理&#…

基于java的眼镜店仓库管理系统

源码获取&#xff0c;加V&#xff1a;qq2056908377 摘要&#xff1a; 随着电子商务的兴起&#xff0c;越来越多的商家选择在线销售他们的产品。眼镜店作为零售业的一种&#xff0c;也不例外。随着市场需求的不断增加&#xff0c;眼镜店需要更加高效的管理他们的仓库和库存&…

Mysql 权限与安全管理

0 引言 MySQL是一个多用户数据库&#xff0c;具有功能强大的访问控制系统&#xff0c;可以为不同用户指定允许的权限。MySQL用户可以分为普通用户和root用户。root用户是超级管理员&#xff0c;拥有所有权限&#xff0c;包括创建用户、删除用户和修改用户的密码等管理权限&…

LeetCode21.合并两个有序链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 &#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 思路 创建一个新的链表头节点&#xff08;dummyNode&#xff09;和一个…

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?< , (? , (?<! , (?! 有好多种称呼 (?< , (? , (?<! , (?! 有好多种称呼 , 我称为: 左限定, 右限定, 左否定, 右否定 (?<左限定)    (?右限定)(?<!左否定)    (?!右限定) 再…

阿里云个人建站笔记

导航 一、购买ECS服务器二、配置mysql&#xff08;一&#xff09;安装Mysql步骤一&#xff1a;安装mysql步骤二&#xff1a;配置MySQL步骤三&#xff1a;远程访问MySQL数据库 &#xff08;二&#xff09;给实例配置安全组策略&#xff08;三&#xff09;设置防火墙 一、购买ECS…

.ma1x0勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者&#xff1a; 数据安全问题备受关注。而勒索病毒是其中一种最为恶劣的威胁之一。其中&#xff0c;.ma1x0勒索病毒备受人们担忧&#xff0c;因其可将用户的数据文件加密&#xff0c;并要求支付赎金以解密文件。本文将介绍.ma1x0勒索病毒的特征、预防方法以及如何恢复…

transformer-Attention is All You Need(二)

transformer中的解码器 解码器层 每个解码器层根据给定的输入向目标方向进行特征提取&#xff0c;即完成解码过程 transformer的解码器也是一个自回归模型&#xff0c;根据编码器的结果以及上一次预测的结果&#xff0c;对下一次可能出现的值进行特征表示。它也是由N层完全相同…

循环队列|超详细|数据结构学习讲解与笔记

队列元素先进先出队列只允许在线性表的一端进行操作&#xff0c;是一种操作受限的线性表 队列的基本操作 InItQueue(&Q)初始化队列&#xff0c;构造一个空队列 QEmptyQueue(Q)队列判空FullQueue(Q)队列判满EnQueue(&Q , x)入队操作DeQueue(&Q , &x)出队操作G…

OpenAI新爆款Sora,大佬们怎么看?

OpenAI新爆款Sora的热度持续发酵&#xff0c;在科技圈的刷屏阵仗都快赶上正月初五迎财神了。 智东西2月17日报道&#xff0c;这两天&#xff0c;OpenAI首款文生视频大模型Sora以黑马之姿占据AI领域话题中心&#xff0c;马斯克、杨立昆、贾扬清、Jim Fan、谢赛宁、周鸿祎、李志…