实验任务
(1)
(2)
(3)
(4)
若将最后一条指令”end start“改为”end“,(3)中的程序仍然可以正常执行。
原因:如果不指明程序的入口,程序的cs:ip值没有被设置为指向该入口,就会以程序段的第一条指令为默认入口了,然后程序会在end处结束,无法运行到代码段。
(5)
①实验代码
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
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
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,c1
mov es,ax
mov bx,0
mov cx,8
db 8 dup(0)
c1 ends ; 改的时候要成对一起修改
code segment
start:
mov ax,c1
mov es,ax
mov bx,0
mov cx,8
s:
mov ax,a
mov ds,ax
mov dl,[bx]
mov es:[bx],dl
mov ax,b
mov ds,ax
mov dl,[bx]
add es:[bx],dl
inc bx
loop s
mov ax,a
mov ds,ax
mov dl,[bx]
mov es:[bx],dl
mov ax,b
mov ds,ax
mov dl,[bx]
add es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
int 21h
code ends
end start
②在实现数据相加前,逻辑段c的8个字节
③ 执行完实现加运算的代码后,逻辑段c的8个字节
④验证是否完成正确的数据相加
c1中数据符合a的数据与b的数据加和。
(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
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
dw 8 dup(0)
b ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov cx,8h
mov bx,0
mov sp,10h
s:
push[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov cx,8h
mov bx,0
mov sp,10h
s:
push[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
②查看逻辑段b的8个字单元信息截图
③执行 push操作,然后再次查看逻辑段b的8个子单元信息
④:对比②和③
经验证,已成功实现逆序存储。
总结与体会
通过本次实验,我掌握了如何来编写、调试具有多个段的一个程序,
具有多个段的程序相对于仅具有一个段的程序而言,能把数据,代码和栈段分开存储,不仅提高了程序整体的存储容量,还使程序显得井然有条,通过对多个段的定义,使我们对数据的操作更方便清晰了。
大致清楚了为具有多个段的一个程序分配储存空间的方式,以16个字节为倍数,将其连续地分配在一个储存空间中。