博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验 5 编写、调试具有多个段的程序
阅读量:5304 次
发布时间:2019-06-14

本文共 2096 字,大约阅读时间需要 6 分钟。

一、实验任务

完成教材133实验5

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

assume cs:code, ds:data, ss:stackdata segment  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987hdata endsstack segment  dw 0, 0, 0, 0, 0, 0, 0, 0stack endscode segmentstart:  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 21hcode endsend start

 

用u指令反汇编,g指令执行到001d前,得到程序返回前。

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

 

(2)CPU执行程序,程序返回前,cs=076c、ss=076b、ds=076a。

(3)设程序加载后、code段段段地址为X,则data段的段地址为X-2,stack段的段地址为X-1(通过反汇编可以得到)。

 

 2、运行ex5_2 debug(操作同1)

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

(2)CPU执行程序,程序返回前,cs、ss、ds的值。

 

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

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

name segment

...

name ends

如果段中的数据占n个字节,则程序加载后,该段实际占有的空间为:((n+15)/16)*16。 

在8086CPU架构中,每个段都是以16字节来对齐的,即若段数据在16字节以内,也计作16字节。

 

 3、运行ex5_3 debug

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

(2)CPU执行程序,程序返回前,cs、ss、ds的值。

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

 

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

 (1)(2)无法执行,因为(1)(2)以数据段开始,找不到程序入口无法执行第一条语句。(3)以指令开始,可以执行。

 

5、编写code段中的代码,将a段和b段中的数据一次相加,结果存到c段中。(补充完整后代码如下)

assume cs:codea segment  db 1,2,3,4,5,6,7,8a endsb segment  db 1,2,3,4,5,6,7,8b endsc segment    db 8 dup(0)c ends      code segmentstart:mov bx,0      mov dx,0      mov cx,8s:mov dx,0  mov ax,a  mov ds,ax  add dx,[bx]  mov ax,b  mov ds,ax  add dx,[bx]  mov ax,c  mov ds,ax  mov [bx],dx  inc bx  loop s  mov ax,4c00h  int 21hcode endsend start

·用t命令单步执行到mov [bx],dx之前,使得ds中保存的是c段的段地址。用d命令查看此时的c段中的内容。

 ·运行到程序结束前,d命令查看c段内容。

实验验证完毕。

 

6、编写code段中代码,用push指令将a段中的前八个字型数据逆序存储到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 8 dup(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 [bx]

add bx,2h
loop s

mov ax,4c00h

int 21h
code ends
end start

用u指令反汇编、用g指令运行到程序返回前、用d指令查看b中内容。得到逆序。

 

总结:

了解了寄存器分段存储的相关知识,分段存储更加简洁明了,以及复习了栈的知识。实践时不够熟练,还是要多加练习。

 

转载于:https://www.cnblogs.com/Xingxixi/p/10014389.html

你可能感兴趣的文章
菜鸟运维笔记:Windows上用Xshell管理你的云主机
查看>>
JavaScript中的this
查看>>
jsp
查看>>
03 基本数据结构 - 栈
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
微信小程序之随笔
查看>>
ios蓝牙详解
查看>>
React Native在Android平台运行gif的解决方法转载
查看>>
Mybatis RowBounds 是逻辑分页
查看>>
hdu 3341(ac自动机+状态压缩)
查看>>
51单片机之蓝牙遥控小车_效果展示+单片机知识+完整蓝牙电车代码
查看>>
Sql Server中REPLACE函数的使用
查看>>
SqlServerl的行转列
查看>>
JavaScript跨域总结与解决办法
查看>>
Hover功能
查看>>
[LeetCode] Jump Game II
查看>>
js千分位处理
查看>>
js常用的方法
查看>>
Mac---------三指拖移
查看>>
关于VMare中安装Ubuntu的一些说明
查看>>