实验5

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

(1)

 汇编语言 实验5

(2)

 汇编语言 实验5

(3)(4)

 汇编语言 实验5

简要调试过程:

 汇编语言 实验5

 汇编语言 实验5

tips:

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

汇编语言 实验5汇编语言 实验5汇编语言 实验5

 

实验任务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环境,用反汇编查看代码:

汇编语言 实验5

汇编语言 实验5

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

 汇编语言 实验5

调试过程:

 汇编语言 实验5

汇编语言 实验5

 

实验任务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环境后,用反汇编查看代码:

汇编语言 实验5

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

 汇编语言 实验5

调试过程:

 汇编语言 实验5

 汇编语言 实验5

 汇编语言 实验5

 

实验5——总结

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

 

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

相关文章:

  • 2021-04-11
  • 2021-06-18
  • 2022-01-04
  • 2021-07-19
  • 2022-12-23
猜你喜欢
  • 2022-01-23
  • 2022-12-23
  • 2021-12-04
  • 2021-11-06
  • 2021-10-30
  • 2021-09-24
  • 2021-05-28
相关资源
相似解决方案