汇编实验——03

实验三 存储器分段的理解
一、实验目的
熟悉程序框架;理解存储器分段的本质及不同段之间的关系。
二、实验题

  1. 将下面的程序编译链接,用debug跟踪,然后回答问题。
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
    DATAS SEGMENT
    DW 0123H, 0456H, 0789H, 0ABCH, 0DEFH, 0FEDH, 0CBAH, 0987H
    DATAS ENDS
    STACKS SEGMENT
    DW 1,1,1,1,1,1,1,1
    STACKS ENDS
    CODES SEGMENT
    START:
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,16
    MOV AX,DATAS
    MOV DS,AX
    PUSH DS:[0]
    PUSH DS:[2]
    POP DS:[2]
    POP DS:[0]
    MOV AH,4CH
    INT 21H
    CODES ENDS
    END START
    ⑴CPU执行程序,程序返回前,DATAS段中的数据为多少?将截图附在下面。
    image

Datas段中的内容不变。
⑵CPU执行程序,程序返回前,CS = 0772H、SS = 0771H、DS = 0770H。
image

⑶设程序加载后,CODES段的段地址为X,则DATAS段的段地址为X-2,STACKS段的段地址为X-1。将截图附在下面。
image
image
image

2.将下面的程序编译链接,用debug跟踪,然后回答问题。
ASSUME CS:CODE, DS:DATA, SS:STACK
DATA SEGMENT
DW 0123H, 0456H
DATA ENDS
STACK SEGMENT
DW 1,1
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:[0]
POP DS:[2]
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
⑴CPU执行程序,程序返回前,DATAS段中的数据为多少?将截图附在下面。
image

Datas的输出内容在红框中。
⑵CPU执行程序,程序返回前,CS =0772H 、SS =0771H 、DS =0770H 。
image

⑶设程序加载后,CODES段的段地址为X,则DATAS段的段地址为X-2,STACKS段的段地址为X-1。将截图附在下面。
image
image

image

⑷对于如下定义的段:
NAME SEGMENT
……
NAME ENDS
如果段中的数据占N个字节,则程序加载后,该实际占有的空间为 。
观察以上实验结果可知,当我们数据小于等于16字节时,系统分配的内存为16字节,当我们输入的数据大于十六字节的时候,系统分配的内存为(x/16+1)*16
(这里的除法是整除,不是浮点数除法)
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:[0]
POP DS:[2]
MOV AX, 4C00H
INT 21H
CODE ENDS
DATA SEGMENT
DW 0123H, 0456H
DATA ENDS
STACK SEGMENT
DW 1,1
STACK ENDS
END START
⑴CPU执行程序,程序返回前,DATAS段中的数据为多少?
image
⑵CPU执行程序,程序返回前,CS =0770H、SS = 0774H、DS = 0773H。
image

⑶设程序加载后,CODES段的段地址为X,则DATAS段的段地址为X+3,STACKS段的段地址为X+4。将截图附在下面。
4.如果把1、2、3题中的最后一条伪指令“END START”改为“END”(也就是说不指明程序入口),则哪个程序能正确执行?
答:第三条程序还可以正常执行,因为如果不指明程序指令的开始入口,前两个是数据段,只有从第三条开始是指令代码,但是第三个将代码段定义在开头,两个数据段定义在后面,所以可以正常执行。
三、实验题

  1. 完成下面的程序,利用栈,将程序中定义的数据逆序存放。
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
    CODESG SEGMENT
    DW 0123H, 0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
    DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    CODESG ENDS
assume cs:code,ds:a,ss:b
a segment
    DW 0123H, 0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
a ends
b segment
    DW 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,a
       mov ds,ax   
       mov ax,b
       mov bx,0   
       mov ss,ax
       mov sp,16   
       mov cx,8
    s: push [bx]
       add bx,2
       loop s   
       mov bx,0
       mov cx,8
    t: pop [bx]
       add bx,2
       loop t  
    mov ax,4c00h
    int 21h 
code ends
end start

image

image

通过观察实验结果知,程序正常运行返回后,数据完成逆序存放。
四、实验报告
要求: 1.每步操作过程及所用指令;2.用截图方式反应指令执行前后的相关寄存器或存储单元内容的变化,并对所得结果进行分析。

posted @ 2022-04-25 15:27  TCcjx  阅读(416)  评论(0编辑  收藏  举报