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


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

    ①CPU执行程序,程序返回前,data段的数据为多少?

    见下图d 0770:0000 000f结果。

    ②CPU执行程序,程序返回前,cs= 0772h 、ss=  0771h  、ds= 0770 h  

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

    code段是代码段,段地址存放在寄存器cs中,data段是数据段,段地址存放在ds中,stack是栈段,段地址存在ss中。

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

    ①CPU执行程序,程序返回前,data段的数据为多少?

    见下图中0770:0000 0003结果。

    ②CPU执行程序,程序返回前,cs=  0772h    、ss=  0771h   、ds=  0770h   

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

    ④对于如下定义的段:

    name  segment

    .........

    name ends

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

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

    ①CPU执行程序,程序返回前,data段的数据为多少?

    见下图中的d 0773:0000 0003运行结果。

    ②CPU执行程序,程序返回前,cs=0770h、ss= 0774h  、ds=0773h 

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

     

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

    (为了方便验证结果,我将pop ds:[2]和pop ds:[0]语句删去首先,(1)未改之前:

    程序(1)改后:

     

    用r和t命令找到现在的SS,然后用g命令使程序运行结束,发现改变前后SS发生变化。

     

    程序能够运行,但不能正确执行。

    程序(2)改变前:

    程序(2)改变后:

     

    能运行,但不能正确执行。SS的值变成了20CD。

    程序(3)改变前:

     程序(3)改变后:

     

     能够运行且执行正确。

    (1)和(2)都改变了原来SS的值。

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

     

     

    结果正确相加。

    这道题编写了好一会,一直是执行g命令后无响应,还以为是编的太复杂了改了好几遍,最后发现是AX赋值成了004C。。。。

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

     

  • 相关阅读:
    洛谷-P2430 严酷的训练
    Hackthebox网络不稳定的解决方案
    解压
    谷歌地图API密钥未授权利用
    关于读取heapdump踩的一个小坑
    RECON
    最近思考
    go get
    Js跳转
    Session
  • 原文地址:https://www.cnblogs.com/Yangruzhang/p/10007587.html
Copyright © 2020-2023  润新知