实验1 用机器指令和汇编指令编程

教材实验1结论:

(1)

首先用e命令用机器码写入指令,然后用u命令进行反汇编,查看内存中的命令是否如我们所希望的那样,然后用t命令进行单步运行,这里需要注意的是使用t命令时一定要小心的CS:IP的指向,这里我是直接将0:200赋值上去。

 

 

 

 运行的结果中:

1)第一步中改变了ax的值,还有IP进行自动的增加;

2)第二步中将ax的值加上1416H,还有IP进行自动的增加;

3)第三步中改变了bx的值,还有IP增加;

4)第四步将ax与bx中的值相加,并且赋值给ax,IP增加;

 

用a命令使用汇编指令的格式写入,并且用t命令进行单步运行。

 

(2)

下图是使用a命令在指定的区域2000:0进行命令的写入以及使用t命令进行单步运行的开始部分,这里也需要注意CS:IP值的指向。

下图为计算2^8的最终结果

 只需要不断的用t单步执行,第二行和第三行的命令形成了一个循环,这个循环每循环一次就将ax的值乘上2,因此最终需要循环上8次即可计算2^8,

这里的结果显示为0100H,转化为十进制即为256。

 

(3)

首先在题目要求的FFF00H~FFFFFH中使用d命令进行查询,查询到生产日期为1992年1月1日。

然后我试图用e命令对其进行修改,但并没有成功修改,因为这个操作类似于改写只读存储器的数据。

 

(4)

按照题目要求用e指令向指定的位置写入数据,发现出现了彩色的符号,这是因为这是向显存中写入数据,写入的数据会直接显示在显示器上。

 这里我更换写入的数据会显示出不同的彩色符号

 

 

教材实验2结论:

(1)

用e命令修改内存单元0022:0~0022:f的数据,并用d命令查看修改后是否正确。

 使用a命令进行命令的输入

下面是每一行指令的单步调试,其中mov ss, ax指令会带动下面的mov sp, 0100一起执行

 

 

 下面是填空的结果,与设想的一致

mov ax, 0022
mov ds, ax

mov ax, 2200
mov ss, ax

mov sp, 0100

mov ax, [0]    ax=5150
mov ax, [2]    ax=A4A2
mov ax, [4]    bx=5554
mov ax, [6]    bx=ACAA

push ax    sp=00FE; 修改的内存单元的地址是2200:00FE内容为A4A2
push bx    sp=00FC; 修改的内存单元的地址是2200:00FC内容为ACAA
pop ax      sp=00FE; ax=ACAA
pop bx      sp=0100; ax=A4A2

push [4]    sp=00FE; 修改的内存单元的地址是2200:00FE内容为5554
push [6]    sp=00FC; 修改的内存单元的地址是2200:00FC内容为5756

 

(2)

用a命令输入题目中的指令

使用e命令修改指定区域的值,并用d命令查看

下面是单步调试每一条指令,并且用d命令来查看2000:0~2000:f之间的值的变化情况

 

 

 

问题一:前三行指令中,mov ax, 2000是将ax赋值为2000,将ss赋值为ax,(利用ax中转对ss进行赋值),最后将sp赋值为10。

mov sp, 10是初始化栈顶偏移地址为10,初始的栈顶和栈底都是2000:10

问题二:单步调试中发现在未对2000:0~2000:f进行操作的时候,其中的值却发生了变化。我认为和执行mov ss, ax时带动mov sp, 10一起执行有关,可能会导致一些数据存储到该段内存空间中。

 

posted @ 2020-10-11 11:32  gank007  阅读(173)  评论(3)    收藏  举报