实验名称:用机器指令和汇编指令编程
目录
代码(1)
一:实验目的
- D命令的深入学习
- 在E、A、U命令中使用段寄存器
二:实验内容、步骤与结果
内容(1):
步骤(1):
1)、用A命令将指令写入内存
2)用t命令逐条执行
结果(1):
代码:
mov ax,[0] ax=C0EA
add ax,[2] ax=COFC
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=COFC
push [4] sp=00FE 2200:00FE,30F0
push [6] sp=00FC, 2200:00FC,2F31
内容(2):
步骤与结果(2):
执行mov ss,ax 时其后边的指令将立即被执行(这是MOV SS,**指令特点)。这也是为什么强调mov ss,ax 后边必须跟上mov sp,10的原因。这么规定是便于控制栈段大小,防止特别是在有子程序调用时出错。至于这两条指令执行后靠近栈顶的10个字节中值立即有了变化,是对定义栈段时部分运行环境变量进行暂存,靠近栈顶的10个字节中的暂存数据分别是SS、IP、 CS 等的值。
为什么会修改栈里面的内容 (栈里面有 IP CS 的内容)
DEBUG是用CPU的陷阱【中断】(每执行一条指令就触发一次这个中断)实现单步中断的。(中断使 CPU硬件自动将SS、ESP、EFLAGS、CS、IP这5个寄存器的数值按照这个顺序压入进程0的内核栈。)
中断会把CS和IP的值弄到栈里。处理中断需要调用另外的程序,调用其他的程序的时候(上下文切换),需要先将寄存器里面的内容压入栈当中。
三:实验过程中出现的问题及解决方法
问题:经常敲错命令
解决方法:多练习
四:实验总结
通过此次实验我学习到Debug相关指令,学会到不同指令和寄存器配合使用,以及一些相关知识点,如:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行;Debug靠一段程序来执行D命令且由CPU来执行这段程序;Debug执行命令时,CPU访问内存单元是从段寄存器中得到内存单元的段地址。