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

四、实验结论

2.实验任务2

(1)使用d命令查看生产日期

-d FFF0:0 FF

日期为01/01/92

(2)使用e命令修改内存中的内容

-e FFF0:00F0 1 2 3 4 5 6 7 8 9 

使用d命令再次查看生产日期对应的内存单元

-d FFFF:0 F

 

结论:不能修改,这段地址空间实际是ROM的地址空间,对应的单元实际上是ROM存储器的一个存储单元,对其进行写入数据的操作对应内存单元内容不会改变。

3.实验任务3

(1)用e命令向内存单元b800:0重复写入数据03 04

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

(2)用f命令批量填充03 04数据到内存单元b800:0f00开始的单元

-f b800:0f00 0f9f 03 04

(3)修改内存单元的情况

 

 4.实验任务4

(1)调试观察结果

-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__

 (2)问题

问题一:栈顶的逻辑地址为0020:30  物理地址为00230

问题二:

问题三:

 

问题四:

 

5.实验任务5

问题一:单步执行mov ss,ax时没有发生暂停,下一条指令mov sp,30也紧接着执行了。

问题二:

 

其中黄色下划线的数据为CS IP的数值,因为当进行t命令的单步执行操作时,发生中断,使用栈空间存放cpu关键数据。

 

 6.实验任务6

 (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)汇编、链接、运行过程

 

 (3)在debug中查看程序段前缀PSP

 

7.实验任务7

(1)程序源码

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

    mov ax, 4c00h
    int 21h
code ends
end

cs中存放程序的段地址,所以利用寄存器ax将cs的值赋给ds;

mov指令用于寄存器间传递数据时为3个字节,用于寄存器和立即数之间传递数据时为2个字节。上述程序共23个字节,16进制为17。

(2)先使用u命令对程序反汇编,查看到loop指令的内存地址为076A:0015

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

-g 0017

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

-u 0020:0 16

 已经实现把task7.asm中line3-line12的代码复制到了目标内存0:200.

posted @ 2021-10-23 15:44  虾仁不眨眼~  阅读(184)  评论(3)    收藏  举报