《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序

news2024/11/24 2:48:34

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序

  • 题目1
  • 题目2
  • 题目3
  • 题目4
  • 题目5
  • 题目6
  • 总结

题目1

将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题

assume cs:code, ds:data, ss:stack
data segment
	dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h	;16字节
data ends

stack segment
	dw 1,2,3,4,5,6,7,8									;16字节
stack ends

code segment
		
start:	mov ax, stack	; 获取栈段
		mov ss, ax		; 设置栈段
		mov sp, 16		; 设置栈顶 ss:sp
		
		mov ax, data
		mov ds, ax		; ds 指向 data 段
		
		push ds:[0]
		push ds:[2]
		pop ds:[2]
		pop ds:[0]
				
		mov ax, 4c00h		
		int 21h
code ends
end start
  1. CPU 执行程序,程序返回前,data 段中的数据为多少?
    答:数据没变。先入后出,保持了顺序。
  2. CPU 执行程序,程序返回前,cs= 076E 、ss= 076D 、ds= 076C
  3. 设程序加载后,code 段的段地址为 X,则 data 段的段地址为= X-2 ,stack 段的段地址为 X-1

在这里插入图片描述 在这里插入图片描述

题目2

将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题

assume cs:code, ds:data, ss:stack
data segment
	dw 0123h,0456h
data ends

stack segment
	dw 1,2
stack ends

code segment
		
start:	mov ax, stack	; 获取栈段
		mov ss, ax		; 设置栈段
		mov sp, 16		; 设置栈顶 ss:sp
		
		mov ax, data
		mov ds, ax		; ds 指向 data 段
		
		push ds:[0]
		push ds:[2]
		pop ds:[2]
		pop ds:[0]
				
		mov ax, 4c00h		
		int 21h
code ends
end start
  1. CPU 执行程序,程序返回前,data 段中的数据为多少?
    答:数据没变。先入后出,保持了顺序。
  2. CPU 执行程序,程序返回前,cs= 076E 、ss= 076D 、ds= 076C
  3. 设程序加载后,code 段的段地址为 X,则 data 段的段地址为= X-2 ,stack 段的段地址为 X-1

在这里插入图片描述

  1. 对于如下定义的段:如果段中的数据占N 个字节,则程序加载后,该段实际占有的空间为 n % 16 ? n + (16 - n % 16) : n 字节。
    到网上看到别人的公式 ( N/16+1) * 16,但当正好是16的倍数时,这个公式显示与观察到的效果不符。
name segment
...
name ends

观察程序加载后CX=0042题目1中相同,可知虽然只声明了4个字节,但是系统还是按16字节分配了内存。
可以看到数据段栈段都是16字节代码段076C:0020开始。
看下通过观察推测的结果:

[...Array(9527).keys()].map(n => `${n} = ${n % 16 ? n + (16 - n % 16) : n}`)

在这里插入图片描述

题目3

将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题
在这里插入图片描述

  1. CPU 执行程序,程序返回前,data 段中的数据为多少?
    答:数据没变。先入后出,保持了顺序。
  2. CPU 执行程序,程序返回前,cs= 076C 、ss= 0770 、ds= 076F
  3. 设程序加载后,code 段的段地址为 X,则 data 段的段地址为= X+3 ,stack 段的段地址为 X+4

题目4

如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
答: 题目3的代码可以正常执行,因为代码段正好在程序开头。CS:IP指向第一行指令。

题目5

程序如下,编写 code 段中的代码,将 a段和 b 段中的数据依次相加,将结果存到c段中。

assume cs:code

a segment
	db 1, 2, 3, 4, 5, 6, 7, 8	;16字节
a ends

b segment
	db 1, 2, 3, 4, 5, 6, 7, 8	;16字节
b ends

d segment
	db 0, 0, 0, 0, 0, 0, 0, 0	;16字节
d ends

code segment
start:	mov ax, a
		mov ds, ax
		
		mov bx, 0				; i = 0
		mov cx, 8				; len = 8
	s:	mov al, ds:[bx]
		add al, ds:[bx+16]		; 寄存器不够用,用偏移量来定位
		mov ds:[bx+16+16], al	; 寄存器不够用,用偏移量来定位		
		inc bx					; i++
		loop s					; i < len 循环
				
		mov ax, 4c00h		
		int 21h
code ends
end start

在这里插入图片描述

  1. c segment 编译不过,我就换成了d
  2. 程序加载后可以看到 CS:IP 指向 076F:0
  3. [bx+16+16] 这种写法在第7章中会详细介绍。

题目6

程序如下,编写 code 段中的代码,用 push 指令将 a 段中的前 8 个字型数据,逆序存储到 b 段中。

assume cs:code

a segment												; CS-3
	dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh	;32字节
a ends

b segment												; CS-1
	dw 0,0,0,0,0,0,0,0									;16字节
b ends

code segment
start:	mov ax, a
		mov ds, ax
		mov ax, b
		mov ss, ax
		mov sp, 10h
		
		; 下面实现循环处理
		mov bx, 0			; i = 0
		mov cx, 8			; len = 8
	s:	push [bx]			; a 中取出第一个,放到 b末尾。压栈是从底往上走的
		add bx, 2			; i = i+2 字类型占两字节
		loop s				; i < len 循环
				
		mov ax, 4c00h		
		int 21h
code ends
end start

在这里插入图片描述

总结

  1. 系统分配内存16字节起步。
  2. 定义段,即可声明内容空间。一回事。
  3. 知道段的定义顺序,又知道它们的大小,可以能过偏移量算出各段的位置。

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

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

相关文章

github添加ssh-key来支持git项目管理

背景 https://github.com很多时候无法克隆/更新/提交项目&#xff0c;使用gitgithub.com怎没有限制 配置git账户邮箱和用户名 查看配置信息 git config --global --list 配置或者修改用户名&#xff0c;替换为自己github用户名 git config --global user.name "holyl…

【什么是苹果IM推?什么是苹果推?】iMessage推送操纵Apple Push Notification service (APNs)

以帮忙你明白实现iMessage推送的基本原理和步调&#xff1a; 开辟者账户&#xff1a;确保你具有苹果开发者账户&#xff0c;以便访谒苹果开发者中间和相干东西。 APNs认证&#xff1a;iMessage推送操纵Apple Push Notification service (APNs)来发送关照。在苹果开发者中心&a…

Spring支持哪些Aware接口?

Spring支持哪些Aware接口? Spring支持哪些Aware接口?Aware接口的优点ApplicationContextAware和BeanFactoryAware的区别 Spring支持哪些Aware接口? ApplicationContextAware:获取ApplicationContext对象BeanFactoryAware:获取BeanFactory对象BeanNameAware:获取Bean的名称E…

Fiddler抓取HTTPS最“全”攻略,让你成为网络调试大师!

对于想抓取HTTPS的测试初学者来说&#xff0c;常用的工具就是fiddler。 在使用Fiddler进行HTTPS抓包时&#xff0c;很多人都会遇到各种各样的问题和困难。 初学时&#xff0c;大家对于fiddler如何抓取HTTPS难免走歪路&#xff0c;也许你一步步按着网上的帖子成功了&#xff0…

Kubernetes 准入控制器

Kubernetes 极大地提高了当今生产中后端集群的速度和可管理性。由于灵活、可扩展、易用&#xff0c;Kubernetes 已成为容器编排的事实标准。Kubernetes 还提供了一系列保护功能。而 Admission Controllers&#xff08;准入控制器&#xff09; 是一组安全相关的插件&#xff0c;…

Failed to start application ‘/LM/W3SVC/7/ROOT‘, ErrorCode ‘0x800700c1‘.解决方案

dll相互干扰所致 关闭整个IIS服务 发布选项勾选删除现有文件 即可

Seata AT模式源码解析二(Seata Client端启动流程)

文章目录 初始化TM和RM数据源代理 由于我们一般都是在springboot中使用的&#xff0c;而与springboot集成的我们一般就先看starter的spring.factories文件&#xff0c;看看它的自动装配 这里面主要关注SeataAutoConfiguration和SeataDataSourceAutoConfiguration。 SeataAutoCo…

C# WPF窗体设计器显示以及App.xaml文件打不开

问题描述&#xff1a; 在项目中遇到了App.xaml设计器打不开以及窗体设计器不显示&#xff0c;只有代码&#xff0c;如图所示&#xff1a; 可以明显的看见左下角的设计器不见&#xff0c;但是用户控件又有设计器 解决方法&#xff1a; ①清理项目 ②将不能正常打开的文件右…

Android Studio 2022.3 新版 flamingo 安装步骤及遇到的问题

下载地址: https://developer.android.google.cn/studio D盘中新建一个 Android 文件夹, 用来存储 Android studio 和 SDK 文件. 下载好之后, 运行 exe 文件, 点击 next 注意这个路径最好不要有空格,比如 program files这种目录,不然后面安装sdk的时候会有问题. 点击 instal…

【TI毫米波雷达笔记】IWR6843AOPEVM-G的DCA1000EVM模式配置及避坑

【TI毫米波雷达笔记】IWR6843AOPEVM-G的DCA1000EVM模式配置及避坑 IWR6843AOPEVM-G版本可以直接与DCA1000EVM连接 进行数据获取 不需要连接MMWAVEICBOOST版 直接使用 DCA1000mmWave Studio 软件进行数据采集 在官方手册中 User’s Guide 60GHz 毫米波传感器EVM 有相关模式的开…

基于RetinaNet和TensorFlow Object Detection API实现目标检测(附源码)

文章目录 一、RetinaNet原理二、RetinaNet实现1. tf.train.CheckPoint简介2. RetinaNet的TensorFlow源码 一、RetinaNet原理 待补充 二、RetinaNet实现 1. tf.train.CheckPoint简介 待补充 2. RetinaNet的TensorFlow源码 Step 1&#xff1a;安装Tensorflow 2 Object Detect…

ORB-SLAM3整体流程详解

0. 简介 在之前&#xff0c;作者曾经转过一篇《一文详解ORB-SLAM3》的文章。那篇文章中提到了ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM系统&#xff0c;可以在单目&#xff0c;双目和RGB-D相机上利用针孔或者鱼眼模型运行。与ORB-SLAM2相比&#xff0c;ORB-SLAM3…

软件系统三基座之一:权限管理

软件系统三基座包含&#xff1a;权限管理、组织架构、用户管理。 何为基座&#xff0c;即是有了这些基础&#xff0c;任一相关的“建筑”就能逐步搭建起来。 万丈高楼平地起 一、为什么要权限管理 权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;…

集成chatgpt4和midjourney的超强镜像站

昨天发现一个镜像站&#xff0c;和之前发的镜像站不一样&#xff0c;这个集成了midjourney和chatgpt&#xff0c;且免翻&#xff0c;相信给很多很多用户都提供了便利吧&#xff01; 先把网站贴出来&#xff0c;有兴趣的伙伴可以玩一玩 http://mtw.so/5EoyYy http://mtw.so/5E…

如何在上架App之前设置证书并上传应用

App上架教程 在上架App之前想要进行真机测试的同学&#xff0c;请查看《iOS- 最全的真机测试教程》&#xff0c;里面包含如何让多台电脑同时上架App和真机调试。 P12文件的使用详解 注意&#xff1a; 同样可以在Build Setting 的sign中设置证书&#xff0c;但是有点麻烦&…

浅析 Redis 中 String 数据类型及其底层编码

从 RedisObject 说起 在 Redis 中&#xff0c;任意数据类型的键和值都会被封装为一个 RedisObject &#xff0c;也叫做Redis对象&#xff0c;源码如下 c 复制代码 /*server.h*/ typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS;…

springboot+vue之java学习平台(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的java学习平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

档案库房太乱了怎么办?这个方法秒变高级!

全国有数以万计的大大小小的档案馆&#xff0c;其中有许多非常重要的机要档案&#xff0c;其历史和社会价值非常高&#xff0c;而档案保存的质量、档案的物理寿命、档案的防虫防霉都与库房的空气质量、温湿度息息相关。 解决档案高效管理及利用的安全问题越来越迫切&#xff0c…

在Ubuntu22.04上安装QQ~Linux

在Ubuntu22.04上安装QQ~Linux 0. 前言1. 下载deb安装包2. 使用dpkg安装deb包3. 安装完成&#xff0c;启动QQ3.1 点击图标打开3.2 使用命令行的方式打开 0. 前言 换Ubuntu当主力生产力了&#xff0c;并不是太喜欢vmware&#xff0c;所以我直接装到了硬盘里边&#xff0c;需要移…

SSM 如何使用 Kafka 实现消息队列?

SSM 如何使用 Kafka 实现消息队列&#xff1f; Kafka 是一个高性能、可扩展、分布式的消息队列系统&#xff0c;它支持多种数据格式和多种操作&#xff0c;可以用于实现数据传输、消息通信、日志处理等场景。在 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;开发中…