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

 1. 实验任务1

 DosBox debug使用

  1. -r:查看、改变CPU寄存器的内容
  2. -d:查看内存中的内容
  3. -e:改写内存中的内容
  4. -u:将内存中的机器指令翻译成汇编指令
  5. -t:执行一条机器指令
  6. -a:以汇编指令的格式在内存中写入一条机器指令

 用masm、link将edit的文件保存为.asm格式并编译为.obj格式,最终连接为.exe的可执行文件

 2. 实验任务2

 使用d命令查看生产时期的截图

  

 可以看到生产日期为01/01/92。

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

 采用-e 起始地址 数据 数据...的形式修改生产日期所在单元

 

 用-d查看生产日期所在单元

 

 结论:不能修改生产日期所在的内存单元。

 原因:向地址C000H~FFFFFH的内存单元中写入数据是无效的,因为它们是只读存储器ROM(Read-Only Memory。

 3. 实验任务3

 使用e命令修改内存单元的命令,及,效果截图

 

 使用f命令批量填充内存单元的命令,及,效果截图

 

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

 

 4. 实验任务4

    ·填空

-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:0030H,物理地址是00230H。

 问题2:单步调试到汇编指令push [6]执行结束,pop [6]执行之前,使用d 20:20 2f查看此时栈空间数据,给出实验截图。 

 

 问题3:汇编指令pop [0]执行结束后,使用d命令d 20:0 7查看此时数据空间内的数据是否有变化。给出实验截图。

 

  答:没有变化。

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

 

 答:有变化。这是由于出栈的顺序改变导致的。

 5.实验任务5

 问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?

 答:没有暂停,mov sp,30在执行mov ss,ax时被执行。Debug的T指令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

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

 答:debug使用t指令引发了中断,中断过程使用了当前栈空间存放cpu关键数据。

6. 实验任务6

 源码:

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

 使用masm、link对程序汇编链接过程截图,以及,运行可执行程序task6.exe的运行结果截图

  

  在debug中查看task5.exe的程序段前缀PSP的截图

  

  可以看到前两个字节是CD 20

 7. 实验任务7

 补全后的代码:

assume cs:code
code segment
    mov ax, __cs___
    mov ds, ax
    mov ax, 0020h
    mov es, ax
    mov bx, 0
    mov cx, __23___
s: mov al, [bx]
    mov es:[bx], al
    inc bx
    loop s

    mov ax, 4c00h
    int 21h
code ends
end

 mov ax,cs 是指向要复制的程序段基址

 mov cx,23 是控制循环次数为23次,mov指令用于寄存器间传递数据时为3字节,用于寄存器和立即数之间传递数据时为2字节。mov ax,cs 到 loop s 一共23字节。

 使用-u反汇编,得知loop后的地址为076A:0017

 

 

 使用g命令将程序执行到loop指令之后

 

 

 用u命令反汇编0020:0开始的字节单元内容

 

 

 可以看到复制成功

 实验总结

 1、asm->obj->exe

 2、注意程序的地址写法

 

posted @ 2021-10-23 16:40  HypnosTT  阅读(164)  评论(3)    收藏  举报