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

2.实验任务2

查看生产日期的d命令:

d fff0:0 ff

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

 修改生产日期所在内存单元的e命令:

e f000:fff0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

修改后,再次查看的d命令:

d f000:fff0

e命令和d命令的截图如下:

 结论:生产日期所在内存单元不能修改,因为内存的FFF00H~FFFFFH为ROM区,内容只能读不能写。

3.实验任务3

修改内存单元的e命令:

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

效果截图:

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

f b800:0f00 0f9f 03 04

效果截图:

 修改内存单元后的效果截图:

 修改数据后的效果截图:

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:逻辑地址:0020:30 物理地址:00230H

问题2:截图如下:

问题3:截图如下,可见数据没有变化:

问题4:截图如下,可见数据有变化:

 5.实验任务5

问题1:使用t命令单步执行mov ss,ax后,不暂停。后面的指令mov sp,30是立即紧接着执行的。这是因为debug单步调试是一种中断,CPU执行期间不响应中断请求。

问题2:黄色下划线为CS和IP寄存器的内容,进行单步调试时,发生中断,使用栈存放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截图:

 查看task6.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,0017h
s:  mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s


    mov ax,4c00h
    int 21h
code ends
end

填写依据:

(1)程序实现mov ax,4c00h之前的指令的自我复制。所以是将ds:[bx]的内容复制到es:[bx]中,应该将程序的段地址cs赋给ds。

(2)cx是循环次数的控制变量,因为本程序实现代码的自我复制,所以循环次数应该是程序段的总长度减去"mov ax,4c00h"和“int 21h”两条指令的长度。先进行反汇编得到cx的初始值,然后减去那两条指令的长度即可得到cx的值。由下图可知:cx=001C,“mov ax 4c00h”和"int 21h"长度为5,可得001C - 5 = 0017 H。

在debug中使用g命令调试,u命令反汇编,确认是否复制成功:

 由图可知,复制成功。

 

 

 

 

 

 

 

posted @ 2021-10-24 10:45  112312132313  阅读(41)  评论(1)    收藏  举报