• 包含多个段的程序 课后实验


    (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

            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

    ①CPU执行程序,程序返回前,data段中的数据  。

    ②CPU执行程序,程序返回前,CS= ,SS= ,DS= 。

    ③设程序加载后,CODE段的段地址为X,则DATA段的段地址为  ,STACK段的段地址为   。

    实验:1、输入代码

              2、编译、连接

    用 u命令进行反汇编,并用 g 命令执行到 076c:001d

    因为问 data段中数据,所以用 d命令查询 得:data段中的数据不变;

    CPU执行程序,程序返回前,cs=076c,ss076b,ds=076a;

    设程序加载后,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

            push ds:[0]

            push ds:[2]

            pop ds:[2]

            pop ds:[0]

            mov ax,4c00h

            int 21h

    code ends

    end start

    实验:1、编码

               2、编译、连接

    用 u命令进行反编译;

    继续用 d命令查询

    所以,CPU执行程序,程序返回前,data段中的数据不变;

    CPU执行程序,程序返回前,cs=076c,ss076b,ds=076a;

    设程序加载后,code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1;

    对于如下定义的段:

    name segment

    ……

    name ends

    如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为 ((N/16+1)*16 。(N一般为16的倍数,如果不是16的倍数,则加一,再×16。若为16的倍数,则直接为N)

    (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、编码

     2、编译、连接

    用u进行反汇编

    再用 g命令,直接执行到 076a:001d

    在用 d命令查询 ds

    由图可知:(其实根据前面的几个实验可以发现)

    data段中的数据不变;

    cs=076a,ss=076e,ds=076d;

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

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

    答:  只有(3)可以执行,因为“end start”改为“end”,则程序不能识别 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 ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
    db 8 dup(0)
    c ends ; 改的时候要成对一起修改
    code segment
    start:
    ;?
    code ends
    end start

    代码编写:

    在进行 编译、连接

    进行 反汇编

    查询 a,b,c 的初始数据,在执行

    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 8 dup(0)
    b ends

    code segment
    start: 
    ;?
    code ends
    end start

    代码编写:

    编译。连接

    用u进行反汇编,并执行

  • 相关阅读:
    How does a single thread run on multiple cores?
    一篇所有研究生都该读的好文:阳光温热 科研静好
    Running Slic3r from git on GNU Linux
    3D打印的各种问题及解决方案
    新工科的新视角:面向可持续竞争力的敏捷教学体系
    What is Modularity
    3d打印模型为什么文件格式必须是stl和stp的?
    剑指offer 39.平衡二叉树
    剑指offer 38.二叉树的深度
    剑指offer 37.数字在排序数组中出现的次数
  • 原文地址:https://www.cnblogs.com/smallblog/p/10041818.html
Copyright © 2020-2023  润新知