一、 实验目的
熟悉程序框架;理解存储器分段的本质及不同段之间的关系。
二、 示例
- 将下面的程序编译链接,用debug跟踪,然后回答问题。
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
assume cs:codes,ds:datas,ss:stacks
start:
mov ax,stacks
mov ss,ax
mov sp,16
mov ax,datas
mov ds,ax
push ds:[0] //0123h
push ds:[2] //0456h
pop ds:[2] //0456h
pop ds:[0] //0123h
mov ah,4ch
int 21h
codes ends
end start
⑴ CPU执行程序,程序返回前,datas段中的数据为多少?将截图附在下面。
0123h, 0456H,0789h,0abch,0defh,0fedh,0cbah,0987h
⑵ CPU执行程序,程序返回前,cs = 0772H、ss = 0771H、ds = 0770H。
⑶ 设程序加载后,codes段的段地址为X,则datas段的段地址为X-2,stacks段的段地址为X-1。
2.将下面的程序编译链接,用debug跟踪,然后回答问题。
data segment
dw 0123h, 0456h
data ends
stack segment
dw 1,1
stack ends
code segment
assume cs:code, ds:data, ss:stack
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段中的数据为多少?将截图附在下面。
运行前:0123H, 0456H
运行后:0456H,0123H
⑵CPU执行程序,程序返回前,cs = 0772H、ss = 076FH、ds = 0760H。
⑶设程序加载后,codes段的段地址为X,则datas段的段地址为X-2,stacks段的段地址为X-1。将截图附在下面。
⑷对于如下定义的段:
name segment
……
name ends
如果段中的数据占N个字节,则程序加载后,该实际占有的空间为(N/16)Byte
- 将下面的程序编译链接,用debug跟踪,然后回答问题。
code segment
assume cs:code, ds:data, ss:stack
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段中的数据为多少?
0123H,0456H
⑵CPU执行程序,程序返回前,cs = 0770H、ss =076FH、ds = 0760H。
⑶设程序加载后,codes段的段地址为X,则datas段的段地址为X+3,stacks段的段地址为X+4。将截图附在下面。
- 如果把1、2、3题中的最后一条伪指令“end start”改为“end”(也就是说不指明程序入口),则哪个程序能正确执行
答:第三个程序,程序入口无数据段。
三、 实验题
- 编写程序,x , y , z , v 均为16位带符号数,计算 ( v - ( x*y + z – 540 ) ) / x。把源程序附在下面,并把debug单步调试的截图附在下面。
datas segment
dw 0123H, 0456H,0789H,0abcH
datas ends
codes segment
assume cs:codes,ds:datas
start:
mov ax, datas
mov ds,ax
mov ax,ds:[0]
mov bx,ds:[2]
imul bx
mov cx,ax
mov bx,dx
mov ax,ds:[4]
cwd
add cx,ax
adc bx,dx
sub cx,540
sbb bx,0
mov ax,ds:[6]
cwd
sub ax,cx
sbb dx,bx
mov bx,ds:[0]
idiv bx
mov ah,4ch
int 21h
codes ends
end start
运行调试截图:
mov ax, datas
mov ds,ax
将数据放入ds中:
mov ax,ds:[0]
mov bx,ds:[2]
imul bx
xy结果放在dx和ax中:dx:0004H ax:edc2H
mov cx,ax
mov bx,dx
mov ax,ds:[4]
cwd
add cx,ax
adc bx,dx
将xy的结果加上z,放在bx和cx中:bx:0004H cx:f54bH
sub cx,540
sbb bx,0
将 xy + z 的结果减去540,放在bx和cx中:bx:0004H cx:f32fH
mov ax,ds:[6]
cwd
sub ax,cx
sbb dx,bx
将 xy + z– 540的结果被v,即0abcH减去,结果放在ax,dx中
ax:178dH dx:fffbH
mov bx,ds:[0]
idiv bx
v– (x*y + z– 540)的结果除以x,即0123H,最终结果放在ax,dx中
ax:fbafH dx:ffa0H