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

实验1

使用e命令将内存单元0021:0 ~0021:7连续 8个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H,及修改后查看是否正确写入

使用debug将下面的程序写入内存

利用t命令单步调试:

(1)执行mov ax,0021

(2)执行mov ds,ax

(3)执行mov ax,2200

(4)执行mov ss,ax

注意⚠️这里跳过了步骤mov sp,0100

原因:debug的t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行。

(4)执行mov ax,[0]

ax=3130

(5)执行add ax,[2]

ax=6462

(6)执行mov bx,[4]

bx=3534

(7)执行add bx,[6]

bx=6c6a

(8)执行push ax

sp=00fe;此时内存单元为2200:00fe;内容为6464

(9)执行push bx

sp=00fc;此时内存单元为2200:00fc;内容为6c6a

(10)执行pop ax

sp=00fe;ax=6c6a

(11)执行pop bx

 

sp=0100;bx=6462

(12)执行 push [4]

sp=00fe;此时的内存单元为2200:00fe;显示的内容为3534

(13)执行 push[6]

sp=00fc;此时的内存单元为2200:00fc;内容为3736.

填写结果:

实验2

(1)先按要求输入指令

(2)用e命令修改值以及用d命令查看

(3)单步调试

执行mov ax,2000 没有变化

执行mov ss,ax 发生了变化,通过观察此时2000:0006存放的是ax的值。2000:000a存放的是ip的值。2000:000c存放的是cs的值。

执行mov ax,3123 通过观察此时2000:0006存放的是ax的值,2000:000a存放的是ip的值。2000:000c存放的是cs的值

执行push,ax ,可以观察到3123被压入栈底,同时2000:0004的起始地址存放了ax的值。2000:0008存放的是ip的值。2000:000a存放的是cs的值。

执行mov ax,3366,可以观察到2000:0004的起始地址存放了ax的值。2000:0008存放的是ip的值。2000:000a存放的是cs的值。

执行push ax,可以观察到3366入栈,同时2000:0002的起始地址存放了ax的值。 2000:0006存放的是ip的值。2000:0008存放的是cs的值。

mov sp,10意味着栈空时,ss:sp指向栈的最底部单元下面的单元。

初始时栈底为2000:0010,栈顶为2000:0010

通过查阅资料了解到:这么规定是便于控制栈段大小,防止特别是在有子程序调用时出错。至于这两条指令执行后靠近栈顶的10个字节中值立即有了变化,是对定义栈段时部分运行环境变量进行暂存,靠近栈顶的10个字节中的暂存数据分别是SS、IP、 CS 等的值。

 

我的总结与体会

虽然这次实验不多,但是一步一步的调试以及分析花费了大量的时间。通过自己一步一步的调试,让我明白了数据变化背后的原理。通过这次实验,熟悉了字的传送以及入栈出栈的过程。在自己的操作中发现t命令在执行修改寄存器ss的指令时跳过了步骤mov sp,0100。通过查书发现debug的t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行。通过实验二观察出了单元值的变化和cs,ip,ss有关,通过查资料也了解了一些,但有待进一步探索。

posted @ 2018-10-27 21:18  Jadeite  阅读(489)  评论(2编辑  收藏  举报