椿庭

导航

第三章检测点

检测点3.1

(1) 在DEBUG中,用 “D 0:0 lf” 查看内存,结果如下:

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60

0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值。

mov ax,1

mov ds,ax

mov ax,[0000] ax= 2662H

mov bx,[0001]        bx= E626H

mov ax,bx             ax= E626H

mov ax,[0000]       ax= 2662H

mov bx,[0002]       bx= D6E6H

add ax,bx              ax= FD48H

add ax,[0004]        ax= 2C14H

mov ax,0               ax= 0

mov al,[0002]        ax= 00e6H

mov bx,0               bx= 0

mov bl,[000c]        bx= 0026H

add al,bl               ax= 000CH

 

     emmm,这是道看起来很简单的题,但本人进来看了题目后,最开始的疑问是,开始的 mov ax,1  mov ds,ax 明显是把ds寄存器改为0001,那后一条命令操作的代码段地址应该是0001:0000 - 0001:ffff,但题目一开始却只给出0000:0000 - 0000:0010的内存单元!开始我怀疑题目是不是出错了~

 

后来才想起书前面讲过,所位的段地址和偏移地址,并不是内存中真实存在分段,分段只是cpu去分,为了8086数据传送​的设计而已。真实的内存中的数据,还是要以物理地址为准,OK,那么:

题目开始mov ax,1  mov ds,ax 得到的数据段地址起始为:ds=0001,所以在逻辑上,之后的内存访问都会在0001:0000-0001:ffff中进行​​,可以算一下题目中给的:

0000:0010物理地址为:0000*10+0010= 00010

而此时ds=0001,0001:0000​的物理地址为:0001*10 + 0000 = 00010

可以看到,这二个数据的物理地址是相同的,也就是说,题目最开始其实就已经给出了0001:0000这个内存单元中的真实数据了,就等于0000:0010,后面的也就容易了,只需要注意al,bl寄存器数据溢出。​

总结:有时候真是容易忽视或忘记一些细节问题,虽然别人提起你马上明白,但不自己练习还真不是那么容易记在心里!

 

(2)内存中的情况如图所示:


各寄存器的初始值:CS = 2000H , IP = 0 , DS = 1000H , BX = 0;

1.写出CPU执行的指令序列(用汇编指令写出)

2.写出CPU执行每条指令后,CS、IP和相关寄存器中的数值.

3.再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

 

3:数据和程序没有多大区别。想要确定具体的职务可以看他们被送入了什么样的寄存器,不同的寄存器赋予了他不同的涵意。

 

检测点3.2

(1)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。

 

mov ax,1000H 

mov ds,ax 

( mov ax,2000H ) 

( mov ss,ax )    

( mov sp,10h )   

push [0] 

push [2] 

push [4] 

push [6] 

push [8] 

push [A] 

push [C] 

push [E] 

 

 

(2)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。 

 

mov ax,2000H 

mov ds,ax 

( mov ax,1000H )

( mov ss,ax )

( mov sp,0 )    

pop [e] 

pop [c] 

pop [a] 

pop [8] 

pop [6] 

pop [4] 

pop [2] 

pop [0]  

 

  进栈出栈这里其实理解了原理也就没有什么大问题了,也算好理解。今天依旧是一个菜鸟鸭

 

posted on 2018-10-21 15:27  椿庭  阅读(395)  评论(0编辑  收藏  举报