实验5 编写、调试具有多个段的程序

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	;ss:sp stack
 
	mov ax, data
	mov ds, ax	;ds data
 
	push ds:[0]
	push ds:[2]
	pop ds:[2]
	pop ds:[0]
 
	mov ax, 4c00h
	int 21h
 
code ends
end start

(1)cpu执行程序,程序返回前,data段中的数据是多少?

(2)cpu执行程序,程序返回前,cs=1458h, ss=1457h, ds=1456h

(3)设程序加载后,code段的地址为X,则data段的地址X-2,stack段为X-1

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	;ss:sp stack
 
	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)cpu执行程序,程序返回前,data段中的数据是多少?

(2)cpu执行程序,程序返回前,cs=1458h, ss=1457h, ds=1456h

(3)设程序加载后,code段的地址为X,则data段的地址X-2,stack段为X-1

(4)如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:[(n/16)+1]*16 字节

边追踪边查看内存的数据:

push ds:[0] (因为sp=10h,所以一开始ss:sp指向10h,即在1456:0020最开始的位置),可以发现另起了一行,无论你的段申请够不够16个字节,计算机都会帮你直接申请够一行,也就是16个字节。

 push ds:[2]

出栈后,1456:0010的数据就发生了改变。

3、

assume cs:code, ds:data, ss:stack
 
code segment
start:
	mov ax, stack
	mov ss, ax
	mov sp, 16	;ss:sp stack
 
	mov ax, data
	mov ds, ax
 
	push ds:[0]
	push ds:[2]
	pop ds:[2]
	pop ds:[0]
 
	mov ax, 4c00h
	int 21h
 
	data segment
	dw 0123h, 0456h
	data ends
 
	stack segment
		dw 0, 0
	stack ends
 
code ends
end start

(2)cpu执行程序,程序返回前,cs=1456h, ss=145Ah, ds=1459h

(3)设程序加载后,code段的地址为X,则data段的地址X+3,stack段为X+4

4、如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确的执行?

第3个。“end start”改为"end"会使1、2无法从start处开始执行,不能正确的设置CS:IP指向程序的第一条要执行的指令。

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	;将ds指向a数据段
	
	mov ax,b
	mov ss,ax	;将ss指向b数据段
	
	mov ax,c 
	mov es,ax	;es指向c的数据段

	mov bx,0
	mov cx,8

s:	mov al,ds:[bx]
	add al,ss:[bx]
	mov es:[bx],al
	inc bx
	loop s
 
	mov ax,4c00h
	int 21h
	
code ends
	
end start

db 定义字节型数据,所以用al就够了。

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 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 [bx]
	add bx,2
	loop s 
	
	mov ax,4c00h
	int 21h
 
code ends
 
end start

8个字型数据=16个字节,0~F为栈空间,则最开始sp为F+1=10h。

dw定义字型数据,所以程序中dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh为16个字,占32个字节,可以发现,

计算机会将 01 处理为 00 01。

追踪程序:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值