. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  发个实验5答案给大家看看,里面有我的解题思路,不会做的可以参考下。  [待解决] 回复[ 3次 ]   点击[ 605次 ]  
zhenglxd
[帖 主]   [ 发表时间:2009-05-04 16:13 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
pdf 143页面 133页 第六章
试验五-编写调试具有多个段的程序.
一:
(1) cpu执行程序,程序返回前,data段中的数据为多少“
答:-d ds:0
0C7D:0000  23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
分析: 单纯从源程序分析push ds:[0]这4条指令其实等于什么都没干
                   push ds:[2]
                   pop  ds:[2]
                   pop  ds:[0]
(2) cpu执行程序,程序返回前cs=(0c7f),ds=(0c7d),ss=(0c7e)
分析:单从源程序分析:cs指向程序入口,从源程序编写代码顺序来看, 最先16内存单元为数据段,数据段后16内存单元为栈段,再之后才为代码段,所以栈段基础地址要比代码段少16,所以实际段地址-1,而数据段要比栈段段地址再-1。

(3) 设程序加载后,code段段地址为x,则data段的段地址为(x-2),stack段的段地址为(x-1)
分析:没什么好分析了看上题分析

二:
(1) cpu执行程序,程序返回前,data段中的数据为多少?
答:-d ds:0
0C7D:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00
分析:结果分析同前,可见当一个段被独立划分的时候,他的最小长度是16个字节。
(2) cpu执行程序,程序返回前
cs=(0c7f),ds=(0c7d),ss=(0c7e)
分析:结果同前,更印证了一个段被独立划分的时候他的最小长度是16个字节。
(3) (3) 设程序加载后,code段段地址为x,则data段的段地址为(x-2),stack段的段地址为(x-1)
分析:同前
(4)对如下定义的段如果段中数据占N个字节那么,该段实际占用空间为?
答: 首先一个定义的段最少占据16个字节。设N/16=s 如果s是个非整数则s=s+1,最终 s*16 就是这个段实际占用的空间

三:
(1) cpu执行程序,程序返回前,data段中的数据为多少?
-d ds:0
0C80:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00
(2)(2) cpu执行程序,程序返回前
cs=(0c7d),ds=(0c80),ss=(0c81)
(3) 设程序加载后,code段段地址为x,则data段的段地址为(x+3),stack段的段地址为(x+4)
分析:其实也就是源程序中,代码段先后的问题,先分配的段地址靠前。段地址间相差的内存地址都以16字节为单位。

四:如果将一,二,三,题中end start改为end哪个程序依然可以正确运行为什么?
答:第三题可以运行,因为第三题中代码段是放置于源程序首的,所以在没有指明start的情况下,start仅具有标号意义表示这个地址存放有一些代码,默认的cs:ip指向程序入口即代码段,而第一第二题,中代码段数据并没有放置于源程序中的最上方所以得到的指令有可能是错误的。

五:编写code中的代码,将a段,b段数据依次相加,结果存入c段.
###PS:我的理解依次相加就是 c1=a1+b1。。。之类的.
答:
start:mov ax,ds
      add ax,10H
      mov ss,ax
      mov sp,0
      add ax,1
      mov es,ax
      add ax,1
      mov ds,ax
      mov bx,0
      mov cx,8
    s:mov al,ss:[bx]
      mov dl,es:[bx]
      add dl,al
      mov [bx],dl
      inc bx
      loop s

      mov ax,4c00H 
      int 21H

code ends

# 下面是结果
-d ds:0
0C7F:0000  02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00
思路:难点在于1是如何确定寄存器地址,2是如何传送字节数据,实际上由于分配内存是源程序的代码是从ds+10H处地址开始分配的由此可以得出源程序地址第一个段的地址为ds+10H,长度至少为16字节,第二段段地址为第一段再+1,后分别取2个8位寄存器然后相加数据,其实投机取巧的方法很多比如自加运算或者设栈操作,但不是破坏了题意,就是破坏了原始段内数据。所以我没有采用。

六:编写code段中的代码,用push指令将a段中前8个字型数据,逆序存储到b段中。
答:
code segment
start:mov ax,ds
      add ax,10H
      mov ds,ax
      add ax,2
      mov ss,ax
      mov sp,10H
      mov bx,0
      mov cx,8
    s:push [bx]
      add bx,2
      loop s

      mov ax,4c00H
      int 21H
code ends
结果
-d ss:0
0C7F:0000  08 00 07 00 06 00 05 00-04 00 03 00 02 00 01 00
分析:
很简单的一道题意外的是我实践总居然修改了2次,一是居然忘记了字节型数据占2个字节,二是,在add bx时疏忽的仅仅加了1.
思路方面参考上一题。
sgiceleo
[第1楼]   [ 回复时间:2009-05-06 16:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-01 11:51
学习中!谢谢!
mess
[第2楼]   [ 回复时间:2009-05-06 18:30 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
第五题,楼主是利用了“(4)对如下定义的段如果段中数据占N个字节那么,该段实际占用空间为? ”,对ss ds es赋值,当是这样并没有精简程序,直接使用mov ax,a mov ss,ax一样达到这个效果。

如果在loop循环中使用相对位置寻找数据来操作会精简程序。

ss、sp实现了栈机制,所在在程序中除了栈操作要尽量不使用他们,很容易发生错误。

mov ax,ds 
add ax,10H 
mov ss,ax
---------
这种赋值说明了楼主对debug加载后ds的值能比较活用,但是这里存在一个问题,debug加载后ds存放程序所在内存区的段地址,但是程序直接运行或是用其他调试工具加载程序ds还具有此特定意义吗?也就是说这段代码是否有通用性。这个问题在第六个程序中依然存在。
s252525
[第3楼]   [ 回复时间:2009-05-17 18:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-08 19:44
三: 
(1) cpu执行程序,程序返回前,data段中的数据为多少? 
-d ds:0 
0C80:0000  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00 
(2)(2) cpu执行程序,程序返回前 
cs=(0c7d),ds=(0c80),ss=(0c81) 
(3) 设程序加载后,code段段地址为x,则data段的段地址为(x+3),stack段的段地址为(x+4) 
分析:其实也就是源程序中,代码段先后的问题,先分配的段地址靠前。段地址间相差的内存地址都以16字节为单位


为什么是code段段地址为x,则data段的段地址为(x+3),stack段的段地址为(x+4)   呢 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved