d
命令在 debug 模式下查看内存内容,代码如下:
1 -d FFF0:0 FF
得到结果:
查得日期:01/01/92
-e FFF0:00F0 01 02 03 04 05 06 07 08 09 -d FFFF:0 F
得到结果:
发现没有发生修改,FFF00H~FFFFFH 对应地址空间为 ROM地址空间,意为只读不写,进行写入操作不会改变内存内容3.实验
,重复写 5 次:
1 -e b800:0 03 04 03 04 03 04 03 04 03 04
得到结果如下,显示在左上角:
用 f 命令,向内存单元批量填写数据,指令如下,意为把内存单元区间b800:0f00~b800:0f9f连续 160 个字节依次重复填充十六进制数据03 04:
1 -f b800:0f00 0f9f 03 04
得到结果:显示在下方:
已知内存单元 00201H ~ 00207H
分别存放数据(如下图所示),00220H ~ 0022fH
用作栈空间。
1 -a 2 mov ax, 20 3 mov ds, ax 4 mov ss, ax 5 mov sp, 30 6 push [0] ; 执行后,寄存器(sp) = _002E___ 7 push [2] ; 执行后,寄存器(sp) = _002C__ 8 push [4] ; 执行后,寄存器(sp) = _002A__ 9 push [6] ; 执行后,寄存器(sp) = _0028__ 10 pop [6] ; 执行后,寄存器(sp) = _002A___ 11 pop [4] ; 执行后,寄存器(sp) = __002C__ 12 pop [2] ; 执行后,寄存器(sp) = __002E__ 13 pop [0] ; 执行后,寄存器(sp) = __0030__
push [6] 指令执行结束后,pop [6] 指令执行结束前,使用 d
命令查看此时栈空间的数据,指令如下:
1 -d 20:20 2f
查看数据变化情况:
pop [0] 指令执行结束后,使用 d 命令查看此时数据空间内的数据是否有变化,指令如下:
1 -d 20:0 7
查看数据变化情况:
把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令查看此时数据空间内的数据是否有变化,指令如下:
1 -d 20:0 7
查看数据变化情况:
先使用f命令,把 00220H ~ 0022fH 区间的 16 个字节内存单元值全部修改为 0,并使用 d 命令查看确认,然后使用 a 命令、r 命令、t 命令写入汇编指令并单步调试。
使用 t 命令单步执行 mov ss, ax 时,不是单步执行完这一条指令就暂停,后面的指令 mov sp, 30 在执行 mov ss, ax 后执行。实验结果:
分析:进行t命令的单步执行操作时发生中断时,使用栈空间存储CS IP,存放cpu关键中断数据。
1 ; task6.asm 2 assume cs:code 3 code segment 4 start: 5 mov cx, 10 6 mov dl, '0' 7 s: mov ah, 2 8 int 21h 9 add dl, 1 10 loop s 11 mov ah, 4ch 12 int 21h 13 code ends 14 end start
使用 masm、link,汇编、链接,得到可执行文件 task6.exe,运行程序,得到结果:
得到结果0123456789,表示从0到9输出(dl循环10次+1操作)。
2.
使用 debug 工具,调试 task6.exe。根据第 4 章所学知识,任何可执行程序在执行时,都有一个引导程序负责将其加载到内存,并将CPU控制权移交给它,也即将 CS IP 指向可执行程序中第一条机器指令。在加载可执行程序时,可执行前面 512 字节是程序段前缀PSP(Program Segment Prefix),用于记录程序一些相关信息。 在debug中,使用
d
命令,查看 task6.exe 的程序段前缀,观察这 256 个字节的内容,证实实验结果:两个字节为 CD 20,实验过程如图:
完成自身代码的自我复制,把 mov ax, 4c00h之前的指令复制到内存 0:200 开始的连续的内存单元,代码如下:
1 assume cs:code 2 code segment 3 mov ax, _cs_ 4 mov ds, ax 5 mov ax, 0020h 6 mov es, ax 7 mov bx, 0 8 mov cx, _17h_ 9 s: mov al, [bx] 10 mov es:[bx], al 11 inc bx 12 loop s 13 mov ax, 4c00h 14 int 21h 15 code ends 16 end
分析:代码段寄存器cs:存放程序的段地址,用寄存器ax将代码段寄存器cs的值赋给数据端寄存器ds;代码到mov ax, 4c00h的长度共23个字节,转换16进制 -> 17h。
在 debug 中调试,使用 g 命令:将程序执行到 loop s 之后、 mov ax, 4c00h 之前:
然后,使用 u 命令对 0:200h 开始的内存单元反汇编:
确认把 task7.asm 中 line3-line12 的代码复制到了目标内存空间。