实验1 8086汇编指令编码和调试

Posted on 2021-10-21 23:50  小陶要努力  阅读(72)  评论(0编辑  收藏  举报

TASK2

-d fff0:0 ff

 

 

 

-e 00f5 31 32 2f 31 32 2f 39 32
-d fff0:0 ff

 

 

 修改后日期并没有更改

向地址C0000-FFFFF的内存单元写入数据的操作是无效的,因为这等于改写只读存储器中的内容

TASK3

-e b800:0 03 04 03 04 03 04 03 04 03 04

 

 

 

-f b800:0f00 0f9f 03 04

 

 

 修改b800:0以及之后的内存单元

-e b800:0 04 05 04 05 04 05 04 05 04 05

 

可以发现红色的爱心变成了紫色的菱形

 

TASK4

 

 

-a
mov ax, 20 
mov ds, ax 
mov ss, ax 
mov sp, 30 
push [0] ; 执行后,寄存器(sp) = 002E 
push [2] ; 执行后,寄存器(sp) = 002C 
push [4] ; 执行后,寄存器(sp) = 002A 
push [6] ; 执行后,寄存器(sp) = 0028 
pop [6] ; 执行后,寄存器(sp) = 002A
pop [4] ; 执行后,寄存器(sp) = 002C 
pop [2] ; 执行后,寄存器(sp) = 002E 
pop [0] ; 执行后,寄存器(sp) = 0030

 

 

 

 

指令 mov ss, ax 和 mov sp, 30 执行后,
栈顶的逻辑地址是0020:30 物理地址是00230
 

 

汇编指令执行完之后,数据空间内的数据没有发生变化

在改变顺序之后,顺序发生了改变,因为出栈的顺序发生了改变

 

 

 

TASK5

 

 这里涉及到了中断机制

原本在第二次t命令之后,cs:ip指向的命令是mov ax,2010,而不是原本的mov sp,30。ss的内容送入之后,sp的内容也立刻被送入

 

 

 push指令会改变前8个存储单元

push指令执行之前,第六第七个字与指令的存储位置相同,push指令执行之后,第七个字与ax相同

 

TASK6

 

 

 

 

 

 

masm

 

link

 

 运行结果

 

 最终结果输出了0123456789

 

 

 程序的前两个字节是CD 和20

 

TASK7

为了实现程序的复制,推测ds指向的是前程序的地址,所以ds就是cs

cx是循环次数,循环的次数就是程序的长度,可以看出程序的长度为23

运用g命令和u命令之后确定代码复制到了目标空间

 

 

 实验总结

 经过这次实验我更加清楚了指令的使用方法,通过自己编译的过程注意到了平时自己容易忽视但又容易错的地方。通过自己的调试更加了解了整个代码的执行过程。

同时也更加理解了栈空间,掌握了栈空间的使用方式。

 

 

 

 


 

 

Copyright © 2024 小陶要努力
Powered by .NET 9.0 on Kubernetes