汇编实验五

实验结论:

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

1.用d命令查看后发现data段中的数据不变。

2.CPU执行程序,程序返回前,cs=076C,ss=076B,ds=076A。

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

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

1.用d命令查看后发现data段中的数据不变。

2.CPU执行程序,程序返回前,cs=076C,ss=076B,ds=076A。

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

4.对如下定义的段:

name segment

...

name ends

如果段中数据占N个字节,则程序加载后,该段实际占有的空间为 [(N+15)/16]*16。(结合实验1,2可知数据段都是以16个字节对齐,不足16字节按16字节算)

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

1.用d命令查看后发现data段中的数据不变。

2.CPU执行程序,程序返回前,cs=076A,ss=076E,ds=076D。

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

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

(1)和(2)不能正确执行,因为如果不是end start就会默认以ip=0执行,而不是从start开始执行。而(3)的data和stack都在code之后,所以ip本来就为0,可以正确执行。

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

 1 assume cs:code
 2 a1 segment
 3   db 1,2,3,4,5,6,7,8
 4 a1 ends
 5 b1 segment
 6   db 1,2,3,4,5,6,7,8
 7 b1 ends
 8 c1 segment   
 9   db 8 dup(0)
10 c1 ends    
11 code segment
12 start:
13    mov ax,a1
14    mov ds,ax
15    mov bx,0
16    mov cx,8
17 s:mov ax,[bx]
18    add ax,[bx+10h]
19    mov [bx+20h],ax
20    add bx,2
21    loop s
22    mov ax,4c00h
23    int 21h
24 code ends
25 end star

执行前我查看了很多次,一直是这样,我也不知道问题出在哪!!

执行后可以看出存入正确。

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

 1 assume cs:code
 2 a1 segment
 3   dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
 4 a1 ends
 5 b1 segment
 6   dw 8 dup(0)
 7 b1 ends
 8 code segment
 9 start: 
10    mov ax,a1
11    mov ds,ax
12    mov ax,b1
13    mov ss,ax
14    mov sp,16
15    mov cx,8
16    mov bx,0
17 s:push [bx]
18    add bx,2
19    loop s
20    mov ax,4c00h
21    int 21h
22 code ends
23 end start

执行前还是向上一题那样,就不截图了。

执行后如下:

发现成功逆序存储。

总结与体会

通过这次实验我理解和掌握将数据、代码、栈放入不同段的程序的编写和调试,也理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式。

不过在实验中我也遇到很多问题,希望在接下来的学习中能改进吧。

posted @ 2018-11-22 21:18  Gemini小纯洁  阅读(1059)  评论(5编辑  收藏  举报