• 第三章检测点


    检测点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]  

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

  • 相关阅读:
    Javascript Promise技术
    什么是CPS
    移动端input file 提示没有应用可执行此操作
    黄聪:wordpress+Windows下安装Memcached服务及安装PHP的Memcached扩展
    黄聪:Windows下安装Memcached服务及安装PHP的Memcached扩展
    用VScode配置Python开发环境
    在VSCode中使用码云(Gitee)进行代码管理
    网页链接分享到微信朋友圈带图标和摘要的完美解决方法
    解决百度统计被刷广告的办法,屏蔽非法广告
    Visual Studio代码PHP Intelephense继续显示不必要的错误
  • 原文地址:https://www.cnblogs.com/skyen/p/9825176.html
Copyright © 2020-2023  润新知