(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
1)data中数据保持不变
2)程序返回前cs=076C、ss=076B、ds=076A
3)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)data中数据保持不变
2)程序返回前cs=076C、ss=076B、ds=076A
3)data段地址为X-2、stack段地址为X-1
数据段以及栈均定义了两个字的数据,debug发现数据段占16个字节,其余空间使用0填充
测试数据段写入17个字,34个字节
可见共分配了16*3=48字节内存空间。
由此得出,系统为段分配的内存空间大小只能为16字节的整数倍,实际大小为能容纳实际数据的最小的16的倍数个字节。即对于段中数据占N个字节,则程序加载后,该段实际占有的空间为(N/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:[2]
pop ds:[0]
mov 4c00h
int 21h
code ends
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends
end start
debug跟踪执行,并观察寄存器和内存数据情况
1)data中数据如图中所示保持不变
2)程序返回前cs=076A、ss=076E、ds=076D
3)data段地址为X+3、stack段地址为X+4
(4)第三个程序可以正常执行(去掉end时,只有第三个程序开始处即为程序指令,前两个程序开始处为定义的数据,按照指令执行时会出错)
(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 ax,a
mov ds,ax
mov ax,c
mov es,ax
mov bx,0
mov cx,8
s: mov al,ds:[bx]
add al,ds:[bx+16]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
段地址为16的倍数,虽然a,b,c段定义了8个字节数据,但是加载内存中,是开辟了16个字节的空间,通过debug可观察到a段的段地址为076a,b段的段地址为076b,c段的段地址为076c。
跟踪执行,并观察目标c段的076c:0开始处的数据变化情况,如下图,结果数据已经成功写入
(6)将a段作为数据段,b段作为栈段,将a段数据逐个压入栈中,即完成题目要求。编写代码如下:
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,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,10h
mov bx,0
mov cx,8
s:
push ds:[bx]
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
调试跟踪,栈段数据地址为076c:0,最终发现数据已成功逆序存到栈段,如下图: