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

1.教材实验1:

  实验任务(1):

   使用e 命令写入程序,然后使用u命令可以查看到指令成功写入,然后偏移地址为073b开始则是其它本来就有的无关指令。

   

 

   然后同样的测试使用a命令在073b之后继续写入指令,并且使用u命令查看:

   

    使用t命令单步执行调试,首先修改CS:IP指向存储的程序:

    

    然后开始执行,可以看到指令依次正常执行:

    

  实验任务(2):

   写入指令:

  

 

 执行:

 可以观察到在执行完add ax,ax命令后,实验jmp命令跳转会使得程序重复执行ADD命令:

 所以要得到2的8次方,需要共T命令16次(需要注意debug默认是16进制,应该是T 10)

 

 最后得到AX为0100H即256。

实验任务(3):

 存储生产日期可以看到是92年1月1日。

尝试修改:

修改失败:

 

 实验任务(4):

 

 

 可以观察到显示器显示出图案:

修改数据,发现图案形状颜色样式发生改变:

 

 修改地址,可以发现原图案后方出现一个新图案,同时将B810:0000的数据置0可以发现上一个图案消失:

 

 

2.教材实验2:

 实验任务(1):

  ①使用e命令修改0022:0~0022:f的值,并查看:

 

 

 

 ②使用a命令输入指令

 

 

 ③单步执行:

执行前寄存器状态:

开始执行:

 

 

 

 

 

④填空

mov ax,[0]    ax=3221

add ax,[2]     ax=6664

mov bx,[4]    bx=3635

add bx,[6]     bx=6E6C

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

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

pop ax       sp=00FE;  ax=6E6C

pop bx       sp=0100;    bx=6664

push [4]        sp=00FE;  修改的内存单元的地址是 2200:00FE,  内容为 3635

push [6]        sp=00FC;  修改的内存单元的地址是 2200:00FC,  内容为 3837

与实验截图对照后结果一致

实验任务(2):

①a命令输入指令,e命令修改2000:0~2000:f的值并用d命令查看修改结果:

 ②单步执行存储好的指令并使用d命令查看每次执行后2000:0~2000:f的值的变化

 

 

思考原因:

Ⅰ 前三行指令功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?

    mov ax,2000 将2000H传入ax

    mov ss,ax      将ax中存储的2000H传入ss中,作为栈基准地址

    mov sp,10      将栈顶的偏移地址设为0010H

    初始的栈顶为2000:0010H,栈底是2000:000EH

Ⅱ 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。

   在执行完mov ss,ax时将2000H传入到了ss中,会发现2000:0008H存储的值变成了2000H,说明2000:0008H对应的地址在执行t时很可能存储了ss的值,同样的观察20后面的几个数值:

0108H显然是IP的值,而073FH和01A3同样应该是存储某个寄存器中的值。

 

   总结:有几个注意点,debug过程中输入的数值默认都是16进制,以及在执行指令时假如直接t执行不加地址参数的话一定得记得修改对应的cs:ip。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 
posted @ 2020-10-18 20:42  斐然曰  阅读(75)  评论(4)    收藏  举报