一.
1.(1)进入Debug
在配置好的dosbox中输入debug命令进入debug模式。
(2)用R命令查看、改变CPU寄存器内容
输入R命令,查看CPU中的内容。
可以使用r+ax来修改AX中的值,再用r命令查看修改后的结果。
CS:IP一开始指向073f:0100,用r命令将IP修改为200,CS修改为ff00,CS:IP命令指向ff00:0200。
(3)用D命令查看内存中内容
用d命令查看内存1000:0中的内容。
用d命令直接查看,会列出Debug预设的地址处的内容,在使用“d 段地址:偏移地址”之后,再使用d命令,可列出后续内容。
采用“d 段地址:起始偏移地址 结尾偏移地址”可以指定d命令的查看范围。
(4)用E命令改写内存中的内容
使用e命令将内存1000:0~1000:9单元中的内容改为0~9。
可以用e命令以提问的方式逐个修改从某一地址开始的内存单元中的内容。
用e命令可向内存中写入数值和字符。
(5)用E命令向内存中写入1机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码
用e命令将机器码写入内存,用u命令将内容翻译为汇编指令。
用e命令向1000:0开始的内存单元中写入8个字节的机器码。再用r查看到CS=ff00H,IP=0200H,指向内存ff00:0200。用r命令修改CS和IP的值,让CS:IP指向1000:0。使用t命令执行写入到1000:0的命令
(move ax,0001),CPU中AX改写为0001,IP+3,CS:IP指向下一条命令。
再输入t继续执行下一条命令。
(6)用debug的A命令以汇编指令的形式在内存中写入机指令
用a命令,从1000:0开始的内存单元中写入指令,用d查看a命令的执行结果。

使用a命令将汇编指令写入内存1000:0。
r命令使CS:IP指向1000:0。
用t命令执行指令,每执行一条指令后,CS:IP就指向下一条指令。
(2)

使用a命令输入汇编指令,使CS:IP指向2000:0。

执行前两条指令,算出2的1次方。
再执行jmp 2000:0003和add ax,ax计算出2的2次方。
结果算的AX=0100H,2的8次方为256。

生产日期为92年1月1日。
使用e命令修改生产日期,修改失败,向地址C0000~FFFFF的内存单元写入数据的操作是无效的,因为这等于改写只读存储器中的内容。
(4)
3.
使用命令masm 1进行编译,在当前路径下生成目标文件1.obj,并忽略中间文件的生成。
使用命令“link 1;”进行连接,在当前路径下生成可执行文件1.exe,并在过程中自动忽略中间文件的生成。


生产日期为92年1月1日。
(2)给出使用e命令修改生产日期所在内存单元的截图,以及,修改后,再次使用d命令查看的截图
使用e命令修改生产日期,修改失败
(3)结论:能否修改,以及,原因分析
向地址C0000~FFFFF的内存单元写入数据的操作是无效的,因为这等于改写只读存储器中的内容。

输入3出现白色桃形,输入4变为红桃,输入5出现白色梅花,输入6变为浅红色梅花。
(2)给出在debug中使用f命令批量填充内存单元的命令,及,效果截图
(3)尝试修改内存单元,或,数据后的效果截图
在底部出现红桃,修改数据为06 08底部会出现黑桃。


执行push指令时,sp值减2;
执行pop指令时,sp值加2。


数据空间内的数据没有变化。

数据发生了变化。




执行完mov ss,ax时并不是单步执行这一条指令,同时也执行了mov sp,30。

第一处黄线区为CS:IP,指向下一条指令;
第二处黄线为002a~002d,在执行push ax之后被推进。
assume cs:code code segment start: mov cx, 10 mov dl, '0' s: mov ah, 2 int 21h add dl, 1 loop s mov ah, 4ch int 21h code ends end start
(2)使用masm、link对程序汇编链接过程截图,以及,运行可执行程序task5.exe的运行结果截图
编写源码保存为task6.asm
编译源程序
连接得到task6.exe
运行task6.exe
(3)在debug中查看task5.exe的程序段前缀PSP的截图。

前两个字节是CD 20。
assume cs:code code segment mov ax,cs mov ds,ax ;程序指令的起始地址由CS:IP指定 mov ax,0020h mov es,ax mov bx,0 mov cx,17h ;cx的值为程序返回时的偏移地址,要复制指令“mov ax,4c00h”的指令,就要减去“ int 21h”(2字节),“mov ax,4c00h”(3字节),共5个字节,cx=001c, 减去5是0017 s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
(2)在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令对0:200开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间。给出使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图。
g命令运行到指定点
u命令反汇编0:200到复制代码长度
实验总结