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

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

根据老师给出的代码,在电脑上自己实现一系列过程

 查看代码具体执行到哪个单元。

42h包括了data与stack与输出部分三者所占据的代码字节数,减去即为需要实现的代码数

由于对命令不能做到非常熟悉具体格式的地步,反复尝试了很多次。

1.CPU执行程序,程序返回前,data中的数据为原始数据(入栈出栈的恢复)。

2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH.

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

2.再次运用现成的程序段

 

 反汇编得到需要的字节数,查看寄存器的状态。

1.CPU执行程序,程序返回前,data中的数据为16个字节空间,前两个字数据不变,其余为0。

2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH(与上题一致).

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

4.对于如下定义的段:

name segment

...

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16)

若N<16,则补全为16。

首先第一题,16个字节占据,第二题,虽然才录入了4个字节的数据,从其余的内存空间为0看来,占用了16个字节,

听从老师的意见,更改字节数,

6个字节

6个字节

18个字节

 如图所示,可以得出答案,

N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16),若N<16,则补全为16。

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

1.CPU执行程序,程序返回前,data段中的数据如上图所示。

2.CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH.

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

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

第一个程序

 

第二个程序

第三个程序

综上来看,第三个程序可以正确执行,因为前两个默认代码的入口为data的入口,而第三个开头即为需要的实现代码,通过更改前两个代码data,stack,code的位置即可以成功执行。

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

db 0,0,0,0,0,0,0,0

c ends

code segment

start:

  mov  bx,0

  mov  cx,8

s:  mov dx,0(清零操作)

  mov ax,a(阶段一)

  mov ds,a

  add dl.[bx]

  mov ax,b(阶段二)

  mov ds,ax

  add dl,[bx]

  mov ax,c(阶段三)

  mov ds,ax

  mov [bx],dl

  inc bx

loop s

mov ax,4c00h

int 21h

code ends

end start

 

结果正确

(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 0,0,0,0,0,0,0,0

b ends

code  segment

start:

  mov ax,b(栈的设置)

  mov ss,ax

  mov sp,10h

  mov ax,a(当前代码段地址)

  mov ds,ax

  mov cx,8

  mov bx,0

s: push [bx](简单的入栈操作)

  add bx,2

  loop s

mov ax,4c00h

int ax,21h

code ends

end start

 结果正确

 总结:

通过这6个实验,了解到内存分配的小规律,知道了如何根据段中的数据所占字节,求出实际所需的内存空间,以及end前要标明代码的入口,实验五和实验六教会了我数据的相加和转移,更加熟练掌握了栈的使用方法。

原文地址:https://www.cnblogs.com/-Cold/p/10016696.html