热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

汇编语言(王爽)第六章检测点与实验5

检测点6.1(1)依次用内存0:0~15单元中的内容改写程序中的数据,补全程序:assumecs:codesgcodesegmentdw0123h,0456h,0789h,0ab

检测点6.1

(1)依次用内存0:0~15单元中的内容改写程序中的数据,补全程序:

assume cs:codesg
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

start:
mov ax,0
mov ds,ax
mov bx,0

mov cx,8
s: mov ax,[bx]

mov cs:[bx],ax ;确定目标区域段地址和偏移地址
add bx,2
loop s

mov ax,4c00h
int 21h

codesg ends
end start

(2)程序实现依次用0:0~15单元的内容改写程序中数据,数据传送用栈来进行。栈空间设置在程序内,补全程序:

assume cs:codesg
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw
0,0,0,0,0,0,0,0,0,0 ;10个字空间作为栈

start:
mov ax,cs ;设置栈的段地址
mov ss,ax
mov sp,1ah ;cs:0~cs:f为原始数据空间,cs:10~cs:19为栈空间,初始为空,栈顶指向下一单元

mov ax,0
mov ds,ax
mov bx,0
mov cx,8

s: push [bx] ;先把0:0处的字单元内容入栈
pop cs:[bx] ;再把栈顶内容出栈放入程序数据段中
add bx,2
loop s

mov ax,4c00h
int 21h

codesg ends
end start

实验5 编写、调试具有多个段的程序

<程序加载后,ds:0~ff为PSP区域,(ds+10H):0为整个程序的入口,如程序依序设置有data\stack\code3个数据段区域,其中设data和stack段各自为16个字节,那么程序加载后(还未运行前):(ds+10h)则为data的入口段地址;(ds+10h+1)为stack的入口段地址;(ds+10h+2)为code的入口段地址;>

1、编译连接下面程序,用debug加载、跟踪,回答问题。

assume cs:codesg,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends

stack segment
dw
0,0,0,0,0,0,0,0
stack ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,16 ;将逻辑上设置的栈段真正设为栈段区域

mov ax,data ;设置数据区域段地址
mov ds,ax

push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]

mov ax,4c00h
int 21h

code ends
end start

程序先把数据段前两个依序入栈,再出栈返回到各数据原先位置。

(1)CPU执行程序,程序返回前,data段中的数据为多少?

执行程序后,data段中的数据不变,为原始数据。

(2)CPU执行程序,程序返回前,cs=13feh,ss=13fdh,ds=13fch.

(3)程序加载后,code段地址设为X,则data段地址为(x-2),stack段的段地址为(X-1).

注:这里提问的是data段和stack段的段地址分别是多少,程序加载时候,还没有运行,此时的data段只是逻辑上的数据区,并还没有设置ds指向;stack也如此,只是设想里的栈区。只有程序运行后才成为真正的ds指向数据区和栈段。通过(2)也可以验证(3)。

 

2、编译连接下面程序,用debug加载、跟踪,回答问题。

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

stack segment
dw
0,0
stack ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,16

mov ax,data
mov ds,ax

push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]

mov ax,4c00h
int 21h

code ends
end start

本题的重点在于:数据段和栈段在程序加载后实际占据的空间都是以16个字节为单位的。程序中只给出了前两个字数据,其余空间都用0填充。

(1)CPU执行程序,程序返回前,data段中的数据为多少?

执行程序后,data段有16个字节空间,前两个字数据不变,其余为0。

(2)CPU执行程序,程序返回前,cs=13feh,ss=13fdh,ds=13fch.

(3)程序加载后,code段地址设为X,则data段地址为(x-2),stack段的段地址为(X-1).

(4)对于如下定义的段:

name segment

......

name ends

如果段中数据位N个字节,程序加载后,该段实际占据空间为[N/16]Byte。

 

3、编译连接下面程序,用debug加载、跟踪,回答问题。

assume cs:code,ds:data,ss:stack


code segment
start:
mov ax,stack
mov ss,ax
mov sp,16

mov ax,data
mov ds,ax

push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]

mov ax,4c00h
int 21h

code ends

data segment
dw 0123h,0456h
data ends

stack segment
dw
0,0
stack ends

end start

本题考查重点是三个段的顺序调换后是否有变化?在加载后各数据段的入口段地址必然是改变了。

(1)CPU执行程序,程序返回前,data段中的数据为多少?

运行程序至程序返回前,通过:d ds:0~f查看data段数据,观察未变。

(2)CPU执行程序,程序返回前,cs=13fch,ss=1400h,ds=13ffh.

(3)程序加载后,code段地址设为X,则data段地址为(x+3),stack段的段地址为(X+4).

4、如果不指名start入口,并且使用end替换end start,程序仍然可以执行。因为如果不指名入口,程序则从加载进内存的第一个单元起开始执行,但因为程序中有部分是作为数据使用的,如果不指明入口,CPU会把这些数值数据当成汇编指令执行,因此有必要通过start来指明入口。

5、编写code段中的代码,将a段和b段数据依次相加,结果存入c段

assume cs:code
a segment
db
1,2,3,4,5,6,7,8
a ends

b segment
db
1,2,3,4,5,6,7,8
b ends

c segment
db
0,0,0,0,0,0,0,0
c ends

code segment
start:
mov ax,a
mov ds,ax

mov ax,b
mov ss,ax

mov ax,c
mov es,ax

mov bx,0
mov cx,8
s:
mov al,ds:[bx]
add al,ss:[bx]
mov es:[bx],al
inc bx

loop s

mov ax,4c00h
int 21h

code ends
end start

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

assume cs:code
a segment
dw
1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
dw
0,0,0,0,0,0,0,0
b ends

code segment
start:
mov ax,a
mov ds,ax

mov ax,b
mov ss,ax
mov sp,10h

mov bx,0
mov cx,8
s:
push ds:[bx]
add bx,2

loop s

mov ax,4c00h
int 21h

code ends
end start

注:5、6题要巩固练习通过用debug命令检查内存来看程序是否执行准确。


推荐阅读
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了一道网络流题目hdu4888 Redraw Beautiful Drawings的解题思路。题目要求以行和列作为结点建图,并通过最大流算法判断是否有解以及是否唯一。文章详细介绍了建图和算法的过程,并强调在dfs过程中要进行回溯。 ... [详细]
author-avatar
月光魔术师2702935955
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有