实验1 查看CPU和内存,用机器指令和汇编指令编程

Posted yinghuapiaoluo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验1 查看CPU和内存,用机器指令和汇编指令编程相关的知识,希望对你有一定的参考价值。

由于不是特别熟悉dosbox的用法,我逐个按照书上的相关步骤试了一遍

1、用R命令查看、改变CPU寄存器的内容

技术分享图片

先用R命令查看CPU中各个寄存器的内容;

改变AX中的值,从0000变为了1111;

接着用R命令查看一下修改的结果;

再改变了IP的值,从0100变为了0200;

又改变了CS的值,从073F改为FF00;

最后用R命令查看改变过之后各个寄存器的内容。

总结:(1)若要修改某个寄存器的值,需要在R后面加上这个寄存器的名称来进行改变,而且是一个一个改;

           (2)“:”后面加的是修改的值,若不改变值,只是查看,则“:”后不加内容,直接按回车

 

2、用Debug的D命令查看内存中的内容

技术分享图片

输入“d 1000:0”,查看内存10000H处的内容;

接着用“d 1000:9”,查看1000:9处的内容;

技术分享图片

使用D命令列出Debug预设的地址处的内容;

查看1000:0~1000:9中的内容;

用3种不同的段地址和偏移地址查看同一个物理地址中的内容。

总结:(1)在使用“d 段地址:偏移地址”之后,可以从特定的起点开始显示内容

           (2)采用“d 段地址:起始偏移地址 结尾偏移地址”可以指定D命令的查看范围

           (3)D命令一共128个内存单元,右边的点是每个内存单元对应的可显示的ASCΙΙ码,当没有对应的ASCΙΙ码时,就用“.”代替

 

3、用Debug的E命令改写内存中的内容

技术分享图片

先用D命令查看1000:0~1000:f单元的内容;

将内存1000:0~1000:9单元中的内容分别写为0、1、2、3、4、5、6、7、8、9;

再用D命令查看1000:0~1000:f单元的内容;

接着用D命令查看1000:10~1000:19单元的内容;

用E命令一个一个改写内存中的内容;

用D命令查看1000:10~1000:19单元的内容;

用E命令向内存中写入字符;

用D命令查看1000:0~1000:f单元的内容;

总结:(1)内存中的内容可以一个一个修改也可以一次性修改一部分

          (2)一个一个修改内存时用空格键进入下一个修改的对象,若要结束修改就按回车

          (3)用E命令向内存中写入字符,用D命令查看时,会显示字符所对应的ASCΙΙ码值

 

4、用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码

技术分享图片

用E命令向内存中写入字符串;

用D命令查看1000:0~1000:f单元的内容;

用E命令向内存中写入机器码:

机器码      对应的汇编指令

b80100     mov ax,0001

b90200     mov cx,0002

01c8         add  ax,cx

再用D命令查看1000:0~1000:1f单元的内容;

技术分享图片

用U命令将内存单元中的内容翻译为汇编指令显示;

技术分享图片

用E命令向内存中写入机器码;

用R命令查看CPU中寄存器的状态;

用R命令修改CS:IP的值;

再用R命令查看CPU中寄存器的状态;

用T命令来执行写入的指令;

技术分享图片

用T命令继续执行后面的指令。

总结:(1)CS和IP原本指向073F:0100,若要用T命令控制CPU执行写到1000:0的指令,必须先让CS:IP指向1000:0

          (2)用U命令反汇编就可以把机器码转成对应的汇编指令,每条汇编指令都有相对应的机器码

          (3)用T命令执行指令时是一条一条执行的

 

5、用Debug的A命令以汇编指令的形式在内存中写入机器指令

技术分享图片

用A命令向从1000:0开始的内存单元写入几条汇编指令;

用D命令查看A命令的执行结果;

用A命令从一个预设的地址开始输入指令。

总结:(1)用A命令写汇编指令比用E命令写机器指令要方便很多

 

*****实验任务*****

(1)使用Debug,用E命令和A命令以两种方式将指令写入内存

机器码        汇编指令

b8 20 4e    mov ax,4e20h

05 16 14    add ax,1416h

bb 00 20    mov bx,2000h

01 d8         add  ax,bx

89 c3         mov bx,ax

01 d8         add  ax,bx

b8 1a 00    mov ax,001ah

bb 26 00    mov bx,0026h

00 d8         add  al,bl

00 dc         add  ah,bl

00 c7         add  bh,al

b4 00         mov ah,0

00 d8         add  al,bl

04 9c         add al,9ch

 

Part 1:用A命令将指令写入内存,用T命令单步执行

技术分享图片

技术分享图片

中间步骤太多,跳过了一些,下图为最终结果

技术分享图片

 

 Part 2:用E命令将指令写入内存,用G命令多步执行

技术分享图片

可以看到Part1和Part2的最终结果是一样的,说明两种方式都可以用来写入内存,但是汇编指令比机器码更直观

不熟练的情况下最好用T命令单步执行,这样可以清楚地看到自己每一步地执行;熟练了之后可以用G命令多步执行

 

(2)将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方

mov ax,1

add  ax,ax

jmp  2000:0003

技术分享图片

先写入三条指令,接着让CS:IP的值指向2000:0000,然后开始调试

1+1=2,2+2=4,4+4=8,8+8=16,16+16=32,32+32=64....

技术分享图片

一直执行下去就可以算出2的8次方的值,现在是算到16

 

(3)PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它

技术分享图片

找到了日期,发现改变不了

那写内存单元的内容存的是生产日期,我觉得应该是这个寄存器用的是只读的存储器,所以我即使输入了修改值也无法修改

 

(4)向内存从B8100H开始的单元中填写数据,如:

-e B810:0000 01 01 02 02 03 03 04 04

技术分享图片

输入前四行是分别出来一个图标,从左到右;

输入e B810:0000 01 02第一个图标的颜色改变了,后面两个数字控制的是颜色;

输入e B810:0000 02 01第一个图标的颜色变为原来的了,前两个数字是控制形状的;

技术分享图片

改变填写的地址,得到的图案如下所示

技术分享图片

以下是我随便输入的一段数据,每输入一段数据都会产生相应的图标,很有意思

技术分享图片

 

以上是关于实验1 查看CPU和内存,用机器指令和汇编指令编程的主要内容,如果未能解决你的问题,请参考以下文章

实验1 查看CPU和内存,用机器指令和汇编指令编程

实验1 查看CPU和内存,用机器指令和汇编指令编程

实验1 查看CPU和内存用机器指令和汇编指令编程

实验1 查看CPU和内存,用机器指令和汇编指令编程

实验1 查看CPU和内存,用机器指令和汇编指令编程

实验1 查看CPU和内存,用机器指令和汇编指令编程