《汇编语言》第3版 (王爽)第10章检测点解析

第10章 检测点


检测点10.1:补全程序,实现从内存1000:0000处开始执行指令。
解析: 我们知道retf指令是用栈中的数据,同时修改CS和IP寄存器中的内容,实现远转移,而且是先出栈的数据放入IP中,后出栈的数据放入CS中,所以既然要从1000:0000处开始执行指令,则只需要将1000先入栈,再将0000入栈,那么出栈时就会先将0000出栈放入IP中,再将1000出栈放入CS中。

assume cs:code

stack segment
	db 16 dup(0)
stack ends

code segment
      start:mov ax,stack
            mov ss,ax
	    mov sp,16
	    mov ax,1000H ;先将1000H入栈
	    push ax
	    mov ax,0     ;再将0000H入栈
	    push ax
	    retf
code ends
end start

将上述程序在DOS中运行后,效果如下:
执行RETF前,CS:IP = 076B:0010,执行RETF后,CS:IP = 1000:0000。
在这里插入图片描述
检测点10.2: 下面的程序执行后,AX中的数值为多少?
在这里插入图片描述
解析: 我们知道call指令会将当前的IP压栈后,转到标号出执行指令,但是需要注意的是压栈的是call指令的下一条指令的IP,所以上面程序执行后,AX中的数据为6。

检测点10.3: 下面的程序执行后,ax中的数值为多少?
在这里插入图片描述
解析: 我们知道call far ptr指令实现的是段间转移,会将CS中的段地址和IP中的偏移地址依次入栈,所以上面程序执行完call指令后,会先将段地址1000入栈,再将偏移地址8入栈(注意是下一条指令的地址),然后跳转到s执行,根据栈"先入后出"的原则,执行完pop ax后会先将8取出放入AX中,然后执行add ax,ax后,AX = 8+8 = 16(10H),再将1000H出栈放入BX中,执行完add ax,bx后,AX = 1000H + 10H = 1010H,所以执行后,AX中的数值为1010H

检测点10.4: 下面的程序执行后,ax中的数值为多少?
在这里插入图片描述
解析: 首先将6放入AX中,此时AX = 6,然后将IP中的偏移地址入栈(5入栈)再跳转到偏移地址为6的地址执行mov bp,sp ,将SP中的内容放入bp中,最后执行add ax,[bp],而段地址默认在SS中,即此时相当于 AX = AX + ((ss)*16+(sp)) = 6 + 5 = 11 = BH

检测点10.5: (1)下面的程序执行后,ax中的数值为多少?(注意:用call指令的原理来分析,不要在Debug中单步跟踪来验证你的结论。对于此程序,在Debug中单步跟踪的结果,不能代表CPU的实际执行结果。)

assume cs:code
stack segment
	dw 8 dup(0)
stack ends
code segment
	start:mov ax,stack  ;将栈的段地址放入AX中
		  mov ss,ax     ;将AX中的内容放入SS中
		  mov sp,16     ;设置栈顶指针
		  mov ds,ax     ;将AX中的内容放入DS中,到此AX中的内容并未改变,所以还是栈的段地址
		  mov ax,0      ;此时AX中为0
		  call word ptr ds:[0EH]   ;先将下一跳指令的IP入栈,然后跳转到ds:[0EH]内存单元中的地址,由于DS也指向栈段,并且刚刚将IP入栈了,所以此时还是跳转到下一跳指令
		  inc ax        
		  inc ax
		  inc ax        ;执行完后AX = 3
		  mov ax,4c00h
		  int 21h
code ends
end start

(2)下面的程序执行后,ax和bx中的数值为多少?

assume cs:code
data segment
	dw 8 dup(0)
data ends
code segment
	start:mov ax,data  ;将数据段的段地址放入AX中
	      mov ss,ax    ;将AX中的内容放入SS中
	      mov sp,16    ;设置栈顶指针
	      mov word ptr ss:[0],offset s   ;将s处的偏移地址放如ss:[0]处
	      mov ss:[2],cs ;将当前CS中的内容放入ss:[2]中
	      call dword ptr ss:[0]   ;将下一条指令的CS:IP压栈,然后跳转到以ss:[0]内存单元中数据为地址的地方,即s处
	      nop
	    s:mov ax,offset s    ;将s的偏移地址放入AX中
	      sub ax,ss:[0cH]    ;由于ss:[0cH]中存放的刚刚入栈的IP即nop指令的IP,而AX中存放的又是s处的IP,二者相差1(nop占一个字节),所以相减后,AX = 1
	      mov bx,cs          ;将CS中的内容放入BX中
	      sub bx,ss:[0eH]    ;由于ss:[0eH]中存放的是刚刚入栈的CS,所以相减为0 BX = 0
	      
	      mov ax,4c00h
	      int 21h
code ends
end start

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析-Pandas两种分组箱线图比较

数据分析-Pandas两种分组箱线图比较 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&am…

Yolov7-tiny如何指定某个权重继续断点训练,并且训练到指定轮数

文章目录 前情提要步骤1. 拷贝整个运行train.py之后生成的文件(然后删掉weights文件夹)2. 删掉新路径下的weights里的所有权重,然后挑选一个权重放进去3. 修改新路径下的opt.yaml4. 指定新路径下的weights重的权重的绝对路径,开始…

Modified Bessel Function of the First Kind

Abstract 最近接触到 von Mises–Fisher distribution, 其概率密度如下: f p ( x ; μ , κ ) κ p 2 − 1 ( 2 π ) p 2 I p 2 − 1 ( κ ) e κ μ ⊺ x \begin{aligned} f_{p}(\bm{x}; \bm{\mu}, \kappa) \frac{\kappa^{\frac{p}{2}-1}} {(2\pi)^{\frac{p}{2}} I_{\frac…

2.5K Star,打造个性化博客平台

2.5K Star,打造个性化博客平台 Hi,骚年,我是大 G,公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 导语 在当今的信息时代&a…

Interceptor拦截器+JWT令牌实现登陆验证

一、背景 与过滤器的作用类似,不过拦截器是spring中的组件,只能拦截进入spring的请求;过滤器则可以拦截所有从前端页面发送来的请求。 *拦截器和过滤器选一就可以实现登陆验证,过滤器的实现在以下这篇博客中,有需要可…

设置Matlab2022a断点查看参数变化

Matlab2022a设置断点,查看参数变化 本文使用的是下载好的matlab2022a软件,下载加安装matlab预计1小时(百度网盘加速)。需要的安装包的评论。 安装好的matlab界面如下: 接下来,编辑一个.m文件,…

【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子,谨以此作为笔记参考 目录 1.背景2. 寻找方案3. 如何解决4.解决步骤4.1 DockerFile4.2 现在要做的 5. 镜像相关命令 1.背景 部署(迁移)项目时发现,项目的excel导出功能报错,错误如下…

灵根孕育源流出,心性修持大道生

解法&#xff1a; 手动本地跑了一下1e9&#xff0c;显然超时。 然后预处理发现开不了这么大的数组。 肯定有规律&#xff0c;打表看看 代码如下 #include<iostream> #include<vector> #include<algorithm> #include<cmath> using namespace std; #…

3.7作业

一 1&#xff09;应用层 负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确 应用层提供的协议&#xff1a; &#xff08;2&#xff09;表示层 负责网络中通信的数据的编码和格式&#xff0c;确保通信过程中…

喜讯|智安网络与OceanBase完成产品兼容性互认证

近日&#xff0c;深圳市智安网络有限公司旗下产品智安云综合防御平台V3.0与北京奥星贝斯科技有限公司的OceanBase数据库正式完成兼容性互认证。经双方联合测试&#xff0c;结果表明&#xff1a;OceanBase数据库软件V4与智安云综合防御平台V3.0完全兼容&#xff0c;在功能、性能…

用户角色的重要性:确保财务数据安全的最佳方式

在企业的财务管理业务中&#xff0c;一个人几乎不可能完成所有的财务记账任务&#xff0c;例如设定预算、发票审批等等&#xff0c;至少不能有效地执行。最为明智的方式&#xff0c;是将这些任务分派给特定的人员&#xff0c;比如部门经理、财务经理或者销售、市场人员等等。 但…

Sora: 大型视觉模型背景、技术、局限性和机遇的综述

论文链接&#xff1a;https://arxiv.org/pdf/2402.17177.pdf 背景 在分析 Sora 之前&#xff0c;研究者首先盘点了视觉内容生成技术的沿袭。 在深度学习革命之前&#xff0c;传统的图像生成技术依赖于基于手工创建特征的纹理合成和纹理映射等方法。这些方法在生成复杂而生动…

Xilinx 7系列 FPGA硬件知识系列(八)——Xilinx FPGA的复位

目录 概要 Xilinx复位准则 全局复位主要由以下三种方式实现 高时钟频率下的复位时序全局复位对时序的要求真的很关键吗&#xff1f; 独热码状态机的复位 FPGA配置 概要 Xilinx白皮书WP272《Get Smart About Reset: Think Local, Not Global》详细讲述了FPGA的全…

IDEA中新增文件,弹出框提示是否添加到Git点错了,怎么重新设置?

打开一个配置了Git的项目&#xff0c;新增一个文件&#xff0c;会弹出下面这个框。提示是否将新增的文件交给Git管理。 一般来说&#xff0c;会选择ADD&#xff0c;并勾选Dont ask agin&#xff0c;添加并不再询问。如果不小心点错了&#xff0c;可在IDEA中重新设置&#xff08…

蓝桥杯嵌入式模板构建——RCT时钟

在CubeMX里的RTC模块启用RTC时钟和日历功能 输入到RTC的时钟要配置成1HZ,这样的话RTC每经过1s走时一次 由于RTC时钟默认配置为32Khz 所以我们需要将异步分频值与同步分频值的乘积调整为32K分频即可一秒走时一次 频率&#xff1a;32000hz / 32000hz 1hz 必须是31和999&#…

Processing基本形状内容和实例

一、Processing的基本形状内容和实例 1.Processing有一组专门绘制基本图形得图案。像线条这样的基本图形可以被连接起来创建更为复杂得形状&#xff0c;例如一片叶子或者一张脸。 2.为了绘制一条直线&#xff0c;我们需要四个参数&#xff0c;两个用于确定初始位置&#xff0c;…

一文读懂HDMI的演变-从HDMI1.0到HDMI2.1(建议收藏)

HDMI&#xff0c;全称为&#xff08;High Definition Multimedia Interface&#xff09;高清多媒体接口&#xff0c;主要用于传输高清音视频信号。 HDMI System HDMI系统包括HDMI的source和HDMI的sink, 其中source 是源端&#xff0c;即信号的来源&#xff1b;Sink的接收端&a…

Android车载开发之AAOS快速入门

一、概述 在正式介绍Android Automotive OS之前,我们先弄清两个概念:Android Auto和Android Automotive OS。 Android Auto Android Auto 不是操作系统,而是一个应用或一个服务。当 Android 手机通过无线或有线方式连接到汽车时,Android 系统会将使用 Android Auto 服务…

python并发编程:阻塞IO

阻塞IO&#xff08;blocking IO&#xff09; 在Linux中&#xff0c;默认情况下所有的socket都是blocking&#xff0c;一个典型的读操作流程大概是这样&#xff1a; 当用户进程调用了recvfrom这个系统调用&#xff0c;kernel就开始了IO的第一个阶段&#xff1a;准备数据。对于…

力扣513 找树左下角的值 Java版本

文章目录 题目描述解题思路代码 题目描述 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 提示: 二…