#pragma once
/* 31-包含多个段的程序03
实验
编写、调试具有多个段的程序
这一章的理论内容不是很多,但有些知识却是要在实践中掌握。这个实验,既是一次实践,也是学习内容。必须完成这个实验,才能继续向下学习。
(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
① CPU执行程序,程序返回前,data段中的数据为多少?
依旧如此,不会发生改变.
② CPU执行程序,程序返回前,cs=__、ss=__、ds=__?
cs =code地址 ,ss= stack地址, ds= data 地址,具体的数值不同机器有不同的数值. 完全没有变化过.
③ 设程序加载后,code段的段地址为X,则data段的段地址为__,stack段的段地址为__.
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。
① CPU执行程序,程序返回前,data段中的数据为多少?
数据不会改变.
② CPU执行程序,程序返回前,cs=__、ss=__、ds=__?
cs =code地址 ,ss= stack地址, ds= data 地址,具体的数值不同机器有不同的数值. 完全没有变化过.
③ 设程序加载后,code段的段地址为X,则data段的段地址为,stack段的段地址为
data段的段地址为 X-2,stack段的段地址为X-1. 因为在同一个程序中,这些地址都是连续的. 一个段最小为16 个字节!!!
④对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为_____?
该段实际占有的空间为 16*(N/16+1), N/16 求的是 有多少个16字节的最小段, +1 是避免超出部分,毕竟没有半个段一说. 再 乘 外面的 16, 是将 括号内(N/16+1)得到的最小段数量 乘 16,得
到真实的占用空间.一个段最小为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 ax, 4c00h
int 21h
code ends
data segment
dw 0123H, 0456H
data ends
stack segment
dw 0,0
stack ends
end start
① CPU执行程序,程序返回前,data段中的数据为多少?
数据不会改变.
②CPU执行程序,程序返回前,cs=__、ss=__、ds=__.
cs =code地址 ,ss= stack地址, ds= data 地址,具体的数值不同机器有不同的数值. 完全没有变化过.
③设程序加载后,code段的段地址为X,则data段的段地址为__,stack段的段地址为__.
data段的段地址为 X+3,stack段的段地址为X+4. 因为在同一个程序中,这些地址都是连续的. 一个段最小为16 个字节!!! 而且,因为编译顺序的原因,该两个段声明在code 段后面,所以变成了+.
(4)如果将(1)、(2)、(3)题中的最后一条伪指令"end start”改为"end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
第3个程序.因为 3个程序中开始的时候没有声明 其他段,也就不会被把声明 的代码 错误的当成 执行代码.
(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:
????
code ends
end start
答案:
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
db 0,0,0,0,0,0,0,0
c1 ends
code segment
start:mov ax,c1
mov ds,ax
mov ax,a
mov es,ax
mov bx,0
mov cx,8
s0:mov al,es:[bx]
mov [bx],al
inc bx
loop s0
mov ax,b
mov es,ax
mov bx,0
mov cx,8
s1:mov al,es:[bx]
add [bx],al
inc bx
loop s1
mov ax,4c00H
int 21H
code ends
end start
这道题本身就有错误,c段,应该改为其他名称,因为c 是关键字,不能作为段!!!!!
(6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。
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:
????
code ends
end start
答案:
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,b
mov ss,ax
mov sp,16
mov ax,a
mov ds,ax
mov bx,0
mov cx,8
s:push ds:[bx]
add bx,2
loop s
mov ax,4c00H
int 21H
code ends
end start
*/