检测点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]
进栈出栈这里其实理解了原理也就没有什么大问题了,也算好理解。今天依旧是一个菜鸟鸭