201983290303吴宇轩实验1


一.

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命令的执行结果。

 
2.(1)

 使用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。

 (3)

 生产日期为92年1月1日。

 使用e命令修改生产日期,修改失败,向地址C0000~FFFFF的内存单元写入数据的操作是无效的,因为这等于改写只读存储器中的内容。

(4)

 

 

 

3.

 使用命令masm 1进行编译,在当前路径下生成目标文件1.obj,并忽略中间文件的生成。

 使用命令“link 1;”进行连接,在当前路径下生成可执行文件1.exe,并在过程中自动忽略中间文件的生成。

 

 

二.
(1)给出使用d命令查看生产时期的截图

 生产日期为92年1月1日。

(2)给出使用e命令修改生产日期所在内存单元的截图,以及,修改后,再次使用d命令查看的截图

 使用e命令修改生产日期,修改失败

(3)结论:能否修改,以及,原因分析

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

 
三.
(1)给出在debug中使用e命令修改内存单元的命令,及,效果截图

 

 输入3出现白色桃形,输入4变为红桃,输入5出现白色梅花,输入6变为浅红色梅花。

(2)给出在debug中使用f命令批量填充内存单元的命令,及,效果截图

 

(3)尝试修改内存单元,或,数据后的效果截图

 

 在底部出现红桃,修改数据为06 08底部会出现黑桃。

 

四.
(1)单步执行,在执行push指令和pop指令时,观察并记录栈顶偏移地址的寄存器sp值的变化情况。

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

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

(2)push [6] 指令执行结束后, pop [6] 指令执行结束前,使用d命令 d 20:20 2f 查看此时栈空间的数据。
(3)pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。

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

(4)如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。

 数据发生了变化。

 
填空:
-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
 
问题1:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后,栈顶的逻辑地址和物理地址分别是?
  逻辑地址:0020:0030
  物理地址:0020*16+0030=00230h
问题2:单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此时栈空间数据,给出实验截图。
问题3:汇编指令 pop [0] 执行结束后, pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。给出实验截图。
问题4:如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7查看此时数据空间内的数据是否有变化。给出实验截图。
 
 
 五.
问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?

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

问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。

第一处黄线区为CS:IP,指向下一条指令;

第二处黄线为002a~002d,在执行push ax之后被推进。

 
六.
(1)程序源码
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。

 
七.
(1)给出补全后的完整源码。说明程序中两个空填写的依据。
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到复制代码长度

 

实验总结

(1)在dos中输入内容时注意细心不要写错;
(2)遇到问题时多翻阅课本;
(3)格外要注意栈的部分。
 
 
 
 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM