实验1 用机器指令和汇编指令编程
一 实验结论
1.教材实验1结论
实验任务(1)
使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器内容的变化。
首先修改cs和ip的值,因为DOS使用的是16进制,所以无需在数字后面加上H
       
    
使用e命令执行书中的前四条指令
mov ax,4e20
add ax,1416
mov bx,2000
add ax,bx
使用u命令查看指令
      
使用t命令逐步执行四条指令
      
用A命令将前四行指令写入内存,首先先改变CS和IP的值
     
输入指令
     
使用t命令执行指令
     
实验任务(2)
将三条指令写入从2000:0开始的内存单元中
首先更改CS和IP的值
     
使用t命令运行指令
每执行完一次三行指令就相当于自身乘以2,因为初值是2,所以这个程序只需要执行七次就可以得到2^8
     
     
2^8=256,100H转化成10进制就是256,一开始寻找256没有找到,还以为是自己哪一步出了问题,后来才意识到这是16进制数。
实验任务(3)
在内存FFF00H~FFFFFH的某几个单元中有一个生产日期,请找到它
使用d命令查看该区域
     
找到的日期为01/01/92
尝试用e命令改变日期,但是没有成功。
     
不能修改成功的原因是:在8086PC机中,FFF00H~FFFFFH为ROM空间,只可读不可写,所以无法修改。
实验任务(4)
向内存从B8100H开始的单元中填写数据
     
     出现的图案为:
     
     出现的图案为:
     
     出现的图案为:
因为地址8000H~9FFFH的8KB空间为显存地址空间,CPU向内存地址为8000H的内存单元中写入数据,这个数据就被写入显存中,然后会被显卡输出到显示器上,所以我们执行这些操作会显示图案。
2.教材实验2结论
实验任务(1)
将程序写入内存,逐条执行,根据执行情况填空。
  
  
  
  
   
 
  
填空内容如下所示:
mov ax,ffff 
mov ds,ax 
mov ax,2200 
mov ss,ax 
mov sp,0100 
mov ax,[0];ax=C0EA 
add ax,[2];ax=C0FC 
mov bx,[4];bx=30F0 
add bx,[6];bx=6021 
push ax;sp= 00FE ;修改的内存单元的地址是2200:00FE 内容为C0FC 
push bx;sp= 00FC ;修改的内存单元的地址是2200:00FC 内容为6021 
pop ax;sp= 00FE ;ax=6021 
pop bx;sp=0100 ;bx=C0FC 
push [4];sp= 00FE ;修改的内存单元的地址是2200:00FE 内容为30F0 
push [6];sp= 00FC ;修改的内存单元的地址是2200:00FC 内容为2F31
先前填空内容与执行内容一致。
实验任务(2)
逐步执行指令,每执行一次t指令就用d指令查看2000:0~2000:f 的值。
    
    
    
    mov ax,2000
    mov ss,ax
    mov sp,10
这三行代码的意思是:
第一行:将数据2000写入寄存器ax中
第二行:设置栈的段地址
第三行:设置栈顶的偏移地址,SP=0010H
初始时栈顶是2000:0010;栈底是2000:000E(经评论区提醒,已经补上)
为什么2000:0~2000:f中的内容会发生改变呢?
因为t指令引发了CPU执行的中断过程。
二 实验总结
1. 用t命令执行指令前需要注意CS:IP是否指向了之后需要执行的命令的地址。
2.8086采用小端存储模式,高地址存储高位,低地址存储低位。
3.不同的计算机系统的内存地址空间的分配情况是不同的,以8086PC机内存地址空间分配为例,A0000~BFFFF为显存地址空间CPU向内存单元地址写入数据,这个数据就会通过显卡显示到屏幕上。
4.debug程序中默认的进制是16进制,所以输入数据不需要加H,我们发现自己的程序不能出现想要的结果时可以看看是不是自己进制没有加以转换。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号