(1).1
当debug未执行我们的代码段指令时,从075A:0000开始的256字节是PSP段(之前的实验中已经进行过相关解释),而此时我们定义的数据是从075A:0100开始存放的。这个时候DS可能只是被初始化为075A(SS,CS同理被初始化)
此时的DS段内容如下:
而当使用-g 001d执行完我们的代码段指令后,会发现DS,CS,SS段的段地址已经发生了变化:
DS段内容相应地变成了(注意和未执行指令时的DS段内容对比):
(1).2
实验结果:
(1).3假设code段地址为X,则data段地址为X-2,stack段地址为X-1
(2).1和(2).2
实验结果:
(2).3假设code段地址为X,则data段地址为X-2,stack段地址为X-1
(2).4如果段中占用N个字节,则程序加载后,实际占有空间为N/16上取整×16(简而言之就是如果没满的话,用0补满该程序对应的机器码所占用的最高地址空间的16字节空间)
(3).1
实验结果:
(3).2
实验结果:
(3).3 假设code段地址为X,则data段地址为X+3,stack段地址为X+4。
(4)不指明程序入口,那么程序会直接从最开始运行,所以只有程序(3)可以正常运行
(5)
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 bx,0
mov ax,b
mov es,ax
mov si,0
mov di,16
mov cx,8
s:
mov al,ds:[bx]
add al,es:[si]
mov es:[di],al
inc bx
inc si
inc di
loop s
mov ax,4c00h
int 21h
code ends
end start
实验结果:
(6)
assume cs:code,ss:b
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
s1:
mov ax,ds:[bx]
push ax
add bx,2
loop s1
mov ax,4c00h
int 21h
code ends
end start
实验结果: