第6章:包含多个段的程序

1.在代码段中使用数据
dw”:define word(定义字型数据;)
db”(定义字节型数据;)
"start"指明程序的入口在标号start处;

检测点6.1

1.补全下列程序;(数据传送利用寄存器)

assume cs:codesg
codesg 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      ;将ds:[bx]中的数据传送到ax后,直接传送到cs:[bx]处即可。
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start

2.补全程序(数据传送利用栈空间)

assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start:mov ax,0
mov ds ax       ;将ds指向内存空间
mov ax,cs
mov ss,ax
mov sp,30h      ;设置栈顶(空栈,栈大小为20h,即16个字节)
mov bx,0
mov cx,8        ;初始化控制变量及循环次数
s1:push [bx]        ;将内存空间数据依次入栈
add bx,2
loop s1
mov bx,0
mov cx,8
s2:pop cs:[bx]      ;将栈中数据依次送入程序段中
add bx,2
loop s2
mov ax,4c00h
int 21h
code ends
end start

2.将数据,代码,栈放入不同的段
总结:将数据,栈和代码都放到一个段中使得程序混乱,且空间可能不够。于是可以在一个程序中分别设置数据段,代码段,与栈段来存放不同的数据。用一个标号(标号名仅为了便于阅读)来标记一个内存地址作为段地址,在代码段中指出特定的寄存器指向的我们设置得段(比如设置了栈段,需要将栈段得标号与ss相联系)。这样,程序就可以根据我们得安排,来将特定的段作为我们设置的段。

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

(1)编译,连接,用debug加载跟踪。

assume cs:code,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       ;将ss指向stack段
mov sp,16       ;将ss:sp指向栈顶(此时栈为空)
mov ax,data
mov ds,ax       ;将ds指向data段
push ds:[0]
pushds:[2]
pop ds:[2]
pop ds:[0]      ;入栈出栈操作
mov ax,4c00h
int 21h
code ends
end start

1.CPU执行程序,程序返回前,data段中的数据为多少?
根据debug,data段中的数据为我们设置的数据。
2.CPU执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah
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 0,0
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,16       ;将栈顶指向栈空()
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

Debug情况:1.CPU执行程序,程序返回前,data段中的数据为:0123h,0456h
2.CPU执行程序,程序返回前,cs=076C,ss=076B,ds=076A
3.设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
4.对于如下定义的段:

name segment
...
name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间是16个字节
(3)将下面程序做类似操作;

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

Debug情况:
1.CPU执行程序,程序返回前,data段中的数据为:0123h,0456h
2.CPU执行程序,程序返回前,cs=076A,ss=076E,ds=076D
3.设程序加载后,code段的段地址为X,则data段的段地址为X+2,stack段的段地址为X+3


总结:程序加载入内存后,在一片连续的内存空间内,为先定义的数据段分配内存,大小为16字节的整数倍。

(4)如果将(1),(2)(3)题中的一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。

能正确执行的是第(3)段,因为如果不指明程序的入口,程序将从我们代码的第一行开始读取。(1)(2)的第一行是我们定义的数据段,没有相对应的指令,程序将会发生错误。

(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       ;将ds指向a段
mov ah,0        ;传送的是字节数据,先将高位置0()
mov bx,0
mov cx,8        ;初始化循环控制量
s:mov al,ds:[bx]        ;将a段数据存入al中
add al,ds:[bx+10h]     ;将b段数据与al中数据相加存入al中
mov ds:[bx+20h],al     ;将al中数据传入c段中(注:b段地址为a段的段地址+1,即[bx+10h],c段同理)
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
;;注:8位寄存器大小为0~127,我们定义的数据相加不会造成溢出;

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

assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,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       ;将ds指向a段
mov ax,b
mov ss,ax
mov sp,10h      ;将ss:sp指向栈顶(b段被当作栈,大小为16个字节,此时栈空)
mov bx,0
mov cx,8h       ;初始化循环控制变量
s:push ds:[bx]      ;将a段中数据入栈
add bx,2        ;注意此处传送字型数据,bx要加2
loop s
mov ax,4c00h
int 21h
code ends
end start

小结:此次实验,主要让我们理会程序加载入内存后,如何分配我们定义的各个段空间;以及深入理解段标号只代表一个地址,它的名字只是为了方便阅读。


不知不觉,已经第6章结束了,这本书挺有意思的,给我一种想继续学下去的冲动,不像高数,看了一个月了,才看完第一章,哈哈。也不知道狗北这家伙汇编学到哪里了,一定还没到这里。

《汇编语言》第6章 -包含多个段的程序 检测点答案,实验5,总结相关推荐

  1. 汇编语言之第六章包含多个段的程序

    一:dw=define word 即使用dw定义字型数据(数据之间以逗号分隔),dw 既可定义数据,也可以说用它开辟内存空间 db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1 d ...

  2. 包含多个段的程序01 - 零基础入门学习汇编语言29

    第六章:包含多个段的程序01 让编程改变世界 Change the world by program 引言 前面我们写的程序中,只有一个代码段. 现在有一个问题是: 如果程序需要用其他空间来存放数据, ...

  3. 包含多个段的程序---汇编学习笔记

    包含多个段的程序 要使用一段安全的空间,第五章中我们说0:200~0:2ff是相对安全的.可这段代码容量只有256个字节. 合法地通过操作系统取得的空间都是安全的. 程序取得所需空间的方法有两种,一是 ...

  4. 汇编语言 第3版 王爽 检测点答案及详细解析

    第一章 基础知识 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位. (2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 . (3)1K ...

  5. 汇编语言-王爽 随书源码、检测点、实验答案

    所有的程序都在笔者的机器上跑通了,大家不用担心程序有问题. 环境:Windows 10,DOSBOX,masm 本人是一名Javaer,汇编程序看起来实在是头疼,虽然无法使用面向对象的思想,但将汇编程 ...

  6. 汇编语言-第四章 第一个程序

    2019独角兽企业重金招聘Python工程师标准>>> 一个源程序从写出到执行的过程 编写汇编源程序 对源程序进行编译链接 1.使用 汇编语言编译程序对源程序文件中的源程序进行编译, ...

  7. 《汇编语言》王爽(第四版) 第十四章 检测点及实验14

    文章目录 目录 前言 一.检测点 1.检测点14.1 (1)检测点14.1.(1) (2)检测点14.1.(2) 2.检测点14.2 (1)实验任务 (2)实现代码 二.实验14 访问CMOS RAM ...

  8. 微型计算机原理计算两数和,微型计算机原理及汇编语言 第2章-2 补码及加减运算.ppt...

    微型计算机原理及汇编语言 第2章-2 补码及加减运算 2.4 数的定点与浮点表示法 2.4.1 定点表示 所谓定点表示法,是指小数点在数中的位置是固定的.原理上讲,小数点的位置固定在哪一位都是可以的, ...

  9. 汇编语言(王爽第三版) 实验5编写、调试具体多个段的程序

    参考:http://blog.sina.com.cn/s/blog_171daf8e00102xclx.html 汇编语言实验答案 (王爽):https://wenku.baidu.com/view/ ...

最新文章

  1. amazeui学习笔记--css(基本样式)--样式统一Normalize
  2. pyspark groupBy代码示例
  3. day5学python 基础+装饰器内容
  4. [html] 写页面布局时需要考虑哪些方面的因素?
  5. 用Vue.js开发微信小程序:开源框架mpvue解析
  6. [最新]制作u盘引导安装ubuntu11.04
  7. 入选 CVPR 2020的旷视论文,到底写了啥?
  8. 彩色静电植绒印花工艺的五个方法
  9. Simhash算法原理和网页查重应用
  10. FPGA深度学习加速(1) - Xilinx ug892-Vivado design flows overview (Vivado设计流程简述) - 阅读笔记
  11. 下载网页上的视频、音频文件
  12. szszszszsz
  13. 2015年360校招笔试题
  14. ICPC2019徐州区域赛 H.Yuuki and a problem
  15. pdf生成目录-如何给没有目录的pdf手动添加目录
  16. ReviewBoard安装配置
  17. canvas实现一个线性图
  18. python读取邮件标题_Python连载57- 邮件头和主题、解析邮件
  19. 计算机中英文打字文章,中英文混合文章
  20. java 字符串判空_java判断字符串String是否为空问题浅析

热门文章

  1. win10麦克风说话没声音_怎样选主播麦克风
  2. 90天减重30斤的经验分享
  3. APICloud使用记录——创建项目
  4. Oracle 10g 版本10.2.0.1.0升级到Oracle 10g 10.2.0.3.0过程
  5. Mozilla Firefox 全版本下载
  6. xgen 毛发guide历史被清理解决方法
  7. python网络爬虫一
  8. 虚拟机Linux上网ping百度跳过的坑,亲测有效
  9. less和sass支持 css modules 一样的局部环境和使用方式,解决重名样式覆盖的问题
  10. 第十五天 12-tcpdump检测流量工具