1.
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段中的数据没变,依旧是0123, 0456, 0789, 0abc, 0def, 0fed, 0cba, 0987
(2)
cs=076C,ss=076B,ds=076A
(3)
程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
分析:因为这段代码data段占了16个字节,stack段占了16个字节,所以段地址依次差一
2.
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段的数据没变,依旧是0123, 0456
(2)
cs=076C,ss=076B,ds=076A
(3)
程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
(4)
name segment
...
name ends
改段中的数据占N个字节,则程序加载后,该段实际占有的空间为【N/17+1】*16个字节(【】为取整运算)
分析:这道题中虽然data段和stack段都只占了4个字节,但是依然分配了16个字节的空间,可以得出当0<N<=16时,则分配16个字节的空间,则可以得出上面的结论
3.
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 ax,4c00h
int 21h
code ends
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0,0
stack ends
end start
(1)
(1)
程序返回前,data段的数据没变,依旧是0123, 0456
(2)
cs=076A,ss=076E,ds=076D
(3)
程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4
分析:这里应该是因为代码先后的问题,导致了code段在前,但是代码只占了20h个字节,但系统自动加了两个字节为0,导致了code和data的段地址差了3,我猜如果code段之后有别的段且占了N个字节,则系统会分配【N/16+1】*16个字节的空间
4.
将1、2、3中的最后一条伪指令”end start“改为”end“
程序运行都没有报错,但是前两个会将代码段之前的数据段当成代码段来运行,进而没法正确执行,而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
c1 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
db 8 dup(0)
c1 ends ; 改的时候要成对一起修改
code segment
start:
mov ax,a
mov ds,ax
mov cx,4
mov bx,0
s: mov ax,ds:[bx]
add ax,ds:[bx+10h]
mov ds:[bx+20h],ax
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
6.
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 8 dup(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]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start