汇编语言 实验5

实验5

实验任务1:编写、运行书中含有多个段的程序,观察实验结果,完成填空

(1)

 

(2)

 

(3)(4)

 

简要调试过程:

 

 

tips:

程序返回后有许多附属的代码段

 

实验任务2:编写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

c0 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
db 8 dup(0)
c0 ends ; 改的时候要成对一起修改

code segment
start:
;修改(不能用栈,因为入栈出栈都是以字数据为一个单元来完成的,而这里是字节型数据)
mov ax,a
mov ds,ax

mov bx,0
mov cx,8h

to:mov ah,0
mov al,[bx]
mov dx,b
mov es,dx
add al,es:[bx]
mov dx,c0
mov es,dx
mov es:[bx],al
add bx,1
loop to
;修改
mov ax,4c00h
int 21h
code ends
end start

 进入debug环境,用反汇编查看代码:

在实现数据相加前后,逻辑段 c 的 8 个字节:

 

调试过程:

 

 

实验任务3:编写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 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,8h

s0:push [bx]
add bx,2h
loop s0

mov ax,4c00h
int 21h
;修改
code ends
end start

进入debug环境后,用反汇编查看代码:

在 push 操作执行前后,查看逻辑段 b 的 8 个字单元:

 

调试过程:

 

 

 

 

实验5——总结

收获:通过这次实验,我懂得了怎么将各个寄存器分段进行存储(也可以在cs段前面定义数据,但是这样没有用分段这么简洁明了),知道了分段存储时段与段之间的相对位置关系,明白了标号和程序入口的重要性,学会了利用栈段做各种数据存储的操作。

 

问题:分段存储时,为什么段与段之间的相对位置不会发生改变呢?这样的相对位置是如何得到的呢?

posted @ 2018-11-25 14:56  无ni不欢  阅读(1364)  评论(0编辑  收藏  举报