|实验二 用机器指令和汇编指令编程
实验二 用机器指令和汇编指令编程
|实验结论
(一、 预备知识
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工具验证,这样也有助于我们加深理解。