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

(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进行反汇编,并执行

原文地址:https://www.cnblogs.com/smallblog/p/10041818.html