实验任务

(1)使用debug,将下面的程序段写入内存,逐条执行。

实验前先修改0021:0-0021:7的值为30 31 32 33 34 35 36 37

 

程序段如下:

mov ax,0021

mov ds,ax

 

mov ax,2000

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]

 

在实验之前,我对各值做了预想,结果如下:

 

d命令查看 从0021:0开始的8个内存单元的内容

再用e命令修改值为 30 31 32 33 34 35 36 37

再次查看从0021:0开始的8个内存单元的内容

 

r命令查看ax,bx,sp最初的值,以做比较

使用a命令,输入代码段

 

T命令单步执行

ax 赋值0021

ds 赋值0021

修改ax值2200

ss赋值2200

ip赋值0100

 

ax赋值3130

ax加上[2]的内容为6462(3130+3332)

bx赋值3536

bx加上[6]的内容6C6A  (3534+3736 )

ax入栈,sp=00FE;修改内存单元的地址是2200:00FE内容为6462

[粗体字为所需填空内容,实际电脑运行出来的值]

 

bx入栈,sp=00FC;修改内存单元的地址是2200:00FC内容为6C6A

ax出栈,sp=00FEax=6C6A

bx出栈,sp=0100bx=6462

内存单元[4]进栈,sp=00FE.;修改内存单元的地址是2200:00FE内容为3534

内存单元[6]进栈,sp=00FC.;修改内存单元的地址是2200:00FC内容为3736

[粗体字为所需填空内容,实际电脑运行出来的值]

 

所有结果与初步猜想一致

 

 

 

 

(2)

a命令,输入图上指令

E命令修改从2000:0开始的16个内容为0

再用d命令查看2000:0开始的16个的内容

R命令查看各寄存器的初始值以做比较

 

t命令,单步执行mov ax,2000,此时ax的值改为2000

t命令,单步执行mov ss,ax,此时ss的值改为2000,2000:0-2000:f的值全部为0,mov sp,10指令在mov ss,ax执行完后紧接着执行了,ip值改为了0010,此时2000:0-2000:f的值为00 00 00 00 00 00 00 20-00 00 08 01 3F 07 A3 01

t命令,单步执行mov ax,3123,ax值改为3123,此时2000:0-2000:f的值为00 00 00 00 00 00 23 31-00 00 0B 01 3F 07 A3 01

 

t命令,单步执行push ax,此时2000:0-2000:f的值为00 00 00 00 23 31 00 00-0C 01 3F 07 A3 01 23 31

t命令,单步执行mov ax,3366,ax值改为3366,此时2000:0-2000:f的值为00 00 00 00 66 33 00 00-0F 01 3F 07 A3 01 23 31

t命令,单步执行push ax,此时2000:0-2000:f的值为00 00 66 33 00 00 10 01- 3F 07 A3 01 66 33 23 31

 

刚开始栈顶地址为2000:0010

push a后,栈顶为2000:000E

再次push a后,栈顶为2000:000C

 

2000:0-2000:f的内容变化如下:

00 00 00 00 00 00 00 20-00 00 08 01 3F 07 A3 01

00 00 00 00 00 00 23 31-00 00 0B 01 3F 07 A3 01

00 00 00 00 23 31 00 00-0C 01 3F 07 A3 01 23 31

00 00 00 00 66 33 00 00-0F 01 3F 07 A3 01 23 31

00 00 66 33 00 00 10 01- 3F 07 A3 01 66 33 23 31

因为在debug中使用了t命令,导致2000:0-2000:f的内容发生了变化

 

 

 

总结与体会

1.在汇编中,可以用ds来存放段地址,例:

  d 1000:0命令查看1000:0开始的内容,可以写成d ds:0

  e 1000:0 11 22 33 44 55 66可以写成e ds:0 11 22 33 44 55 66

  a ds:0命令则表示向从1000:0开始的内存单元写入指令

  [D\E\A\U这些可以带有内存单元地址的命令中,可以用段寄存器表示内存单元的段地址]

2.mov ss,ax\ mov ss,bx\ mov ss,[0]\ pop ss(修改栈段寄存器ss的指令)等指令在用t命令单步调试的时候,会直接执行其下一条指令