码迷,mamicode.com
首页 > 其他好文 > 详细

|实验二 用机器指令和汇编指令编程

时间:2018-10-28 17:59:57      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:出栈   改变   col   最大   代码   就是   程序   通过   变量   

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

 

|实验结论

(一、  预备知识

1.D命令也提供了一种符合CPU机理的格式:“D 段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据。

查看从1000:0开始的内存区间中的内容

 技术分享图片

查看从1000:10~1000:18中的内容

 技术分享图片

查看当前代码段中的指令代码

 技术分享图片

查看当前栈段中的内容

 技术分享图片

2.在E、A、U命令中使用段寄存器。

在从1000:0开始的内存空间中写入数据

 技术分享图片

以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址

 技术分享图片

以汇编指令的形式,向从1000:0开始的内存单元中写入指令

 技术分享图片

3.debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

(二、p71实验任务

1.使用debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H。

mov ax,0021

mov ds,ax

 

mov ax,2200

mov ss,ax

 

mov sp,0100

 

mov ax,[0]

add ax,[2]

mov bx,[4]

add bx,[6]

 

push ax

push bx

pop ax

pop bx

 

push [4]

push [6]

 技术分享图片

实验前预测

mov ax,0021

mov ds,ax

 

mov ax,2200

mov ss,ax

 

mov sp,0100

 

mov ax,[0]              ;ax=3130

add ax,[2]               ;ax=6462

mov bx,[4]              ;bx=3534

add bx,[6]              ;bx=6C6A

 

push ax           ;sp=00fe;修改的内存单元地址是00ff内容为6462

push bx          ;sp=00fc;修改的内存单元地址是00fd内容为6C6A

pop ax            ;sp=00fe;ax=6C6A

pop bx            ;sp=0100;bx=6462

 

push [4]          ;sp=00fe;修改的内存单元地址是00ff内容为3534

push [6]          ;sp=00fc;修改的内存单元地址是00fd内容为3736

 

结果:

 技术分享图片

 技术分享图片

 技术分享图片

mov ax,0021

mov ds,ax

 

mov ax,2200

mov ss,ax

 

mov sp,0100

 

mov ax,[0]              ;ax=3130

add ax,[2]               ;ax=6462

mov bx,[4]              ;bx=3534

add bx,[6]              ;bx=6C6A

 

push ax           ;sp=00fe;修改的内存单元地址是00ff内容为6462

push bx          ;sp=00fc;修改的内存单元地址是00fd内容为6C6A

pop ax            ;sp=00fe;ax=6C6A

pop bx            ;sp=0100;bx=6462

 

push [4]          ;sp=00fe;修改的内存单元地址是00ff内容为3534

push [6]          ;sp=00fc;修改的内存单元地址是00fd内容为3736

分析:实验时的确出现了t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行。

 

2.分析为什么2000:0~2000:f中的内容会发生改变。

 技术分享图片

按照题目要求输入指令并执行

 技术分享图片

 技术分享图片

观察发现这里面有cs值(073f),ip值(0108),ax值(2000)

继续执行指令并在push操作完成后用d命令查询

 技术分享图片

发现寄存器ax中的值成功的被存入栈中

写入pop指令将3366和3123出栈后,再次查询栈中的数据

 技术分享图片

通过查询资料,t命令实际是引发了单步中断,执行中断例程时,CPU会将一些中断例程使用的的寄存器变量自动压栈到栈中。

|总结与体会

       通过对前三章的学习,我对汇编语言有了深入的了解,接触并深入了解了一部分寄存器,从寄存器的角度理解了CPU的工作原理,以及内存访问的一些方法,初次学习并掌握了mov,add,jmp,sub,push,pop指令。

       最大的收获就是,明白了汇编指令是不需要死记硬背的,可以根据自己的理解记忆。当我们对汇编指令的语法有新的想法时,可以直接用debug工具验证,这样也有助于我们加深理解。

|实验二 用机器指令和汇编指令编程

标签:出栈   改变   col   最大   代码   就是   程序   通过   变量   

原文地址:https://www.cnblogs.com/GloriousABC/p/9866070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!