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

实验结论

实验任务2

 结论:不能修改日期。原因分析:C0000-FFFFF是ROM地址空间,不能向只读存储器中写入数据。

 

实验任务3debug中e命令修改内存单元的命令:

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

效果截图:

 

 debug中f命令批量填充内存单元的命令:

-f b800:0f00 0f9f 03 04

效果截图:

(在显存地址空间中)修改内存单元与内存结果后的效果截图:

 

 

实验任务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:栈顶的逻辑地址0020:0030H      物理地址00230H

问题2:

 问题3:数据空间没有变化

 问题4:数据空间发生了变化

 

实验任务5

问题1:单步执行完这条指令没有暂停,接着执行完 mov sp, 30后暂停。mov sp, 30是在执行mov ss,ax后一起执行的。

问题2:栈空间中存放了下一条指令的地址,应该是栈空间被破坏了。

 

实验任务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中查看task6.exe的程序段前缀PSP截图:

 

实验任务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

第一个空填 cs 的依据:将cs程序段的段地址赋值给ds,ds:0开始就是这个程序代码存放的地址了。

第二个空填 23 的依据:如下图,先随便写一个数,编译链接后,用-u指令反汇编,发现mov ax,4c00h 的偏移地址是0017h,所以前面的代码地址是在0000h-0017h中的,可以得出要循环的次数是23(0017h的十进制)次。

 使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图:

 

 

实验总结

熟悉debug工具的-r,-e,-f,-t,-g,-u的使用。

理解栈顶指针在进栈和出栈的变化。

学会用汇编语言写出一个程序,使用masm,link对程序汇编链接。

posted @ 2021-10-22 18:38  芜湖123  阅读(85)  评论(2编辑  收藏  举报