现在是学习汇编语言的第八周,要完成实验任务二和三,因为我的一时疏忽一开始没有加入教学班,所以实验任务一虽然写了随便但是并没有提交记录……
不过这也算给自己一个教训,刚开始学习并没有很重视,但是看到了同班同学写的博客感觉触动挺大,很多人已经不仅仅局限于课堂上的学习知识了,自己在学习上也应该更加主动了
实验任务二
实验任务(1)
按实验结果填空:
mov ax,0021
mov ds,ax
mov ax,2000
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;修改的内存单元的地址是2200:00FE内容为3130
push bx ;sp=00FC;修改的内存单元的地址是2200:00FC内容为6462
pop ax ;sp=00FC;ax=6122
pop bx ;sp=00FC;bx=5CCA
push [4] ;sp=00FC;修改的内存单元的地址是:00FE内容为3130
push [6] ;sp=00FC;修改的内存单元的地址是:00FC内容为6264
为了方便输入先用R CS:IP指令将CS:IP指向修改为指向1000:0000,再用e命令输入e 0021:0 30 31 32 33 34 35 36 37
用D命令查看内存中的内容,发现已经修改成功
再用A命令输入要求的指令,用T命令单步执行并观察每一步指令的执行情况:
可以看到,虽然有15条指令但是只执行了14步,可以看到再执行完 mov ss,ax后,寄存器SP的值也被更改成了 0100,而这一步本应该是下一步要执行的命令。T指令都是只执行一步的。
关于这点书上给的是:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。日后的课程会进一步解释“中断机制”,今天先写在这里。
实验(2)
用Debug工具使用A命令写入指令并如实验要求执行:
然后使用 e 命令修改 0021:0~0021:f 数据,及修改后查看是否正确写入的操 作 使用 a 命令输入的 p74中的指令,用T命令单步执行并且每次执行后查看2000:f中的变化:
前三段指令的功能:
2000进入AX寄存器,
AX中的值赋值给SS,
SP的值改为0010。
变化的原因为:
因为T命令是单步中断,而CPU执行中断时会保留现场,即将标志寄存器CS,IP等入栈,而实验中栈的地址正好是要查询的内存地址,但是里面的值会因为保留现场而被更改。
2.总结体会
通过观察T命令的单步执行过程,对出栈入栈有了更深入的理解,同时初步了解到了中断机制。