汇编语言 实验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段前面定义数据,但是这样没有用分段这么简洁明了),知道了分段存储时段与段之间的相对位置关系,明白了标号和程序入口的重要性,学会了利用栈段做各种数据存储的操作。
问题:分段存储时,为什么段与段之间的相对位置不会发生改变呢?这样的相对位置是如何得到的呢?